/ Hex Artifact Content
Login

Artifact 5078ca7de4fd5ba4535bd17fe44d5b56c2d3294c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
02e0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74   new virtual dat
02f0: 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f  abase engine..*/
0300: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64  .Vdbe *sqlite3Vd
0310: 62 65 43 72 65 61 74 65 28 50 61 72 73 65 20 2a  beCreate(Parse *
0320: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
0330: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0340: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  >db;.  Vdbe *p;.
0350: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
0360: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
0370: 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 20  zeof(Vdbe) );.  
0380: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
0390: 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  n 0;.  p->db = d
03a0: 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64  b;.  if( db->pVd
03b0: 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56  be ){.    db->pV
03c0: 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  dbe->pPrev = p;.
03d0: 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d    }.  p->pNext =
03e0: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 2d   db->pVdbe;.  p-
03f0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 62  >pPrev = 0;.  db
0400: 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70  ->pVdbe = p;.  p
0410: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
0420: 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e  AGIC_INIT;.  p->
0430: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
0440: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0450: 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->aLabel==0 );.
0460: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
0470: 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a 20  ->nLabel==0 );. 
0480: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0490: 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  >nOpAlloc==0 );.
04a0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
04b0: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
04c0: 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72  e SQL string for
04d0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
04e0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
04f0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c  qlite3VdbeSetSql
0500: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
0510: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
0520: 69 6e 74 20 69 73 50 72 65 70 61 72 65 56 32 29  int isPrepareV2)
0530: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 50 72  {.  assert( isPr
0540: 65 70 61 72 65 56 32 3d 3d 31 20 7c 7c 20 69 73  epareV2==1 || is
0550: 50 72 65 70 61 72 65 56 32 3d 3d 30 20 29 3b 0a  PrepareV2==0 );.
0560: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
0570: 75 72 6e 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  urn;.#if defined
0580: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
0590: 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
05a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
05b0: 4c 4c 4f 47 29 0a 20 20 69 66 28 20 21 69 73 50  LLOG).  if( !isP
05c0: 72 65 70 61 72 65 56 32 20 29 20 72 65 74 75 72  repareV2 ) retur
05d0: 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  n;.#endif.  asse
05e0: 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29  rt( p->zSql==0 )
05f0: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71  ;.  p->zSql = sq
0600: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
0610: 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70  ->db, z, n);.  p
0620: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d 20  ->isPrepareV2 = 
0630: 28 75 38 29 69 73 50 72 65 70 61 72 65 56 32 3b  (u8)isPrepareV2;
0640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0650: 20 74 68 65 20 53 51 4c 20 61 73 73 6f 63 69 61   the SQL associa
0660: 74 65 64 20 77 69 74 68 20 61 20 70 72 65 70 61  ted with a prepa
0670: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f  red statement.*/
0680: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
0690: 69 74 65 33 5f 73 71 6c 28 73 71 6c 69 74 65 33  ite3_sql(sqlite3
06a0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
06b0: 20 56 64 62 65 20 2a 70 20 3d 20 28 56 64 62 65   Vdbe *p = (Vdbe
06c0: 20 2a 29 70 53 74 6d 74 3b 0a 20 20 72 65 74 75   *)pStmt;.  retu
06d0: 72 6e 20 28 70 20 26 26 20 70 2d 3e 69 73 50 72  rn (p && p->isPr
06e0: 65 70 61 72 65 56 32 29 20 3f 20 70 2d 3e 7a 53  epareV2) ? p->zS
06f0: 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ql : 0;.}../*.**
0700: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0710: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0720: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0730: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0740: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
0750: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
0760: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
0770: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 74   char *zTmp;.  t
0780: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0790: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
07a0: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
07b0: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
07c0: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
07d0: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
07e0: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
07f0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
0800: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
0810: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
0820: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
0830: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
0840: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
0850: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
0860: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61  p;.  pB->isPrepa
0870: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65  reV2 = pA->isPre
0880: 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pareV2;.}../*.**
0890: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
08a0: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
08b0: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
08c0: 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72 20  t one op larger 
08d0: 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e  than .** it was.
08e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74  .**.** If an out
08f0: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72  -of-memory error
0900: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
0910: 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79  sizing the array
0920: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  , return.** SQLI
0930: 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69  TE_NOMEM. In thi
0940: 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20  s case Vdbe.aOp 
0950: 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f  and Vdbe.nOpAllo
0960: 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63  c remain .** unc
0970: 68 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20  hanged (this is 
0980: 73 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f  so that any opco
0990: 64 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f  des already allo
09a0: 63 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a  cated can be .**
09b0: 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c   correctly deall
09c0: 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
09d0: 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  h the rest of th
09e0: 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74  e Vdbe)..*/.stat
09f0: 69 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72  ic int growOpArr
0a00: 61 79 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 56  ay(Vdbe *v){.  V
0a10: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0a20: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0a30: 72 73 65 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20  rse;.  int nNew 
0a40: 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f  = (p->nOpAlloc ?
0a50: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a   p->nOpAlloc*2 :
0a60: 20 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65   (int)(1024/size
0a70: 6f 66 28 4f 70 29 29 29 3b 0a 20 20 70 4e 65 77  of(Op)));.  pNew
0a80: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
0a90: 6c 6f 63 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f  loc(p->db, v->aO
0aa0: 70 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f  p, nNew*sizeof(O
0ab0: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
0ac0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  ){.    p->nOpAll
0ad0: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
0ae0: 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20  llocSize(p->db, 
0af0: 70 4e 65 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29  pNew)/sizeof(Op)
0b00: 3b 0a 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70  ;.    v->aOp = p
0b10: 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  New;.  }.  retur
0b20: 6e 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45  n (pNew ? SQLITE
0b30: 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d  _OK : SQLITE_NOM
0b40: 45 4d 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  EM);.}..#ifdef S
0b50: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
0b60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
0b70: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74  ust a convenient
0b80: 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
0b90: 62 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20  breakpoint that 
0ba0: 77 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74  will.** fire aft
0bb0: 65 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69  er each opcode i
0bc0: 73 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64  s inserted and d
0bd0: 69 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a  isplayed using.*
0be0: 2a 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61  * "PRAGMA vdbe_a
0bf0: 64 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a  ddoptrace=on"..*
0c00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
0c10: 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f  st_addop_breakpo
0c20: 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  int(void){.  sta
0c30: 74 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  tic int n = 0;. 
0c40: 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   n++;.}.#endif..
0c50: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
0c60: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74  instruction to t
0c70: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72  he list of instr
0c80: 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20  uctions current 
0c90: 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20  in the.** VDBE. 
0ca0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
0cb0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
0cc0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
0cd0: 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a  * Parameters:.**
0ce0: 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20  .**    p        
0cf0: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
0d00: 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a  o the VDBE.**.**
0d10: 20 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20      op          
0d20: 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66      The opcode f
0d30: 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74  or this instruct
0d40: 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c  ion.**.**    p1,
0d50: 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65   p2, p3      Ope
0d60: 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20  rands.**.** Use 
0d70: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
0d80: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75  esolveLabel() fu
0d90: 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e  nction to fix an
0da0: 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20   address and.** 
0db0: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43  the sqlite3VdbeC
0dc0: 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69  hangeP4() functi
0dd0: 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  on to change the
0de0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
0df0: 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a  .** operand..*/.
0e00: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
0e10: 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69  ddOp3(Vdbe *p, i
0e20: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
0e30: 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a  nt p2, int p3){.
0e40: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f    int i;.  VdbeO
0e50: 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70  p *pOp;..  i = p
0e60: 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->nOp;.  assert(
0e70: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
0e80: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
0e90: 61 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20  assert( op>0 && 
0ea0: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28  op<0xff );.  if(
0eb0: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
0ec0: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69  lloc<=i ){.    i
0ed0: 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  f( growOpArray(p
0ee0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
0ef0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
0f00: 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70   p->nOp++;.  pOp
0f10: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
0f20: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28   pOp->opcode = (
0f30: 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35  u8)op;.  pOp->p5
0f40: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20   = 0;.  pOp->p1 
0f50: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
0f60: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
0f70: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  = p3;.  pOp->p4.
0f80: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34  p = 0;.  pOp->p4
0f90: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
0fa0: 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  D;.#ifdef SQLITE
0fb0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
0fc0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e  COMMENTS.  pOp->
0fd0: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65  zComment = 0;.#e
0fe0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
0ff0: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1000: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1010: 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
1020: 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  ace ){.    int j
1030: 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65  j, kk;.    Parse
1040: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
1050: 61 72 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a  arse;.    for(jj
1060: 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49 54 45  =kk=0; jj<SQLITE
1070: 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b  _N_COLCACHE; jj+
1080: 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1090: 20 79 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20   yColCache *x = 
10a0: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
10b0: 65 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66  e + jj;.      if
10c0: 28 20 78 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72  ( x->iLevel>pPar
10d0: 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20  se->iCacheLevel 
10e0: 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d 30 20 29 20  || x->iReg==0 ) 
10f0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1100: 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b  printf(" r[%d]={
1110: 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67  %d:%d}", x->iReg
1120: 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e  , x->iTable, x->
1130: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
1140: 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  kk++;.    }.    
1150: 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74 66 28  if( kk ) printf(
1160: 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  "\n");.    sqlit
1170: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
1180: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
1190: 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f  .    test_addop_
11a0: 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20  breakpoint();.  
11b0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
11c0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70  VDBE_PROFILE.  p
11d0: 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  Op->cycles = 0;.
11e0: 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a    pOp->cnt = 0;.
11f0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1200: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
1210: 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69  GE.  pOp->iSrcLi
1220: 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ne = 0;.#endif. 
1230: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74   return i;.}.int
1240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1250: 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p0(Vdbe *p, int 
1260: 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  op){.  return sq
1270: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1280: 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b  p, op, 0, 0, 0);
1290: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
12a0: 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70  beAddOp1(Vdbe *p
12b0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
12c0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
12d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
12e0: 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a   op, p1, 0, 0);.
12f0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1300: 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c  eAddOp2(Vdbe *p,
1310: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
1320: 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75   int p2){.  retu
1330: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1340: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
1350: 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  p2, 0);.}.../*.*
1360: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1370: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1380: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
1390: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
13a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13b0: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
13c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
13d0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
13e0: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
13f0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1400: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
1410: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
1420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1430: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1440: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1450: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1460: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1470: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1480: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1490: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
14a0: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
14b0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
14c0: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
14d0: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
14e0: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
14f0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1500: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1510: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1520: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1530: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1540: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
1550: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1560: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
1570: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
1580: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
1590: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
15a0: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
15b0: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
15c0: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
15d0: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
15e0: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
15f0: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
1600: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
1610: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
1620: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
1630: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
1640: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
1650: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1660: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
1670: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
1680: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
1690: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
16a0: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
16b0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
16c0: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
16d0: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64  int j;.  int add
16e0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
16f0: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73  ddOp3(p, OP_Pars
1700: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
1710: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
1720: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1730: 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44  dr, zWhere, P4_D
1740: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a  YNAMIC);.  for(j
1750: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62  =0; j<p->db->nDb
1760: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; j++) sqlite3Vd
1770: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a  beUsesBtree(p, j
1780: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
1790: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
17a0: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
17b0: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
17c0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
17d0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
17e0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
17f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1800: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1810: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1830: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1840: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1850: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1860: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1870: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1880: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1890: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
18a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
18b0: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
18c0: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
18d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18e0: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
18f0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
1900: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1910: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1920: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1930: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1940: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1950: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
1960: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
1970: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1990: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
19a0: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
19b0: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
19c0: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
19d0: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
19e0: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
19f0: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
1a00: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
1a10: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
1a20: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
1a30: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
1a40: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
1a50: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
1a60: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
1a70: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
1a80: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
1a90: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
1aa0: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
1ab0: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
1ac0: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
1ad0: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
1ae0: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
1af0: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
1b00: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
1b10: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
1b20: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
1b30: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
1b40: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
1b50: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
1b60: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
1b70: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
1b80: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
1b90: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
1ba0: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
1bb0: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
1bc0: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
1bd0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
1be0: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
1bf0: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
1c00: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
1c10: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29  keLabel(Vdbe *v)
1c20: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
1c30: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
1c40: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
1c50: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
1c60: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1c70: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69  INIT );.  if( (i
1c80: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (i-1))==0 ){.
1c90: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1ca0: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1cb0: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1cc0: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  >aLabel, .      
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28   (i*2+1)*sizeof(
1d00: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
1d10: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
1d20: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
1d30: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
1d40: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b  }.  return -1-i;
1d50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
1d60: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
1d70: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
1d80: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
1d90: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
1da0: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
1db0: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
1dc0: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
1dd0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
1de0: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
1df0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1e00: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
1e10: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1e20: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  bel(Vdbe *v, int
1e30: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20   x){.  Parse *p 
1e40: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
1e50: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
1e60: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
1e70: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1e80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   );.  assert( j<
1e90: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69  p->nLabel );.  i
1ea0: 66 28 20 6a 3e 3d 30 20 26 26 20 70 2d 3e 61 4c  f( j>=0 && p->aL
1eb0: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
1ec0: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f  Label[j] = v->nO
1ed0: 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 46 69 78  p;.  }.  p->iFix
1ee0: 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f 70 20 2d 20  edOp = v->nOp - 
1ef0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  1;.}../*.** Mark
1f00: 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65   the VDBE as one
1f10: 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62   that can only b
1f20: 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a  e run one time..
1f30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1f40: 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56  dbeRunOnlyOnce(V
1f50: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75  dbe *p){.  p->ru
1f60: 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d  nOnlyOnce = 1;.}
1f70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1f80: 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65 33  DEBUG /* sqlite3
1f90: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
1fa0: 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   logic */../*.**
1fb0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
1fc0: 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e  ype and function
1fd0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74 65   are used to ite
1fe0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c  rate through all
1ff0: 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61   opcodes.** in a
2000: 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67 72   Vdbe main progr
2010: 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20 74  am and each of t
2020: 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20  he sub-programs 
2030: 28 74 72 69 67 67 65 72 73 29 20 69 74 20 6d 61  (triggers) it ma
2040: 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72  y .** invoke dir
2050: 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63  ectly or indirec
2060: 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  tly. It should b
2070: 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77  e used as follow
2080: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70  s:.**.**   Op *p
2090: 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49  Op;.**   VdbeOpI
20a0: 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a  ter sIter;.**.**
20b0: 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72     memset(&sIter
20c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65  , 0, sizeof(sIte
20d0: 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e  r));.**   sIter.
20e0: 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20 20  v = v;          
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79 70    // v is of typ
2110: 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68  e Vdbe* .**   wh
2120: 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74  ile( (pOp = opIt
2130: 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 20  erNext(&sIter)) 
2140: 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20  ){.**     // Do 
2150: 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 70  something with p
2160: 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73  Op.**   }.**   s
2170: 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
2180: 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29  db, sIter.apSub)
2190: 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66  ;.** .*/.typedef
21a0: 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74   struct VdbeOpIt
21b0: 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a 73  er VdbeOpIter;.s
21c0: 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72  truct VdbeOpIter
21d0: 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20   {.  Vdbe *v;   
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72 61  /* Vdbe to itera
2200: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6f  te through the o
2210: 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53  pcodes of */.  S
2220: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
2230: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72  b;        /* Arr
2240: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d  ay of subprogram
2250: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b  s */.  int nSub;
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
2280: 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 62 20  ntries in apSub 
2290: 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 20  */.  int iAddr; 
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
22c0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
22d0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
22e0: 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 20 20  t iSub;         
22f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d 20           /* 0 = 
2300: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20  main program, 1 
2310: 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f 67  = first sub-prog
2320: 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73  ram etc. */.};.s
2330: 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65 72  tatic Op *opIter
2340: 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 72 20  Next(VdbeOpIter 
2350: 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  *p){.  Vdbe *v =
2360: 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65   p->v;.  Op *pRe
2370: 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70  t = 0;.  Op *aOp
2380: 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20  ;.  int nOp;..  
2390: 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e  if( p->iSub<=p->
23a0: 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66 28  nSub ){..    if(
23b0: 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20   p->iSub==0 ){. 
23c0: 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f       aOp = v->aO
23d0: 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 76  p;.      nOp = v
23e0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  ->nOp;.    }else
23f0: 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70 2d  {.      aOp = p-
2400: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
2410: 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f  ]->aOp;.      nO
2420: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
2430: 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20  iSub-1]->nOp;.  
2440: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2450: 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a  p->iAddr<nOp );.
2460: 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f 70  .    pRet = &aOp
2470: 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20  [p->iAddr];.    
2480: 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20  p->iAddr++;.    
2490: 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f  if( p->iAddr==nO
24a0: 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53  p ){.      p->iS
24b0: 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69  ub++;.      p->i
24c0: 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Addr = 0;.    }.
24d0: 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d    .    if( pRet-
24e0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
24f0: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
2500: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e  int nByte = (p->
2510: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
2520: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
2530: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
2540: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53  for(j=0; j<p->nS
2550: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
2560: 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a    if( p->apSub[j
2570: 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f  ]==pRet->p4.pPro
2580: 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  gram ) break;.  
2590: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
25a0: 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20  j==p->nSub ){.  
25b0: 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20 3d        p->apSub =
25c0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
25d0: 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20 70  cOrFree(v->db, p
25e0: 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29 3b  ->apSub, nByte);
25f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 2d  .        if( !p-
2600: 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20  >apSub ){.      
2610: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
2620: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2630: 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 5b         p->apSub[
2640: 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65  p->nSub++] = pRe
2650: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  t->p4.pProgram;.
2660: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2670: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
2680: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
2690: 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
26a0: 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64  e program stored
26b0: 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f 63   in the VM assoc
26c0: 69 61 74 65 64 20 77 69 74 68 20 70 50 61 72 73  iated with pPars
26d0: 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61  e may.** throw a
26e0: 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f  n ABORT exceptio
26f0: 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 20 73  n (causing the s
2700: 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  tatement, but no
2710: 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  t entire transac
2720: 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f  tion.** to be ro
2730: 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69 73  lled back). This
2740: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72   condition is tr
2750: 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 70  ue if the main p
2760: 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a  rogram or any.**
2770: 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f   sub-programs co
2780: 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74 68  ntains any of th
2790: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
27a0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20  **   *  OP_Halt 
27b0: 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43  with P1=SQLITE_C
27c0: 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32  ONSTRAINT and P2
27d0: 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20  =OE_Abort..**   
27e0: 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  *  OP_HaltIfNull
27f0: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
2800: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
2810: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
2820: 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a   *  OP_Destroy.*
2830: 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74  *   *  OP_VUpdat
2840: 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65  e.**   *  OP_VRe
2850: 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  name.**   *  OP_
2860: 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20 50  FkCounter with P
2870: 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65 20  2==0 (immediate 
2880: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
2890: 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a 2a 20 54 68  traint).**.** Th
28a0: 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  en check that th
28b0: 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65  e value of Parse
28c0: 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72 75  .mayAbort is tru
28d0: 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54  e if an.** ABORT
28e0: 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20   may be thrown, 
28f0: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
2900: 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20  se. Return true 
2910: 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61  if it does.** ma
2920: 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  tch, or false ot
2930: 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66 75  herwise. This fu
2940: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64  nction is intend
2950: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61 73  ed to be used as
2960: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61  .** part of an a
2970: 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20  ssert statement 
2980: 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e  in the compiler.
2990: 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a   Similar to:.**.
29a0: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  **   assert( sql
29b0: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61  ite3VdbeAssertMa
29c0: 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70  yAbort(pParse->p
29d0: 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61  Vdbe, pParse->ma
29e0: 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e  yAbort) );.*/.in
29f0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  t sqlite3VdbeAss
2a00: 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65  ertMayAbort(Vdbe
2a10: 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72   *v, int mayAbor
2a20: 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f  t){.  int hasAbo
2a30: 72 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f  rt = 0;.  Op *pO
2a40: 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20  p;.  VdbeOpIter 
2a50: 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  sIter;.  memset(
2a60: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
2a70: 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74  f(sIter));.  sIt
2a80: 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69  er.v = v;..  whi
2a90: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65  le( (pOp = opIte
2aa0: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d  rNext(&sIter))!=
2ab0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63  0 ){.    int opc
2ac0: 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  ode = pOp->opcod
2ad0: 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  e;.    if( opcod
2ae0: 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c  e==OP_Destroy ||
2af0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
2b00: 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ate || opcode==O
2b10: 50 5f 56 52 65 6e 61 6d 65 20 0a 23 69 66 6e 64  P_VRename .#ifnd
2b20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
2b30: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 20  OREIGN_KEY.     
2b40: 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  || (opcode==OP_F
2b50: 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d  kCounter && pOp-
2b60: 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1==0 && pOp->p
2b70: 32 3d 3d 31 29 20 0a 23 65 6e 64 69 66 0a 20 20  2==1) .#endif.  
2b80: 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d     || ((opcode==
2b90: 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64  OP_Halt || opcod
2ba0: 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  e==OP_HaltIfNull
2bb0: 29 20 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f  ) .      && ((pO
2bc0: 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53 51 4c  p->p1&0xff)==SQL
2bd0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26  ITE_CONSTRAINT &
2be0: 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62  & pOp->p2==OE_Ab
2bf0: 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ort)).    ){.   
2c00: 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b     hasAbort = 1;
2c10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2c20: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2c30: 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73  3DbFree(v->db, s
2c40: 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20  Iter.apSub);..  
2c50: 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  /* Return true i
2c60: 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41  f hasAbort==mayA
2c70: 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61  bort. Or if a ma
2c80: 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
2c90: 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d  urred..  ** If m
2ca0: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68  alloc failed, th
2cb0: 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c  en the while() l
2cc0: 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f  oop above may no
2cd0: 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64 0a  t have iterated.
2ce0: 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c    ** through all
2cf0: 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73   opcodes and has
2d00: 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74  Abort may be set
2d10: 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65   incorrectly. Re
2d20: 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66  turn.  ** true f
2d30: 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f 20  or this case to 
2d40: 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73 65  prevent the asse
2d50: 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c  rt() in the call
2d60: 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66  ers frame.  ** f
2d70: 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f  rom failing.  */
2d80: 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64  .  return ( v->d
2d90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2da0: 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  || hasAbort==may
2db0: 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69  Abort );.}.#endi
2dc0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
2dd0: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
2de0: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
2df0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a  function */../*.
2e00: 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  ** Loop through 
2e10: 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b  the program look
2e20: 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65  ing for P2 value
2e30: 73 20 74 68 61 74 20 61 72 65 20 6e 65 67 61 74  s that are negat
2e40: 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69  ive.** on jump i
2e50: 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61  nstructions.  Ea
2e60: 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69 73  ch such value is
2e70: 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c   a label.  Resol
2e80: 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  ve the.** label 
2e90: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  by setting the P
2ea0: 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63  2 value to its c
2eb0: 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20  orrect non-zero 
2ec0: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  value..**.** Thi
2ed0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2ee0: 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61  led once after a
2ef0: 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20  ll opcodes have 
2f00: 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  been inserted..*
2f10: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70  *.** Variable *p
2f20: 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20 73  MaxFuncArgs is s
2f30: 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  et to the maximu
2f40: 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50  m value of any P
2f50: 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74  2 argument .** t
2f60: 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  o an OP_Function
2f70: 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20  , OP_AggStep or 
2f80: 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64  OP_VFilter opcod
2f90: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  e. This is used 
2fa0: 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  by .** sqlite3Vd
2fb0: 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f  beMakeReady() to
2fc0: 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61   size the Vdbe.a
2fd0: 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  pArg[] array..**
2fe0: 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61  .** The Op.opfla
2ff0: 67 73 20 66 69 65 6c 64 20 69 73 20 73 65 74 20  gs field is set 
3000: 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a  on all opcodes..
3010: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
3020: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56  esolveP2Values(V
3030: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61  dbe *p, int *pMa
3040: 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e  xFuncArgs){.  in
3050: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41  t i;.  int nMaxA
3060: 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41  rgs = *pMaxFuncA
3070: 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a  rgs;.  Op *pOp;.
3080: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
3090: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = p->pParse;.  i
30a0: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61  nt *aLabel = pPa
30b0: 72 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70  rse->aLabel;.  p
30c0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
30d0: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
30e0: 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d   0;.  for(pOp=p-
30f0: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
3100: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
3110: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f  ++){.    u8 opco
3120: 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  de = pOp->opcode
3130: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20  ;..    /* NOTE: 
3140: 42 65 20 73 75 72 65 20 74 6f 20 75 70 64 61 74  Be sure to updat
3150: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
3160: 77 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72  when adding or r
3170: 65 6d 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 63  emoving.    ** c
3180: 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73  ases from this s
3190: 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20 73 77  witch! */.    sw
31a0: 69 74 63 68 28 20 6f 70 63 6f 64 65 20 29 7b 0a  itch( opcode ){.
31b0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 46 75        case OP_Fu
31c0: 6e 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 63 61  nction:.      ca
31d0: 73 65 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b  se OP_AggStep: {
31e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
31f0: 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20  ->p5>nMaxArgs ) 
3200: 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e  nMaxArgs = pOp->
3210: 70 35 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  p5;.        brea
3220: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3230: 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63   case OP_Transac
3240: 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  tion: {.        
3250: 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29  if( pOp->p2!=0 )
3260: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
3270: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c  ;.        /* fal
3280: 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20  l thru */.      
3290: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
32a0: 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20  AutoCommit:.    
32b0: 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f    case OP_Savepo
32c0: 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  int: {.        p
32d0: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b  ->bIsReader = 1;
32e0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
32f0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
3300: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
3310: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68        case OP_Ch
3320: 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66  eckpoint:.#endif
3330: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56  .      case OP_V
3340: 61 63 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73  acuum:.      cas
3350: 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  e OP_JournalMode
3360: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72  : {.        p->r
3370: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20  eadOnly = 0;.   
3380: 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65       p->bIsReade
3390: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  r = 1;.        b
33a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
33b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33c0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
33d0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70       case OP_VUp
33e0: 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  date: {.        
33f0: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78  if( pOp->p2>nMax
3400: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
3410: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
3420: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3430: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
3440: 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20  VFilter: {.     
3450: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
3460: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
3470: 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20   - i >= 3 );.   
3480: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
3490: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
34a0: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
34b0: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
34c0: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  1;.        if( n
34d0: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
34e0: 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Args = n;.      
34f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3500: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61  .#endif.      ca
3510: 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20  se OP_Next:.    
3520: 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66    case OP_NextIf
3530: 4f 70 65 6e 3a 0a 20 20 20 20 20 20 63 61 73 65  Open:.      case
3540: 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20   OP_SorterNext: 
3550: 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  {.        pOp->p
3560: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
3570: 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20  ite3BtreeNext;. 
3580: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79         pOp->p4ty
3590: 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b  pe = P4_ADVANCE;
35a0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
35b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
35c0: 73 65 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20  se OP_Prev:.    
35d0: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66    case OP_PrevIf
35e0: 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  Open: {.        
35f0: 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
3600: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
3610: 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20  revious;.       
3620: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3630: 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20  4_ADVANCE;.     
3640: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3650: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70  }.    }..    pOp
3660: 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69  ->opflags = sqli
3670: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
3680: 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69  y[opcode];.    i
3690: 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73  f( (pOp->opflags
36a0: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d   & OPFLG_JUMP)!=
36b0: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29  0 && pOp->p2<0 )
36c0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
36d0: 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 50 61 72 73  -1-pOp->p2<pPars
36e0: 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20  e->nLabel );.   
36f0: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61     pOp->p2 = aLa
3700: 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b  bel[-1-pOp->p2];
3710: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
3720: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
3730: 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  , pParse->aLabel
3740: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61  );.  pParse->aLa
3750: 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  bel = 0;.  pPars
3760: 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  e->nLabel = 0;. 
3770: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d   *pMaxFuncArgs =
3780: 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73   nMaxArgs;.  ass
3790: 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65  ert( p->bIsReade
37a0: 72 21 3d 30 20 7c 7c 20 70 2d 3e 62 74 72 65 65  r!=0 || p->btree
37b0: 4d 61 73 6b 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  Mask==0 );.}../*
37c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
37d0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
37e0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
37f0: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
3800: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3810: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
3820: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
3830: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
3840: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
3850: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
3860: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
3870: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
3880: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
3890: 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20  rray of opcodes 
38a0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
38b0: 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73  ** the Vdbe pass
38c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
38d0: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20  argument. It is 
38e0: 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
38f0: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f  onsibility.** to
3900: 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65   arrange for the
3910: 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20   returned array 
3920: 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  to be eventually
3930: 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65   freed using the
3940: 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41   .** vdbeFreeOpA
3950: 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rray() function.
3960: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
3970: 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69  turning, *pnOp i
3980: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
3990: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
39a0: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  n the returned.*
39b0: 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a  * array. Also, *
39c0: 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20  pnMaxArg is set 
39d0: 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  to the larger of
39e0: 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
39f0: 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e  ue and .** the n
3a00: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3a10: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41   in the Vdbe.apA
3a20: 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69  rg[] array requi
3a30: 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  red to execute t
3a40: 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  he .** returned 
3a50: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65  program..*/.Vdbe
3a60: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54  Op *sqlite3VdbeT
3a70: 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  akeOpArray(Vdbe 
3a80: 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69  *p, int *pnOp, i
3a90: 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20  nt *pnMaxArg){. 
3aa0: 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70   VdbeOp *aOp = p
3ab0: 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->aOp;.  assert(
3ac0: 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e   aOp && !p->db->
3ad0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
3ae0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
3af0: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
3b00: 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20  Btree() was not 
3b10: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56  called on this V
3b20: 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  M */.  assert( p
3b30: 2d 3e 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29  ->btreeMask==0 )
3b40: 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  ;..  resolveP2Va
3b50: 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67  lues(p, pnMaxArg
3b60: 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e  );.  *pnOp = p->
3b70: 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20  nOp;.  p->aOp = 
3b80: 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b  0;.  return aOp;
3b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
3ba0: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
3bb0: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
3bc0: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
3bd0: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
3be0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
3bf0: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
3c00: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
3c10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3c20: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
3c30: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
3c40: 6f 6e 73 74 20 2a 61 4f 70 2c 20 69 6e 74 20 69  onst *aOp, int i
3c50: 4c 69 6e 65 6e 6f 29 7b 0a 20 20 69 6e 74 20 61  Lineno){.  int a
3c60: 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ddr;.  assert( p
3c70: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3c80: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
3c90: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
3ca0: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
3cb0: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
3cc0: 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 72 65  ray(p) ){.    re
3cd0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64  turn 0;.  }.  ad
3ce0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  dr = p->nOp;.  i
3cf0: 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29  f( ALWAYS(nOp>0)
3d00: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
3d10: 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f     VdbeOpList co
3d20: 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a  nst *pIn = aOp;.
3d30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
3d40: 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b  Op; i++, pIn++){
3d50: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20  .      int p2 = 
3d60: 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56  pIn->p2;.      V
3d70: 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70  dbeOp *pOut = &p
3d80: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20  ->aOp[i+addr];. 
3d90: 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64       pOut->opcod
3da0: 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b  e = pIn->opcode;
3db0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  .      pOut->p1 
3dc0: 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20  = pIn->p1;.     
3dd0: 20 69 66 28 20 70 32 3c 30 20 29 7b 0a 20 20 20   if( p2<0 ){.   
3de0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
3df0: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
3e00: 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d  ty[pOut->opcode]
3e10: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 20 29 3b   & OPFLG_JUMP );
3e20: 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  .        pOut->p
3e30: 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28  2 = addr + ADDR(
3e40: 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p2);.      }else
3e50: 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  {.        pOut->
3e60: 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d  p2 = p2;.      }
3e70: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20  .      pOut->p3 
3e80: 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20  = pIn->p3;.     
3e90: 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20   pOut->p4type = 
3ea0: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
3eb0: 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30    pOut->p4.p = 0
3ec0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35  ;.      pOut->p5
3ed0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
3ee0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
3ef0: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
3f00: 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74    pOut->zComment
3f10: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
3f20: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
3f30: 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20 70  COVERAGE.      p
3f40: 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  Out->iSrcLine = 
3f50: 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65  iLineno+i;.#else
3f60: 0a 20 20 20 20 20 20 28 76 6f 69 64 29 69 4c 69  .      (void)iLi
3f70: 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66  neno;.#endif.#if
3f80: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3f90: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 64 62  .      if( p->db
3fa0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
3fb0: 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
3fc0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3fd0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
3fe0: 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70   i+addr, &p->aOp
3ff0: 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20  [i+addr]);.     
4000: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
4010: 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f      p->nOp += nO
4020: 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
4030: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
4040: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
4050: 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e  of the P1 operan
4060: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
4070: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
4080: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4090: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
40a0: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
40b0: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
40c0: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
40d0: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
40e0: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
40f0: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
4100: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
4110: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
4120: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
4130: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
4140: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
4150: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
4160: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
4170: 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f   if( ((u32)p->nO
4180: 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70  p)>addr ){.    p
4190: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d  ->aOp[addr].p1 =
41a0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
41b0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
41c0: 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70  lue of the P2 op
41d0: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
41e0: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
41f0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
4200: 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20  e is useful for 
4210: 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64  setting a jump d
4220: 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  estination..*/.v
4230: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
4240: 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c  hangeP2(Vdbe *p,
4250: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
4260: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
4270: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75  !=0 );.  if( ((u
4280: 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20  32)p->nOp)>addr 
4290: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
42a0: 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20  dr].p2 = val;.  
42b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
42c0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
42d0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f  he P3 operand fo
42e0: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
42f0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
4300: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
4310: 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75  ngeP3(Vdbe *p, u
4320: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  32 addr, int val
4330: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ){.  assert( p!=
4340: 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32  0 );.  if( ((u32
4350: 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b  )p->nOp)>addr ){
4360: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72  .    p->aOp[addr
4370: 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p3 = val;.  }.
4380: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
4390: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
43a0: 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P5 operand for 
43b0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
43c0: 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61  y.** added opera
43d0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
43e0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
43f0: 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61  5(Vdbe *p, u8 va
4400: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
4410: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
4420: 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Op ){.    assert
4430: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20  ( p->nOp>0 );.  
4440: 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d    p->aOp[p->nOp-
4450: 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d  1].p5 = val;.  }
4460: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
4470: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
4480: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  of instruction a
4490: 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ddr so that it p
44a0: 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
44b0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
44c0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
44d0: 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a  to be coded..*/.
44e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
44f0: 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70  JumpHere(Vdbe *p
4500: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73  , int addr){.  s
4510: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4520: 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e  P2(p, addr, p->n
4530: 4f 70 29 3b 0a 20 20 70 2d 3e 70 50 61 72 73 65  Op);.  p->pParse
4540: 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e  ->iFixedOp = p->
4550: 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nOp - 1;.}.../*.
4560: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
4570: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
4580: 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20  e is ephemeral, 
4590: 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49  then free it.  I
45a0: 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66  f.** the FuncDef
45b0: 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c   is not ephermal
45c0: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  , then do nothin
45d0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
45e0: 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46  d freeEphemeralF
45f0: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
4600: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44  *db, FuncDef *pD
4610: 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  ef){.  if( ALWAY
4620: 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66  S(pDef) && (pDef
4630: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
4640: 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29  LITE_FUNC_EPHEM)
4650: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
4660: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65  e3DbFree(db, pDe
4670: 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  f);.  }.}..stati
4680: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
4690: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
46a0: 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  , Op *, int);../
46b0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34  *.** Delete a P4
46c0: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73   value if necess
46d0: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
46e0: 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74  oid freeP4(sqlit
46f0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79  e3 *db, int p4ty
4700: 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20  pe, void *p4){. 
4710: 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61   if( p4 ){.    a
4720: 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20  ssert( db );.   
4730: 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20   switch( p4type 
4740: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  ){.      case P4
4750: 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73  _REAL:.      cas
4760: 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20  e P4_INT64:.    
4770: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49    case P4_DYNAMI
4780: 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  C:.      case P4
4790: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
47a0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
47b0: 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20  ee(db, p4);.    
47c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
47d0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
47e0: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
47f0: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
4800: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
4810: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
4820: 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b  f((KeyInfo*)p4);
4830: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4850: 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b  se P4_MPRINTF: {
4860: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
4870: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4880: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
4890: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
48a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
48b0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
48c0: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65  F: {.        fre
48d0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
48e0: 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a  on(db, (FuncDef*
48f0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
4900: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4910: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
4920: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4930: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4940: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
4950: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
4960: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
4970: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  p4);.        }el
4980: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65  se{.          Me
4990: 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b  m *p = (Mem*)p4;
49a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
49b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
49c0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
49d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
49e0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
49f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
4a00: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4a10: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
4a20: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4a30: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4a40: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
4a50: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
4a60: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4a70: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4a80: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
4a90: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
4aa0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
4ab0: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
4ac0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
4ad0: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
4ae0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
4af0: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
4b00: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
4b10: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
4b20: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
4b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
4b40: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
4b50: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
4b60: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
4b70: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
4b80: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
4b90: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
4ba0: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
4bb0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
4bc0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
4bd0: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
4be0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
4bf0: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
4c00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4c10: 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f  ree(db, pOp->zCo
4c20: 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20  mment);.#endif  
4c30: 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20     .    }.  }.  
4c40: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4c50: 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , aOp);.}../*.**
4c60: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
4c70: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
4c80: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
4c90: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
4ca0: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
4cb0: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
4cc0: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
4cd0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
4ce0: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
4cf0: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
4d00: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
4d10: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
4d20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4d30: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
4d40: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
4d50: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
4d60: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
4d70: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
4d80: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
4d90: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
4da0: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
4db0: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
4dc0: 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  Noop.*/.void sql
4dd0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
4de0: 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  Noop(Vdbe *p, in
4df0: 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 70  t addr){.  if( p
4e00: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62  ->aOp ){.    Vdb
4e10: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
4e20: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71  Op[addr];.    sq
4e30: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
4e40: 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62  b;.    freeP4(db
4e50: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
4e60: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d  Op->p4.p);.    m
4e70: 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69  emset(pOp, 0, si
4e80: 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20  zeof(pOp[0]));. 
4e90: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
4ea0: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 66   OP_Noop;.    if
4eb0: 28 20 61 64 64 72 3d 3d 70 2d 3e 6e 4f 70 2d 31  ( addr==p->nOp-1
4ec0: 20 29 20 70 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d   ) p->nOp--;.  }
4ed0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
4ee0: 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65   the last opcode
4ef0: 20 69 6e 73 65 72 74 65 64 0a 2a 2f 0a 69 6e 74   inserted.*/.int
4f00: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
4f10: 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64  tePriorOpcode(Vd
4f20: 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20  be *p, u8 op){. 
4f30: 20 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e   if( (p->nOp-1)>
4f40: 28 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78  (p->pParse->iFix
4f50: 65 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f 70 5b  edOp) && p->aOp[
4f60: 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65  p->nOp-1].opcode
4f70: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  ==op ){.    sqli
4f80: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
4f90: 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29  oop(p, p->nOp-1)
4fa0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
4fb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
4fc0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
4fd0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
4fe0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f  alue of the P4 o
4ff0: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
5000: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
5010: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
5020: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
5030: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
5040: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
5050: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
5060: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
5070: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
5080: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
5090: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
50a0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
50b0: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
50c0: 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  f n>=0 then the 
50d0: 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79  P4 operand is dy
50e0: 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74  namic, meaning t
50f0: 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a  hat a copy of.**
5100: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d   the string is m
5110: 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ade into memory 
5120: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
5130: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
5140: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d  ** A value of n=
5150: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79  =0 means copy by
5160: 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f  tes of zP4 up to
5170: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74   and including t
5180: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c  he.** first null
5190: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74   byte.  If n>0 t
51a0: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74  hen copy n+1 byt
51b0: 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a  es of zP4..** .*
51c0: 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  * Other values o
51d0: 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20  f n (P4_STATIC, 
51e0: 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29  P4_COLLSEQ etc.)
51f0: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a   indicate that z
5200: 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  P4 points.** to 
5210: 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75  a string or stru
5220: 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75  cture that is gu
5230: 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
5240: 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69  t for the lifeti
5250: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62  me of.** the Vdb
5260: 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  e. In these case
5270: 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f  s we can just co
5280: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a  py the pointer..
5290: 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20  **.** If addr<0 
52a0: 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f  then change P4 o
52b0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
52c0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73  tly inserted ins
52d0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
52e0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
52f0: 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69  ngeP4(Vdbe *p, i
5300: 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63  nt addr, const c
5310: 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29  har *zP4, int n)
5320: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73  {.  Op *pOp;.  s
5330: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73  qlite3 *db;.  as
5340: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
5350: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
5360: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
5370: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
5380: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d  );.  if( p->aOp=
5390: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
53a0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66  Failed ){.    if
53b0: 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 7b 0a  ( n!=P4_VTAB ){.
53c0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
53d0: 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61   n, (void*)*(cha
53e0: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d  r**)&zP4);.    }
53f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
5400: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
5410: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
5420: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a   addr<p->nOp );.
5430: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
5440: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
5450: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70  p - 1;.  }.  pOp
5460: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
5470: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
5480: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55  >p4type==P4_NOTU
5490: 53 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  SED.       || pO
54a0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
54b0: 54 33 32 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  T32.       || pO
54c0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45  p->p4type==P4_KE
54d0: 59 49 4e 46 4f 20 29 3b 0a 20 20 66 72 65 65 50  YINFO );.  freeP
54e0: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
54f0: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
5500: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
5510: 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33    if( n==P4_INT3
5520: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65  2 ){.    /* Note
5530: 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73  : this cast is s
5540: 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  afe, because the
5550: 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69   origin data poi
5560: 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20  nt was an int.  
5570: 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61    ** that was ca
5580: 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63  st to a (const c
5590: 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70  har *). */.    p
55a0: 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54  Op->p4.i = SQLIT
55b0: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34  E_PTR_TO_INT(zP4
55c0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
55d0: 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20  pe = P4_INT32;. 
55e0: 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d   }else if( zP4==
55f0: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  0 ){.    pOp->p4
5600: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d  .p = 0;.    pOp-
5610: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
5620: 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  USED;.  }else if
5630: 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  ( n==P4_KEYINFO 
5640: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5650: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
5660: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5670: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d   P4_KEYINFO;.  }
5680: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56  else if( n==P4_V
5690: 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  TAB ){.    pOp->
56a0: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
56b0: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
56c0: 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20  pe = P4_VTAB;.  
56d0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63    sqlite3VtabLoc
56e0: 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29  k((VTable *)zP4)
56f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
5700: 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64  VTable *)zP4)->d
5710: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65  b==p->db );.  }e
5720: 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  lse if( n<0 ){. 
5730: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5740: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
5750: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
5760: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d  gned char)n;.  }
5770: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d  else{.    if( n=
5780: 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33  =0 ) n = sqlite3
5790: 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20  Strlen30(zP4);. 
57a0: 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73     pOp->p4.z = s
57b0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
57c0: 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a  p->db, zP4, n);.
57d0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
57e0: 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20  = P4_DYNAMIC;.  
57f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
5800: 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  he P4 on the mos
5810: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
5820: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b   opcode to the K
5830: 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a  eyInfo for the.*
5840: 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a  * index given..*
5850: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5860: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50  beSetP4KeyInfo(P
5870: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
5880: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64  dex *pIdx){.  Vd
5890: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
58a0: 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
58b0: 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   v!=0 );.  asser
58c0: 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20  t( pIdx!=0 );.  
58d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
58e0: 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
58f0: 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
5900: 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  OfIndex(pParse, 
5910: 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20 20  pIdx),.         
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
5930: 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66  KEYINFO);.}..#if
5940: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5950: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
5960: 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  TS./*.** Change 
5970: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
5980: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
5990: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
59a0: 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72  on.  Or.** inser
59b0: 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64  t a No-op and ad
59c0: 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f  d the comment to
59d0: 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75   that new instru
59e0: 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20  ction.  This.** 
59f0: 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65  makes the code e
5a00: 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75  asier to read du
5a10: 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20  ring debugging. 
5a20: 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61   None of this ha
5a30: 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72  ppens.** in a pr
5a40: 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a  oduction build..
5a50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
5a60: 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65  dbeVComment(Vdbe
5a70: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
5a80: 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73  *zFormat, va_lis
5a90: 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28  t ap){.  assert(
5aa0: 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e   p->nOp>0 || p->
5ab0: 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  aOp==0 );.  asse
5ac0: 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  rt( p->aOp==0 ||
5ad0: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5ae0: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c  ].zComment==0 ||
5af0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
5b00: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
5b10: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65  >nOp ){.    asse
5b20: 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20  rt( p->aOp );.  
5b30: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5b40: 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d  p->db, p->aOp[p-
5b50: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
5b60: 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d  );.    p->aOp[p-
5b70: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
5b80: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
5b90: 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61  tf(p->db, zForma
5ba0: 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  t, ap);.  }.}.vo
5bb0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
5bc0: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
5bd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
5be0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
5bf0: 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20  ist ap;.  if( p 
5c00: 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  ){.    va_start(
5c10: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
5c20: 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70    vdbeVComment(p
5c30: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
5c40: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
5c50: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
5c60: 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e  e3VdbeNoopCommen
5c70: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
5c80: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
5c90: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
5ca0: 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ap;.  if( p ){. 
5cb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5cc0: 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29  dOp0(p, OP_Noop)
5cd0: 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
5ce0: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
5cf0: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c   vdbeVComment(p,
5d00: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
5d10: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
5d20: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20   }.}.#endif  /* 
5d30: 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  NDEBUG */..#ifde
5d40: 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  f SQLITE_VDBE_CO
5d50: 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74  VERAGE./*.** Set
5d60: 20 74 68 65 20 76 61 6c 75 65 20 69 66 20 74 68   the value if th
5d70: 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64  e iSrcLine field
5d80: 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
5d90: 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75  sly coded instru
5da0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
5db0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e  qlite3VdbeSetLin
5dc0: 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c  eNumber(Vdbe *v,
5dd0: 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73   int iLine){.  s
5de0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
5df0: 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20  v,-1)->iSrcLine 
5e00: 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69  = iLine;.}.#endi
5e10: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45  f /* SQLITE_VDBE
5e20: 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a  _COVERAGE */../*
5e30: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
5e40: 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65  pcode for a give
5e50: 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74  n address.  If t
5e60: 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31  he address is -1
5e70: 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e  , then.** return
5e80: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5e90: 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f  ly inserted opco
5ea0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  de..**.** If a m
5eb0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
5ec0: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
5ed0: 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  red prior to the
5ee0: 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73   calling of this
5ef0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  .** routine, the
5f00: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
5f10: 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69   dummy VdbeOp wi
5f20: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
5f30: 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20   That opcode.** 
5f40: 69 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20  is readable but 
5f50: 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68  not writable, th
5f60: 6f 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20  ough it is cast 
5f70: 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61  to a writable va
5f80: 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  lue..** The retu
5f90: 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70  rn of a dummy op
5fa0: 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20  code allows the 
5fb0: 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65  call to continue
5fc0: 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20   functioning.** 
5fd0: 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c  after a OOM faul
5fe0: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
5ff0: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65   to check to see
6000: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66   if the return f
6010: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  rom .** this rou
6020: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20  tine is a valid 
6030: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65  pointer.  But be
6040: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e  cause the dummy.
6050: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20  opcode is 0,.** 
6060: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72  dummy will never
6070: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
6080: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65   This is verifie
6090: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63  d by code inspec
60a0: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72  tion and.** by r
60b0: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67  unning with Valg
60c0: 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  rind..*/.VdbeOp 
60d0: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
60e0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
60f0: 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73  ddr){.  /* C89 s
6100: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68  pecifies that th
6110: 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d  e constant "dumm
6120: 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69  y" will be initi
6130: 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20  alized to all.  
6140: 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20  ** zeros, which 
6150: 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56  is correct.  MSV
6160: 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61  C generates a wa
6170: 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c  rning, neverthel
6180: 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ess. */.  static
6190: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20   VdbeOp dummy;  
61a0: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53  /* Ignore the MS
61b0: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  VC warning about
61c0: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20   no initializer 
61d0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
61e0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
61f0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
6200: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
6210: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
6220: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
6230: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
6240: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
6250: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6260: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
6270: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
6280: 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f     return (VdbeO
6290: 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c  p*)&dummy;.  }el
62a0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
62b0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
62c0: 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
62d0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45  (SQLITE_ENABLE_E
62e0: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29  XPLAIN_COMMENTS)
62f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
6300: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
6310: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61  or one of the pa
6320: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20  rameters to the 
6330: 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65  opcode pOp.** de
6340: 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72  termined by char
6350: 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74  acter c..*/.stat
6360: 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65  ic int translate
6370: 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20  P(char c, const 
6380: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20  Op *pOp){.  if( 
6390: 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20  c=='1' ) return 
63a0: 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63  pOp->p1;.  if( c
63b0: 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70  =='2' ) return p
63c0: 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d  Op->p2;.  if( c=
63d0: 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='3' ) return pO
63e0: 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p3;.  if( c==
63f0: 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '4' ) return pOp
6400: 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e  ->p4.i;.  return
6410: 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a   pOp->p5;.}../*.
6420: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
6430: 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d  ing for the "com
6440: 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61  ment" field of a
6450: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73   VDBE opcode lis
6460: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
6470: 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20  Synopsis: field 
6480: 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  in comments in t
6490: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
64a0: 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65   file gets conve
64b0: 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78  rted.** to an ex
64c0: 74 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  tra string that 
64d0: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
64e0: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
64f0: 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a  Name().  In the.
6500: 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74  ** absence of ot
6510: 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68  her comments, th
6520: 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f  is synopsis beco
6530: 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  mes the comment 
6540: 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a  on the opcode..*
6550: 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69  * Some translati
6560: 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a  on occurs:.**.**
6570: 20 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20         "PX"     
6580: 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20   ->  "r[X]".**  
6590: 20 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d       "PX@PY"   -
65a0: 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22  >  "r[X..X+Y-1]"
65b0: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
65c0: 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20   is 0 or 1.**   
65d0: 20 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e      "PX@PY+1" ->
65e0: 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20    "r[X..X+Y]"   
65f0: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
6600: 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50  is 0.**       "P
6610: 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58  Y..PY"  ->  "r[X
6620: 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72  ..Y]"      or "r
6630: 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a  [x]" if y<=x.*/.
6640: 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
6650: 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e  ayComment(.  con
6660: 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20  st Op *pOp,     
6670: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f  /* The opcode to
6680: 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f   be commented */
6690: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
66a0: 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  P4,   /* Previou
66b0: 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c  sly obtained val
66c0: 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63  ue for P4 */.  c
66d0: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20  har *zTemp,     
66e0: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
66f0: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
6700: 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f  nTemp          /
6710: 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c  * Space availabl
6720: 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a  e in zTemp[] */.
6730: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
6740: 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  *zOpName;.  cons
6750: 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69  t char *zSynopsi
6760: 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65  s;.  int nOpName
6770: 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a  ;.  int ii, jj;.
6780: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    zOpName = sqli
6790: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
67a0: 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f  p->opcode);.  nO
67b0: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  pName = sqlite3S
67c0: 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29  trlen30(zOpName)
67d0: 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b  ;.  if( zOpName[
67e0: 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20  nOpName+1] ){.  
67f0: 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20    int seenCom = 
6800: 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  0;.    char c;. 
6810: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
6820: 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d  OpName += nOpNam
6830: 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  e + 1;.    for(i
6840: 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70  i=jj=0; jj<nTemp
6850: 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f  -1 && (c = zSyno
6860: 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69  psis[ii])!=0; ii
6870: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  ++){.      if( c
6880: 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20  =='P' ){.       
6890: 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b   c = zSynopsis[+
68a0: 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii];.        if
68b0: 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20  ( c=='4' ){.    
68c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
68d0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
68e0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
68f0: 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d   zP4);.        }
6900: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20  else if( c=='X' 
6910: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
6920: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6930: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
6940: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
6950: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  mment);.        
6960: 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20    seenCom = 1;. 
6970: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6980: 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d          int v1 =
6990: 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70   translateP(c, p
69a0: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Op);.          i
69b0: 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20  nt v2;.         
69c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
69d0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
69e0: 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b  p+jj, "%d", v1);
69f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
6a00: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
6a10: 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d  +ii+1, "@P", 2)=
6a20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6a30: 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20    ii += 3;.     
6a40: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
6a50: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
6a60: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20  mp+jj);.        
6a70: 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61      v2 = transla
6a80: 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69  teP(zSynopsis[ii
6a90: 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20  ], pOp);.       
6aa0: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
6ab0: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
6ac0: 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "+1",2)==0 ){.  
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
6ae0: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 2;.           
6af0: 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20     v2++;.       
6b00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6b10: 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20     if( v2>1 ){. 
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
6b30: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6b40: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
6b50: 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d  , "..%d", v1+v2-
6b60: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
6b70: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
6b80: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53  e if( strncmp(zS
6b90: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e  ynopsis+ii+1, ".
6ba0: 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70  .P3", 4)==0 && p
6bb0: 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20  Op->p3==0 ){.   
6bc0: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34           ii += 4
6bd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6be0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6bf0: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
6c00: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
6c10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6c20: 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b        zTemp[jj++
6c30: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = c;.      }. 
6c40: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65     }.    if( !se
6c50: 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d  enCom && jj<nTem
6c60: 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d  p-5 && pOp->zCom
6c70: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ment ){.      sq
6c80: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6c90: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
6ca0: 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e  j, "; %s", pOp->
6cb0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20  zComment);.     
6cc0: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
6cd0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
6ce0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6cf0: 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70  jj<nTemp ) zTemp
6d00: 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  [jj] = 0;.  }els
6d10: 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e if( pOp->zComm
6d20: 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
6d30: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6d40: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20  p, zTemp, "%s", 
6d50: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
6d60: 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33      jj = sqlite3
6d70: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
6d80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54  .  }else{.    zT
6d90: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
6da0: 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  jj = 0;.  }.  re
6db0: 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69  turn jj;.}.#endi
6dc0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
6dd0: 47 20 2a 2f 0a 0a 0a 23 69 66 20 21 64 65 66 69  G */...#if !defi
6de0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6df0: 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66  EXPLAIN) || !def
6e00: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20  ined(NDEBUG) \. 
6e10: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56      || defined(V
6e20: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
6e30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
6e40: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  EBUG)./*.** Comp
6e50: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
6e60: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
6e70: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
6e80: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
6e90: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
6ea0: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
6eb0: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
6ec0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
6ed0: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
6ee0: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
6ef0: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
6f00: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
6f10: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  p;.  assert( nTe
6f20: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74  mp>=20 );.  swit
6f30: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
6f40: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
6f50: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
6f60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
6f70: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
6f80: 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
6f90: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  Info;.      asse
6fa0: 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
6fb0: 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
6fc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6fd0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
6fe0: 6d 70 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79  mp, "k(%d", pKey
6ff0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
7000: 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33       i = sqlite3
7010: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
7020: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
7030: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  j<pKeyInfo->nFie
7040: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
7050: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
7060: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
7070: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63  ll[j];.        c
7080: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
7090: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
70a0: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b  ->zName : "nil";
70b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
70c0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
70d0: 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20  (zColl);.       
70e0: 20 69 66 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d   if( n==6 && mem
70f0: 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52  cmp(zColl,"BINAR
7100: 59 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Y",6)==0 ){.    
7110: 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42        zColl = "B
7120: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d  ";.          n =
7130: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
7140: 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54        if( i+n>nT
7150: 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20  emp-6 ){.       
7160: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
7170: 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20  [i],",...",4);. 
7180: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7190: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
71a0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
71b0: 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ,';.        if( 
71c0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
71d0: 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  rder[j] ){.     
71e0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
71f0: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d  = '-';.        }
7200: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
7210: 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c  &zTemp[i], zColl
7220: 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , n+1);.        
7230: 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  i += n;.      }.
7240: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
7250: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
7260: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
7270: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
7280: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
7290: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
72a0: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
72b0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
72c0: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
72d0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
72e0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
72f0: 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e 32 30  p, zTemp, "(%.20
7300: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
7310: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
7320: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7330: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
7340: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
7350: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  f = pOp->p4.pFun
7360: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
7370: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7380: 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22   zTemp, "%s(%d)"
7390: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
73a0: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
73b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
73c0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
73d0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
73e0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
73f0: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
7400: 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b   *pOp->p4.pI64);
7410: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7420: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
7430: 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73  INT32: {.      s
7440: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7450: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
7460: 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a  d", pOp->p4.i);.
7470: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7480: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52   }.    case P4_R
7490: 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EAL: {.      sql
74a0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
74b0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
74c0: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  6g", *pOp->p4.pR
74d0: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eal);.      brea
74e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
74f0: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
7500: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f    Mem *pMem = pO
7510: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20  p->p4.pMem;.    
7520: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
7530: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
7540: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65         zP4 = pMe
7550: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  m->z;.      }els
7560: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
7570: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
7580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
7590: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
75a0: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d  Temp, "%lld", pM
75b0: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20  em->u.i);.      
75c0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
75d0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
75e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
75f0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7600: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
7610: 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20  g", pMem->r);.  
7620: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
7630: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7640: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
7650: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7660: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
7670: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65  NULL");.      }e
7680: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
7690: 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  ert( pMem->flags
76a0: 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
76b0: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62         zP4 = "(b
76c0: 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20  lob)";.      }. 
76d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
76e0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
76f0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7700: 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56  LE.    case P4_V
7710: 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TAB: {.      sql
7720: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
7730: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62   = pOp->p4.pVtab
7740: 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73  ->pVtab;.      s
7750: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7760: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76  nTemp, zTemp, "v
7770: 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61  tab:%p:%p", pVta
7780: 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  b, pVtab->pModul
7790: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
77a0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
77b0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
77c0: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
77d0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
77e0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61  mp, zTemp, "inta
77f0: 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72  rray");.      br
7800: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7810: 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  ase P4_SUBPROGRA
7820: 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M: {.      sqlit
7830: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7840: 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72  p, zTemp, "progr
7850: 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  am");.      brea
7860: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7870: 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a  e P4_ADVANCE: {.
7880: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
7890: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
78a0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
78b0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20  lt: {.      zP4 
78c0: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
78d0: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b     if( zP4==0 ){
78e0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
78f0: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
7900: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
7910: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
7920: 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29  assert( zP4!=0 )
7930: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a  ;.  return zP4;.
7940: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7950: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56  Declare to the V
7960: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72  dbe that the BTr
7970: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d  ee object at db-
7980: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e  >aDb[i] is used.
7990: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61  .**.** The prepa
79a0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e  red statements n
79b0: 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61  eed to know in a
79c0: 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c  dvance the compl
79d0: 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74  ete set of.** at
79e0: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
79f0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
7a00: 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68  e.  A mask of th
7a10: 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  ese databases.**
7a20: 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69   is maintained i
7a30: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20  n p->btreeMask. 
7a40: 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b   The p->lockMask
7a50: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75   value is the su
7a60: 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74  bset of.** p->bt
7a70: 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62  reeMask of datab
7a80: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72  ases that will r
7a90: 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a  equire a lock..*
7aa0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
7ab0: 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65  beUsesBtree(Vdbe
7ac0: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61   *p, int i){.  a
7ad0: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
7ae0: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69  <p->db->nDb && i
7af0: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62  <(int)sizeof(yDb
7b00: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73  Mask)*8 );.  ass
7b10: 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65  ert( i<(int)size
7b20: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  of(p->btreeMask)
7b30: 2a 38 20 29 3b 0a 20 20 70 2d 3e 62 74 72 65 65  *8 );.  p->btree
7b40: 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73  Mask |= ((yDbMas
7b50: 6b 29 31 29 3c 3c 69 3b 0a 20 20 69 66 28 20 69  k)1)<<i;.  if( i
7b60: 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42 74  !=1 && sqlite3Bt
7b70: 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64  reeSharable(p->d
7b80: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29  b->aDb[i].pBt) )
7b90: 7b 0a 20 20 20 20 70 2d 3e 6c 6f 63 6b 4d 61 73  {.    p->lockMas
7ba0: 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31  k |= ((yDbMask)1
7bb0: 29 3c 3c 69 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  )<<i;.  }.}..#if
7bc0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7bd0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
7be0: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
7bf0: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
7c00: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f   If SQLite is co
7c10: 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72  mpiled to suppor
7c20: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
7c30: 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68  ode and to be th
7c40: 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69  readsafe,.** thi
7c50: 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e  s routine obtain
7c60: 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  s the mutex asso
7c70: 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
7c80: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
7c90: 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20  ure.** that may 
7ca0: 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74  be accessed by t
7cb0: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
7cc0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20  an argument. In 
7cd0: 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f  doing so it also
7ce0: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53  .** sets the BtS
7cf0: 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20  hared.db member 
7d00: 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42  of each of the B
7d10: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
7d20: 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20  es, ensuring.** 
7d30: 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  that the correct
7d40: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
7d50: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
7d60: 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a  d if required..*
7d70: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
7d80: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
7d90: 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72   but does suppor
7da0: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
7db0: 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c  ode, then.** sql
7dc0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
7dd0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73   is invoked to s
7de0: 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  et the BtShared.
7df0: 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  db variables.** 
7e00: 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72  of all of BtShar
7e10: 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63  ed structures ac
7e20: 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65  cessible via the
7e30: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
7e40: 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20   .** associated 
7e50: 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a  with the VM..**.
7e60: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
7e70: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61  not threadsafe a
7e80: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  nd does not supp
7e90: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
7ea0: 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66   mode, this.** f
7eb0: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
7ec0: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d  op..**.** The p-
7ed0: 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64  >btreeMask field
7ee0: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
7ef0: 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74   all btrees that
7f00: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a   the prepared .*
7f10: 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69  * statement p wi
7f20: 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65  ll ever use.  Le
7f30: 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65  t N be the numbe
7f40: 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e  r of bits in p->
7f50: 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72  btreeMask.** cor
7f60: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74  responding to bt
7f70: 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68  rees that use sh
7f80: 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65  ared cache.  The
7f90: 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66  n the runtime of
7fa0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
7fb0: 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73   is N*N.  But as
7fc0: 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72   N is rarely mor
7fd0: 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73  e than 1, this s
7fe0: 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20  hould not.** be 
7ff0: 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f  a problem..*/.vo
8000: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  id sqlite3VdbeEn
8010: 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ter(Vdbe *p){.  
8020: 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b  int i;.  yDbMask
8030: 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33   mask;.  sqlite3
8040: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b   *db;.  Db *aDb;
8050: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66  .  int nDb;.  if
8060: 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30  ( p->lockMask==0
8070: 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
8080: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
8090: 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  /.  db = p->db;.
80a0: 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b    aDb = db->aDb;
80b0: 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62  .  nDb = db->nDb
80c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73  ;.  for(i=0, mas
80d0: 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c  k=1; i<nDb; i++,
80e0: 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a   mask += mask){.
80f0: 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20      if( i!=1 && 
8100: 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d  (mask & p->lockM
8110: 61 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41 59  ask)!=0 && ALWAY
8120: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
8130: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8140: 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b  3BtreeEnter(aDb[
8150: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
8160: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
8170: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8180: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
8190: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
81a0: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
81b0: 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74   Unlock all of t
81c0: 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f  he btrees previo
81d0: 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61  usly locked by a
81e0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
81f0: 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a  VdbeEnter()..*/.
8200: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8210: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
8220: 20 20 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61    int i;.  yDbMa
8230: 73 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74  sk mask;.  sqlit
8240: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
8250: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
8260: 69 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d  if( p->lockMask=
8270: 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  =0 ) return;  /*
8280: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
8290: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   */.  db = p->db
82a0: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
82b0: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
82c0: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d  Db;.  for(i=0, m
82d0: 61 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b  ask=1; i<nDb; i+
82e0: 2b 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29  +, mask += mask)
82f0: 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26  {.    if( i!=1 &
8300: 26 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63  & (mask & p->loc
8310: 6b 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c 57  kMask)!=0 && ALW
8320: 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d  AYS(aDb[i].pBt!=
8330: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
8340: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44  te3BtreeLeave(aD
8350: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d  b[i].pBt);.    }
8360: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
8370: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
8380: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
8390: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
83a0: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
83b0: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
83c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
83d0: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
83e0: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
83f0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
8400: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
8410: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
8420: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20  {.  char *zP4;. 
8430: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
8440: 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d    char zCom[100]
8450: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
8460: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20   char *zFormat1 
8470: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64  = "%4d %-13s %4d
8480: 20 25 34 64 20 25 34 64 20 25 2d 31 33 73 20 25   %4d %4d %-13s %
8490: 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28  .2X %s\n";.  if(
84a0: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
84b0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20  = stdout;.  zP4 
84c0: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
84d0: 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50   zPtr, sizeof(zP
84e0: 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  tr));.#ifdef SQL
84f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
8500: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69  IN_COMMENTS.  di
8510: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
8520: 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a  , zP4, zCom, siz
8530: 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73  eof(zCom));.#els
8540: 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b  e.  zCom[0] = 0;
8550: 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a  .#endif.  /* NB:
8560: 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63    The sqlite3Opc
8570: 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69  odeName() functi
8580: 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
8590: 64 20 62 79 20 63 6f 64 65 20 63 72 65 61 74 65  d by code create
85a0: 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b  d.  ** by the mk
85b0: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20  opcodeh.awk and 
85c0: 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63  mkopcodec.awk sc
85d0: 72 69 70 74 73 20 77 68 69 63 68 20 65 78 74 72  ripts which extr
85e0: 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66  act the.  ** inf
85f0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
8600: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
8610: 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74  text */.  fprint
8620: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
8630: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
8640: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
8650: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
8660: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
8670: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
8680: 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d  ->p5,.      zCom
8690: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
86a0: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
86b0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
86c0: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
86d0: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
86e0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
86f0: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
8700: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
8710: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
8720: 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74  *pEnd;.    sqlit
8730: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
8740: 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61      u8 malloc_fa
8750: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
8760: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28  cFailed;.    if(
8770: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
8780: 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  d ){.      for(p
8790: 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e  End=&p[N]; p<pEn
87a0: 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; p++){.       
87b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
87c0: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
87d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
87e0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
87f0: 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20  for(pEnd=&p[N]; 
8800: 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20  p<pEnd; p++){.  
8810: 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b      assert( (&p[
8820: 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30  1])==pEnd || p[0
8830: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
8840: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
8850: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
8860: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20  emInvariants(p) 
8870: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
8880: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
8890: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
88a0: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
88b0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
88c0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
88d0: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
88e0: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
88f0: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
8900: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
8910: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
8920: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
8930: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
8940: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
8950: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
8960: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
8970: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
8980: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
8990: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
89a0: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
89b0: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
89c0: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
89d0: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
89e0: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
89f0: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
8a00: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
8a10: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
8a20: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
8a30: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
8a40: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
8a50: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
8a60: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
8a70: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
8a80: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
8a90: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
8aa0: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
8ab0: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
8ac0: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
8ad0: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
8ae0: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
8af0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
8b00: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
8b10: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
8b20: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
8b30: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
8b40: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
8b50: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
8b60: 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29  lags & MEM_Agg )
8b70: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8b80: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
8b90: 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65  _Dyn );.      te
8ba0: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
8bb0: 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29 3b 0a   & MEM_Frame );.
8bc0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8bd0: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  p->flags & MEM_R
8be0: 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20 20 69  owSet );.      i
8bf0: 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d  f( p->flags&(MEM
8c00: 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  _Agg|MEM_Dyn|MEM
8c10: 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65  _Frame|MEM_RowSe
8c20: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  t) ){.        sq
8c30: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
8c40: 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65  ase(p);.      }e
8c50: 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c  lse if( p->zMall
8c60: 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  oc ){.        sq
8c70: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8c80: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
8c90: 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20       p->zMalloc 
8ca0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
8cb0: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d      p->flags = M
8cc0: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20  EM_Undefined;.  
8cd0: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c    }.    db->mall
8ce0: 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f  ocFailed = mallo
8cf0: 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a  c_failed;.  }.}.
8d00: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
8d10: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
8d20: 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74   and its content
8d30: 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  s. VdbeFrame obj
8d40: 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ects are.** allo
8d50: 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  cated by the OP_
8d60: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
8d70: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  n sqlite3VdbeExe
8d80: 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c()..*/.void sql
8d90: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
8da0: 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ete(VdbeFrame *p
8db0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65  ){.  int i;.  Me
8dc0: 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72  m *aMem = VdbeFr
8dd0: 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62  ameMem(p);.  Vdb
8de0: 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20  eCursor **apCsr 
8df0: 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  = (VdbeCursor **
8e00: 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64  )&aMem[p->nChild
8e10: 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Mem];.  for(i=0;
8e20: 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b   i<p->nChildCsr;
8e30: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
8e40: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
8e50: 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29  (p->v, apCsr[i])
8e60: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
8e70: 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d  emArray(aMem, p-
8e80: 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73  >nChildMem);.  s
8e90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
8ea0: 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69  v->db, p);.}..#i
8eb0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8ec0: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
8ed0: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
8ee0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
8ef0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
8f00: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
8f10: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
8f20: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
8f30: 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74  VdbeExec().  But
8f40: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72   instead of.** r
8f50: 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c  unning the code,
8f60: 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20   it invokes the 
8f70: 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f  callback once fo
8f80: 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  r each instructi
8f90: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74  on..** This feat
8fa0: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
8fb0: 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49  mplement "EXPLAI
8fc0: 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  N"..**.** When p
8fd0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61  ->explain==1, ea
8fe0: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
8ff0: 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a  s listed.  When.
9000: 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  ** p->explain==2
9010: 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69  , only OP_Explai
9020: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  n instructions a
9030: 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68  re listed and th
9040: 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e  ese.** are shown
9050: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
9060: 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c  format.  p->expl
9070: 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74  ain==2 is used t
9080: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45  o implement.** E
9090: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
90a0: 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  N..**.** When p-
90b0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72  >explain==1, fir
90c0: 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  st the main prog
90d0: 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74  ram is listed, t
90e0: 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74  hen each of.** t
90f0: 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72  he trigger subpr
9100: 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65  ograms are liste
9110: 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f  d one by one..*/
9120: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
9130: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
9160: 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20  .){.  int nRow; 
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
9190: 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e  op when row coun
91a0: 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20 2a  t reaches this *
91b0: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30  /.  int nSub = 0
91c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
91d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
91e0: 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  er of sub-vdbes 
91f0: 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
9200: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
9210: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
9220: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
9230: 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20  f sub-vdbes */. 
9240: 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20   Mem *pSub = 0; 
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9260: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
9270: 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20  cell hold array 
9280: 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20  of subprogs */. 
9290: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
92a0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
92b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
92c0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
92d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
9300: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
9310: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9320: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
9330: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
9340: 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ode */.  Mem *pM
9350: 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  em = &p->aMem[1]
9360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
9370: 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65   First Mem of re
9380: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61  sult set */..  a
9390: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
93a0: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
93b0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
93c0: 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73  GIC_RUN );.  ass
93d0: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
93e0: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
93f0: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70  SQLITE_BUSY || p
9400: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
9410: 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  EM );..  /* Even
9420: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
9430: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ode does not use
9440: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
9450: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65   for.  ** the re
9460: 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c  sult, result col
9470: 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20  umns may become 
9480: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
9490: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
94a0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
94b0: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
94c0: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
94d0: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
94e0: 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
94f0: 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38  MemArray(pMem, 8
9500: 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  );.  p->pResultS
9510: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  et = 0;..  if( p
9520: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
9530: 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  EM ){.    /* Thi
9540: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
9550: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
9560: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
9570: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
9580: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
9590: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
95a0: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
95b0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
95c0: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
95d0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
95e0: 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74    }..  /* When t
95f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
9600: 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73  put rows reaches
9610: 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e   nRow, that mean
9620: 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69  s the.  ** listi
9630: 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ng has finished 
9640: 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70  and sqlite3_step
9650: 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  () should return
9660: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
9670: 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73  ** nRow is the s
9680: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
9690: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
96a0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c  main program, pl
96b0: 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20  us.  ** the sum 
96c0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
96d0: 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69   rows in all tri
96e0: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
96f0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
9700: 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e  * so far.  The n
9710: 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69  Row value will i
9720: 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74  ncrease as new t
9730: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
9740: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f  ms are.  ** enco
9750: 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e  untered, but p->
9760: 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  pc will eventual
9770: 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e  ly catch up to n
9780: 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77  Row..  */.  nRow
9790: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
97a0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
97b0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
97c0: 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  st 8 memory cell
97d0: 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74  s are used for t
97e0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
97f0: 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a  So we will.    *
9800: 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65  * commandeer the
9810: 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65   9th cell to use
9820: 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20   as storage for 
9830: 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
9840: 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ters.    ** to t
9850: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
9860: 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73  ms.  The VDBE is
9870: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68   guaranteed to h
9880: 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20  ave at least 9. 
9890: 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f     ** cells.  */
98a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
98b0: 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53  nMem>9 );.    pS
98c0: 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d  ub = &p->aMem[9]
98d0: 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  ;.    if( pSub->
98e0: 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29  flags&MEM_Blob )
98f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68  {.      /* On th
9900: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
9910: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20  sqlite3_step(), 
9920: 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61  pSub will hold a
9930: 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20   NULL.  It is.  
9940: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
9950: 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20  ed to a BLOB by 
9960: 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  the P4_SUBPROGRA
9970: 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  M processing log
9980: 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  ic below */.    
9990: 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e    nSub = pSub->n
99a0: 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a  /sizeof(Vdbe*);.
99b0: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
99c0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
99d0: 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b->z;.    }.    
99e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b  for(i=0; i<nSub;
99f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f   i++){.      nRo
9a00: 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e  w += apSub[i]->n
9a10: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  Op;.    }.  }.. 
9a20: 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e   do{.    i = p->
9a30: 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  pc++;.  }while( 
9a40: 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70  i<nRow && p->exp
9a50: 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f  lain==2 && p->aO
9a60: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
9a70: 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  Explain );.  if(
9a80: 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20   i>=nRow ){.    
9a90: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
9aa0: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
9ab0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
9ac0: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
9ad0: 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20  terrupted ){.   
9ae0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
9af0: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72  INTERRUPT;.    r
9b00: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
9b10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
9b20: 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
9b30: 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73 71  sg, db, "%s", sq
9b40: 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72  lite3ErrStr(p->r
9b50: 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  c));.  }else{.  
9b60: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20    char *zP4;.   
9b70: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66   Op *pOp;.    if
9b80: 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  ( i<p->nOp ){.  
9b90: 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
9ba0: 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73  t line number is
9bb0: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68   small enough th
9bc0: 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  at we are still 
9bd0: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
9be0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f  main program. */
9bf0: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d  .      pOp = &p-
9c00: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  >aOp[i];.    }el
9c10: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  se{.      /* We 
9c20: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69  are currently li
9c30: 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d  sting subprogram
9c40: 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77  s.  Figure out w
9c50: 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20  hich one and.   
9c60: 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68     ** pick up th
9c70: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70  e appropriate op
9c80: 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  code. */.      i
9c90: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d  nt j;.      i -=
9ca0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66   p->nOp;.      f
9cb0: 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62  or(j=0; i>=apSub
9cc0: 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a  [j]->nOp; j++){.
9cd0: 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53          i -= apS
9ce0: 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[j]->nOp;.    
9cf0: 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20    }.      pOp = 
9d00: 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69  &apSub[j]->aOp[i
9d10: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ];.    }.    if(
9d20: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
9d30: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  {.      pMem->fl
9d40: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
9d50: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
9d60: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f     /* Program co
9d90: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  unter */.      p
9da0: 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20  Mem++;.  .      
9db0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
9dc0: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72  M_Static|MEM_Str
9dd0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
9de0: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
9df0: 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  *)sqlite3OpcodeN
9e00: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
9e10: 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20  ; /* Opcode */. 
9e20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
9e30: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
9e40: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
9e50: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
9e60: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
9e70: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
9e80: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
9e90: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ;..      /* When
9ea0: 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f   an OP_Program o
9eb0: 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74  pcode is encount
9ec0: 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63  er (the only opc
9ed0: 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20  ode that has.   
9ee0: 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52     ** a P4_SUBPR
9ef0: 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c  OGRAM argument),
9f00: 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65   expand the size
9f10: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66   of the array of
9f20: 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20   subprograms.   
9f30: 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d     ** kept in p-
9f40: 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f  >aMem[9].z to ho
9f50: 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72  ld the new progr
9f60: 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68  am - assuming th
9f70: 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20  is subprogram.  
9f80: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61      ** has not a
9f90: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e  lready been seen
9fa0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
9fb0: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
9fc0: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
9fd0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
9fe0: 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a  Byte = (nSub+1)*
9ff0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
a000: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  m*);.        int
a010: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
a020: 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b  j=0; j<nSub; j++
a030: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
a040: 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e   apSub[j]==pOp->
a050: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
a060: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
a070: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53         if( j==nS
a080: 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  ub && SQLITE_OK=
a090: 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47  =sqlite3VdbeMemG
a0a0: 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c  row(pSub, nByte,
a0b0: 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20 20 20   nSub!=0) ){.   
a0c0: 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28         apSub = (
a0d0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
a0e0: 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20  ub->z;.         
a0f0: 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d   apSub[nSub++] =
a100: 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61   pOp->p4.pProgra
a110: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  m;.          pSu
a120: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  b->flags |= MEM_
a130: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20  Blob;.          
a140: 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73  pSub->n = nSub*s
a150: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
a160: 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  *);.        }.  
a170: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
a180: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
a190: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
a1a0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  ->u.i = pOp->p1;
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
a1d0: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
a1e0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
a1f0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
a200: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
a210: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a230: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P2 */.    pMem++
a240: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
a250: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
a260: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
a270: 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20  p->p3;          
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a290: 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P3 */.    pMe
a2a0: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71  m++;..    if( sq
a2b0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
a2c0: 28 70 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b  (pMem, 32, 0) ){
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a2e0: 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  4 */.      asser
a2f0: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
a300: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
a310: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
a320: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
a330: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a340: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
a350: 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79     zP4 = display
a360: 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c  P4(pOp, pMem->z,
a370: 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50   32);.    if( zP
a380: 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20  4!=pMem->z ){.  
a390: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
a3a0: 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a  emSetStr(pMem, z
a3b0: 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  P4, -1, SQLITE_U
a3c0: 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  TF8, 0);.    }el
a3d0: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
a3e0: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
a3f0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
a400: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
a410: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
a420: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
a430: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20  TE_UTF8;.    }. 
a440: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
a450: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
a460: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  1 ){.      if( s
a470: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
a480: 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b  w(pMem, 4, 0) ){
a490: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a4a0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
a4b0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
a4c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
a4d0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
a4e0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
a4f0: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
a500: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
a510: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
a520: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
a530: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c  pMem->z, "%.2x",
a540: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20   pOp->p5);   /* 
a550: 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P5 */.      pMem
a560: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
a570: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
a580: 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c  +;.  .#ifdef SQL
a590: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
a5a0: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
a5b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
a5c0: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 35  eMemGrow(pMem, 5
a5d0: 30 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  00, 0) ){.      
a5e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
a5f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
a600: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
a610: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
a620: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
a630: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
a640: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
a650: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70    pMem->n = disp
a660: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
a670: 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30  zP4, pMem->z, 50
a680: 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0);.      pMem->
a690: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
a6a0: 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70  8;.#else.      p
a6b0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a6c0: 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  _Null;          
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a6e0: 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69  Comment */.#endi
a6f0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  f.    }..    p->
a700: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
a710: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
a720: 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c  );.    p->pResul
a730: 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  tSet = &p->aMem[
a740: 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  1];.    p->rc = 
a750: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
a760: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
a770: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
a780: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
a790: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a7a0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a7b0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
a7c0: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
a7d0: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
a7e0: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
a7f0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
a800: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
a810: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63  ql(Vdbe *p){.  c
a820: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30  onst char *z = 0
a830: 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20  ;.  if( p->zSql 
a840: 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53  ){.    z = p->zS
a850: 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ql;.  }else if( 
a860: 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20  p->nOp>=1 ){.   
a870: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70   const VdbeOp *p
a880: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
a890: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
a8a0: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
a8b0: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
a8c0: 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e  .      z = pOp->
a8d0: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c  p4.z;.      whil
a8e0: 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
a8f0: 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
a900: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29   }.  }.  if( z )
a910: 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25   printf("SQL: [%
a920: 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e  s]\n", z);.}.#en
a930: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
a940: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
a950: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
a960: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
a970: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69  TRACE)./*.** Pri
a980: 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65  nt an IOTRACE me
a990: 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51  ssage showing SQ
a9a0: 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f  L content..*/.vo
a9b0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f  id sqlite3VdbeIO
a9c0: 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70  TraceSql(Vdbe *p
a9d0: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
a9e0: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
a9f0: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69  *pOp;.  if( sqli
aa00: 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20  te3IoTrace==0 ) 
aa10: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f  return;.  if( nO
aa20: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
aa30: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
aa40: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
aa50: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
aa60: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
aa70: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
aa80: 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a    char z[1000];.
aa90: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
aaa0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
aab0: 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  z, "%s", pOp->p4
aac0: 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  .z);.    for(i=0
aad0: 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ; sqlite3Isspace
aae0: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
aaf0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
ab00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
ab10: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
ab20: 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  (z[i]) ){.      
ab30: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20    if( z[i-1]!=' 
ab40: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
ab50: 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [j++] = ' ';.   
ab60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
ab70: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
ab80: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20  +] = z[i];.     
ab90: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
aba0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
abb0: 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25  e3IoTrace("SQL %
abc0: 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  s\n", z);.  }.}.
abd0: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
abe0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20  E_OMIT_TRACE && 
abf0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
ac00: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TRACE */../*.** 
ac10: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
ac20: 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65  rom a fixed size
ac30: 20 62 75 66 66 65 72 20 61 6e 64 20 72 65 74 75   buffer and retu
ac40: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
ac50: 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20 20  ** that space.  
ac60: 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  If insufficient 
ac70: 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
ac80: 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  le, return NULL.
ac90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20  .**.** The pBuf 
aca0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
acb0: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   initial value o
acc0: 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63  f a pointer whic
acd0: 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76  h will.** receiv
ace0: 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79  e the new memory
acf0: 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61  .  pBuf is norma
ad00: 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42  lly NULL.  If pB
ad10: 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c  uf is not.** NUL
ad20: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
ad30: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61   memory space ha
ad40: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
ad50: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61  llocated and tha
ad60: 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  t.** this routin
ad70: 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c  e should not all
ad80: 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65  ocate any new me
ad90: 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66  mory.  When pBuf
ada0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20   is not.** NULL 
adb0: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42  simply return pB
adc0: 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61  uf.  Only alloca
add0: 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70  te new memory sp
ade0: 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a  ace when pBuf.**
adf0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
ae00: 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d  nByte is the num
ae10: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
ae20: 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a  space needed..**
ae30: 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e  .** *ppFrom poin
ae40: 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20  ts to available 
ae50: 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70  space and pEnd p
ae60: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64  oints to the end
ae70: 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c   of the.** avail
ae80: 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65  able space.  Whe
ae90: 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63  n space is alloc
aea0: 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73  ated, *ppFrom is
aeb0: 20 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a   advanced past.*
aec0: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
aed0: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
aee0: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20  ..**.** *pnByte 
aef0: 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20  is a counter of 
af00: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
af10: 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68 61  tes of space tha
af20: 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a  t have failed.**
af30: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49   to allocate.  I
af40: 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75 66  f there is insuf
af50: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e  ficient space in
af60: 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69   *ppFrom to sati
af70: 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  sfy the.** reque
af80: 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  st, then increme
af90: 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68  nt *pnByte by th
afa0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
afb0: 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74  request..*/.stat
afc0: 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70  ic void *allocSp
afd0: 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75  ace(.  void *pBu
afe0: 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  f,          /* W
aff0: 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e  here return poin
b000: 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  ter will be stor
b010: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
b020: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
b030: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
b040: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
b050: 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20   u8 **ppFrom,   
b060: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
b070: 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a   Allocate from *
b080: 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a  ppFrom */.  u8 *
b090: 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  pEnd,           
b0a0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31   /* Pointer to 1
b0b0: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65   byte past the e
b0c0: 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75  nd of *ppFrom bu
b0d0: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ffer */.  int *p
b0e0: 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 2f  nByte          /
b0f0: 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * If allocation 
b100: 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20  cannot be made, 
b110: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74  increment *pnByt
b120: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
b130: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
b140: 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20  GNMENT(*ppFrom) 
b150: 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29 20  );.  if( pBuf ) 
b160: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e  return pBuf;.  n
b170: 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42  Byte = ROUND8(nB
b180: 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70  yte);.  if( &(*p
b190: 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d  pFrom)[nByte] <=
b1a0: 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75   pEnd ){.    pBu
b1b0: 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72  f = (void*)*ppFr
b1c0: 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20  om;.    *ppFrom 
b1d0: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73  += nByte;.  }els
b1e0: 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b  e{.    *pnByte +
b1f0: 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72  = nByte;.  }.  r
b200: 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f  eturn pBuf;.}../
b210: 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20  *.** Rewind the 
b220: 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65  VDBE back to the
b230: 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72   beginning in pr
b240: 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a  eparation for.**
b250: 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a   running it..*/.
b260: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
b270: 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b  Rewind(Vdbe *p){
b280: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
b290: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
b2a0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
b2b0: 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e  LE).  int i;.#en
b2c0: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21  dif.  assert( p!
b2d0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b2e0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
b2f0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20  AGIC_INIT );..  
b300: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
b310: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
b320: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
b330: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
b340: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
b350: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
b360: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
b370: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
b380: 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63  r. */.  p->magic
b390: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
b3a0: 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  N;..#ifdef SQLIT
b3b0: 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d  E_DEBUG.  for(i=
b3c0: 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  1; i<p->nMem; i+
b3d0: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
b3e0: 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70  p->aMem[i].db==p
b3f0: 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ->db );.  }.#end
b400: 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b  if.  p->pc = -1;
b410: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
b420: 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72  E_OK;.  p->error
b430: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
b440: 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  t;.  p->magic = 
b450: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
b460: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
b470: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
b480: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
b490: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
b4a0: 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d  55;.  p->iStatem
b4b0: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ent = 0;.  p->nF
b4c0: 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b  kConstraint = 0;
b4d0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
b4e0: 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20  FILE.  for(i=0; 
b4f0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
b500: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
b510: 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f  t = 0;.    p->aO
b520: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
b530: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
b540: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
b550: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
b560: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72  or execution for
b570: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
b580: 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e  after.** creatin
b590: 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  g the virtual ma
b5a0: 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76  chine.  This inv
b5b0: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
b5c0: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
b5d0: 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61  ng stack space a
b5e0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
b5f0: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
b600: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
b610: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
b620: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
b630: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
b640: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
b650: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
b660: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
b670: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
b680: 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63  y be called exac
b690: 74 20 6f 6e 63 65 20 6f 6e 20 61 20 65 61 63 68  t once on a each
b6a0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
b6b0: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  ..** After this 
b6c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
b6d0: 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
b6e0: 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64  n "packaged" and
b6f0: 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20   is ready.** to 
b700: 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73  run.  After this
b710: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
b720: 65 64 2c 20 66 75 74 68 65 72 20 63 61 6c 6c 73  ed, futher calls
b730: 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
b740: 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74  dbeAddOp() funct
b750: 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69  ions are prohibi
b760: 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ted.  This routi
b770: 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a  ne disconnects.*
b780: 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  * the Vdbe from 
b790: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
b7a0: 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e   that helped gen
b7b0: 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74  erate it so that
b7c0: 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65   the.** the Vdbe
b7d0: 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65   becomes an inde
b7e0: 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61  pendent entity a
b7f0: 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  nd the Parse obj
b800: 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65  ect can be.** de
b810: 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55  stroyed..**.** U
b820: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
b830: 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65  beRewind() proce
b840: 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20  dure to restore 
b850: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
b860: 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73  e back.** to its
b870: 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61   initial state a
b880: 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  fter it has been
b890: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   run..*/.void sq
b8a0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
b8b0: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
b8e0: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
b8f0: 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  rse             
b900: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
b910: 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
b920: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b940: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
b950: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
b960: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
b970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b980: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d   Number of param
b990: 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  eters */.  int n
b9a0: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
b9b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b9c0: 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79  ber of VM memory
b9d0: 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
b9e0: 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20  int nCursor;    
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
ba10: 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ors required */.
ba20: 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
ba50: 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72  guments in subpr
ba60: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
ba70: 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20  nOnce;          
ba80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ba90: 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20  mber of OP_Once 
baa0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  instructions */.
bab0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bad0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
bae0: 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20   */.  u8 *zCsr; 
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb00: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
bb10: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
bb20: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  ocation */.  u8 
bb30: 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *zEnd;          
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
bb50: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 61  irst byte past a
bb60: 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20  llocated memory 
bb70: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20      /* How much 
bba0: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20  extra memory is 
bbb0: 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73  needed */..  ass
bbc0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
bbd0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
bbe0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
bbf0: 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
bc00: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
bc10: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
bc20: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
bc30: 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a  e==p->pParse );.
bc40: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
bc50: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
bc60: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
bc70: 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e   nVar = pParse->
bc80: 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70  nVar;.  nMem = p
bc90: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e  Parse->nMem;.  n
bca0: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
bcb0: 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20  >nTab;.  nArg = 
bcc0: 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b  pParse->nMaxArg;
bcd0: 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73  .  nOnce = pPars
bce0: 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20  e->nOnce;.  if( 
bcf0: 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65  nOnce==0 ) nOnce
bd00: 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20   = 1; /* Ensure 
bd10: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74  at least one byt
bd20: 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  e in p->aOnceFla
bd30: 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46  g[] */.  .  /* F
bd40: 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72  or each cursor r
bd50: 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c  equired, also al
bd60: 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20  locate a memory 
bd70: 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a  cell. Memory.  *
bd80: 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d  * cells (nMem+1-
bd90: 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20  nCursor)..nMem, 
bda0: 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20  inclusive, will 
bdb0: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79  never be used by
bdc0: 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70  .  ** the vdbe p
bdd0: 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20  rogram. Instead 
bde0: 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f  they are used to
bdf0: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
be00: 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72  for.  ** VdbeCur
be10: 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72  sor/BtCursor str
be20: 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f  uctures. The blo
be30: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
be40: 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a  ciated with .  *
be50: 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74  * cursor 0 is st
be60: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ored in memory c
be70: 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79  ell nMem. Memory
be80: 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20   cell (nMem-1). 
be90: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62   ** stores the b
bea0: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
beb0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
bec0: 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a  rsor 1, etc..  *
bed0: 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  *.  ** See also:
bee0: 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
bef0: 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
bf00: 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  = nCursor;..  /*
bf10: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
bf20: 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  for memory regis
bf30: 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62  ters, SQL variab
bf40: 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72  les, VDBE cursor
bf50: 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61  s and .  ** an a
bf60: 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20  rray to marshal 
bf70: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67  SQL function arg
bf80: 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a  uments in..  */.
bf90: 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70    zCsr = (u8*)&p
bfa0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20  ->aOp[p->nOp];  
bfb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
bfc0: 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f  ory avaliable fo
bfd0: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
bfe0: 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26 70    zEnd = (u8*)&p
bff0: 2d 3e 61 4f 70 5b 70 50 61 72 73 65 2d 3e 6e 4f  ->aOp[pParse->nO
c000: 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72  pAlloc];  /* Fir
c010: 73 74 20 62 79 74 65 20 70 61 73 74 20 65 6e 64  st byte past end
c020: 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20   of zCsr[] */.. 
c030: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
c040: 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d  (p, &nArg);.  p-
c050: 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
c060: 20 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e   = (u8)(pParse->
c070: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20  isMultiWrite && 
c080: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
c090: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
c0a0: 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  >explain && nMem
c0b0: 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20  <10 ){.    nMem 
c0c0: 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  = 10;.  }.  mems
c0d0: 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64  et(zCsr, 0, zEnd
c0e0: 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b  -zCsr);.  zCsr +
c0f0: 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30  = (zCsr - (u8*)0
c100: 29 26 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45  )&7;.  assert( E
c110: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
c120: 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70  ENT(zCsr) );.  p
c130: 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a  ->expired = 0;..
c140: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20    /* Memory for 
c150: 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d  registers, param
c160: 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65  eters, cursor, e
c170: 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  tc, is allocated
c180: 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73   in two.  ** pas
c190: 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72  ses.  On the fir
c1a0: 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20  st pass, we try 
c1b0: 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20  to reuse unused 
c1c0: 73 70 61 63 65 20 61 74 20 74 68 65 20 0a 20 20  space at the .  
c1d0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  ** end of the op
c1e0: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20  code array.  If 
c1f0: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
c200: 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d   satisfy all mem
c210: 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ory.  ** require
c220: 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
c230: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
c240: 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
c250: 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73   second.  ** pas
c260: 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74  s will fill in t
c270: 68 65 20 72 65 73 74 20 75 73 69 6e 67 20 61 20  he rest using a 
c280: 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e  fresh allocation
c290: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
c2a0: 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72  is two-pass appr
c2b0: 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73  oach that reuses
c2c0: 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
c2d0: 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d  as possible from
c2e0: 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76  .  ** the leftov
c2f0: 65 72 20 73 70 61 63 65 20 61 74 20 74 68 65 20  er space at the 
c300: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
c310: 65 20 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e  e array can sign
c320: 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72  ificantly.  ** r
c330: 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74  educe the amount
c340: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20   of memory held 
c350: 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74  by a prepared st
c360: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
c370: 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  do {.    nByte =
c380: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20   0;.    p->aMem 
c390: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
c3a0: 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f  aMem, nMem*sizeo
c3b0: 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a  f(Mem), &zCsr, z
c3c0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
c3d0: 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f    p->aVar = allo
c3e0: 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20  cSpace(p->aVar, 
c3f0: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
c400: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
c410: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
c420: 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pArg = allocSpac
c430: 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67  e(p->apArg, nArg
c440: 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26  *sizeof(Mem*), &
c450: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
c460: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61  te);.    p->azVa
c470: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
c480: 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69  ->azVar, nVar*si
c490: 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43  zeof(char*), &zC
c4a0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
c4b0: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20  );.    p->apCsr 
c4c0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
c4d0: 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73  apCsr, nCursor*s
c4e0: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
c4f0: 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  *),.            
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
c510: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
c520: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65  e);.    p->aOnce
c530: 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  Flag = allocSpac
c540: 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  e(p->aOnceFlag, 
c550: 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45  nOnce, &zCsr, zE
c560: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
c570: 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20   if( nByte ){.  
c580: 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73      p->pFree = s
c590: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
c5a0: 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  ro(db, nByte);. 
c5b0: 20 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20     }.    zCsr = 
c5c0: 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a 45  p->pFree;.    zE
c5d0: 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65  nd = &zCsr[nByte
c5e0: 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42 79  ];.  }while( nBy
c5f0: 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  te && !db->mallo
c600: 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d  cFailed );..  p-
c610: 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73  >nCursor = nCurs
c620: 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c  or;.  p->nOnceFl
c630: 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66  ag = nOnce;.  if
c640: 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20  ( p->aVar ){.   
c650: 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61   p->nVar = (ynVa
c660: 72 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72 28  r)nVar;.    for(
c670: 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b  n=0; n<nVar; n++
c680: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  ){.      p->aVar
c690: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  [n].flags = MEM_
c6a0: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Null;.      p->a
c6b0: 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Var[n].db = db;.
c6c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
c6d0: 70 2d 3e 61 7a 56 61 72 20 29 7b 0a 20 20 20 20  p->azVar ){.    
c6e0: 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73  p->nzVar = pPars
c6f0: 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65  e->nzVar;.    me
c700: 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70  mcpy(p->azVar, p
c710: 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d  Parse->azVar, p-
c720: 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d  >nzVar*sizeof(p-
c730: 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20  >azVar[0]));.   
c740: 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e   memset(pParse->
c750: 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65  azVar, 0, pParse
c760: 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70  ->nzVar*sizeof(p
c770: 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29  Parse->azVar[0])
c780: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
c790: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61  aMem ){.    p->a
c7a0: 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20  Mem--;          
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
c7c0: 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20  Mem[] goes from 
c7d0: 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70  1..nMem */.    p
c7e0: 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20  ->nMem = nMem;  
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c800: 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d  *       not from
c810: 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20   0..nMem-1 */.  
c820: 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d    for(n=1; n<=nM
c830: 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  em; n++){.      
c840: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73  p->aMem[n].flags
c850: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
c860: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  ;.      p->aMem[
c870: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
c880: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61  }.  }.  p->expla
c890: 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70  in = pParse->exp
c8a0: 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56  lain;.  sqlite3V
c8b0: 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a  dbeRewind(p);.}.
c8c0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56  ./*.** Close a V
c8d0: 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72  DBE cursor and r
c8e0: 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72  elease all the r
c8f0: 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75  esources that cu
c900: 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73  rsor .** happens
c910: 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69   to hold..*/.voi
c920: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65  d sqlite3VdbeFre
c930: 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c  eCursor(Vdbe *p,
c940: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78   VdbeCursor *pCx
c950: 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20  ){.  if( pCx==0 
c960: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
c970: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
c980: 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64  SorterClose(p->d
c990: 62 2c 20 70 43 78 29 3b 0a 20 20 69 66 28 20 70  b, pCx);.  if( p
c9a0: 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73  Cx->pBt ){.    s
c9b0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
c9c0: 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pCx->pBt);.    
c9d0: 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72  /* The pCx->pCur
c9e0: 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73  sor will be clos
c9f0: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c  e automatically,
ca00: 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62   if it exists, b
ca10: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c  y.    ** the cal
ca20: 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65  l above. */.  }e
ca30: 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75  lse if( pCx->pCu
ca40: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
ca50: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
ca60: 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72  sor(pCx->pCursor
ca70: 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
ca80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
ca90: 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43  ALTABLE.  if( pC
caa0: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29  x->pVtabCursor )
cab0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74  {.    sqlite3_vt
cac0: 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62  ab_cursor *pVtab
cad0: 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56  Cursor = pCx->pV
cae0: 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63  tabCursor;.    c
caf0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
cb00: 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70  ule *pModule = p
cb10: 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61  VtabCursor->pVta
cb20: 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20  b->pModule;.    
cb30: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
cb40: 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65  = 1;.    pModule
cb50: 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75  ->xClose(pVtabCu
cb60: 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  rsor);.    p->in
cb70: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a  VtabMethod = 0;.
cb80: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
cb90: 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c  .** Copy the val
cba0: 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ues stored in th
cbb0: 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75  e VdbeFrame stru
cbc0: 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62  cture to its Vdb
cbd0: 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73  e. This.** is us
cbe0: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ed, for example,
cbf0: 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20   when a trigger 
cc00: 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68  sub-program is h
cc10: 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65  alted to restore
cc20: 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74  .** control to t
cc30: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  he main program.
cc40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
cc50: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28  dbeFrameRestore(
cc60: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
cc70: 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  e){.  Vdbe *v = 
cc80: 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e  pFrame->v;.  v->
cc90: 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61  aOnceFlag = pFra
cca0: 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20  me->aOnceFlag;. 
ccb0: 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20   v->nOnceFlag = 
ccc0: 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61  pFrame->nOnceFla
ccd0: 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46  g;.  v->aOp = pF
cce0: 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e  rame->aOp;.  v->
ccf0: 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f  nOp = pFrame->nO
cd00: 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70  p;.  v->aMem = p
cd10: 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76  Frame->aMem;.  v
cd20: 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->nMem = pFrame-
cd30: 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73  >nMem;.  v->apCs
cd40: 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73  r = pFrame->apCs
cd50: 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20  r;.  v->nCursor 
cd60: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f  = pFrame->nCurso
cd70: 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74  r;.  v->db->last
cd80: 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e  Rowid = pFrame->
cd90: 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e  lastRowid;.  v->
cda0: 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65  nChange = pFrame
cdb0: 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65 74  ->nChange;.  ret
cdc0: 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a  urn pFrame->pc;.
cdd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
cde0: 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a  ll cursors..**.*
cdf0: 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61  * Also release a
ce00: 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  ny dynamic memor
ce10: 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d  y held by the VM
ce20: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65   in the Vdbe.aMe
ce30: 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  m memory .** cel
ce40: 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73  l array. This is
ce50: 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
ce60: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72  e memory cell ar
ce70: 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a  ray may contain.
ce80: 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56  ** pointers to V
ce90: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
cea0: 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74  , which may in t
ceb0: 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  urn contain poin
cec0: 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20  ters to.** open 
ced0: 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  cursors..*/.stat
cee0: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
cef0: 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29  Cursors(Vdbe *p)
cf00: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  {.  if( p->pFram
cf10: 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
cf20: 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20  me *pFrame;.    
cf30: 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46  for(pFrame=p->pF
cf40: 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50  rame; pFrame->pP
cf50: 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46  arent; pFrame=pF
cf60: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
cf70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
cf80: 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61  rameRestore(pFra
cf90: 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 46  me);.  }.  p->pF
cfa0: 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  rame = 0;.  p->n
cfb0: 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66  Frame = 0;..  if
cfc0: 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20  ( p->apCsr ){.  
cfd0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
cfe0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
cff0: 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
d000: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d  VdbeCursor *pC =
d010: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
d020: 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20      if( pC ){.  
d030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d040: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
d050: 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  C);.        p->a
d060: 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
d070: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
d080: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
d090: 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72      releaseMemAr
d0a0: 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c  ray(&p->aMem[1],
d0b0: 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20   p->nMem);.  }. 
d0c0: 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46   while( p->pDelF
d0d0: 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
d0e0: 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d  Frame *pDel = p-
d0f0: 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20  >pDelFrame;.    
d100: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70  p->pDelFrame = p
d110: 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  Del->pParent;.  
d120: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
d130: 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a  meDelete(pDel);.
d140: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
d150: 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c   any auxdata all
d160: 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ocations made by
d170: 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 73 71 6c   the VM */.  sql
d180: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
d190: 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b  xData(p, -1, 0);
d1a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41  .  assert( p->pA
d1b0: 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a  uxData==0 );.}..
d1c0: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74  /*.** Clean up t
d1d0: 68 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63  he VM after exec
d1e0: 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ution..**.** Thi
d1f0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61  s routine will a
d200: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
d210: 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20  se any cursors, 
d220: 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a  lists, and/or.**
d230: 20 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65   sorters that we
d240: 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49  re left open.  I
d250: 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74  t also deletes t
d260: 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20  he values of.** 
d270: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65  variables in the
d280: 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a   aVar[] array..*
d290: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c  /.static void Cl
d2a0: 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a  eanup(Vdbe *p){.
d2b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d2c0: 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53  p->db;..#ifdef S
d2d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
d2e0: 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28   Execute assert(
d2f0: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
d300: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
d310: 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64  Vdbe.apCsr[] and
d320: 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d   .  ** Vdbe.aMem
d330: 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61  [] arrays have a
d340: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61  lready been clea
d350: 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e  ned up.  */.  in
d360: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
d370: 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69  Csr ) for(i=0; i
d380: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
d390: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43  ) assert( p->apC
d3a0: 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66  sr[i]==0 );.  if
d3b0: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
d3c0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e   for(i=1; i<=p->
d3d0: 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72  nMem; i++) asser
d3e0: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c  t( p->aMem[i].fl
d3f0: 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e  ags==MEM_Undefin
d400: 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed );.  }.#endif
d410: 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
d420: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
d430: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
d440: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
d450: 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tSet = 0;.}../*.
d460: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
d470: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
d480: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
d490: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
d4a0: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
d4b0: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
d4c0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
d4d0: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
d4e0: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
d4f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
d500: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
d510: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
d520: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
d530: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
d540: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
d550: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
d560: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
d570: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
d580: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
d590: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
d5a0: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
d5b0: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
d5c0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
d5d0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
d5e0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
d5f0: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
d600: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
d610: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
d620: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e  olName);.  n = n
d630: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
d640: 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
d650: 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
d660: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
d670: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
d680: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
d690: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
d6a0: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
d6b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
d6c0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
d6d0: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
d6e0: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  0 ){.    pColNam
d6f0: 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  e->flags = MEM_N
d700: 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  ull;.    pColNam
d710: 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e->db = p->db;. 
d720: 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20     pColName++;. 
d730: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
d740: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
d750: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
d760: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
d770: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
d780: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
d790: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
d7a0: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
d7b0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
d7c0: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
d7d0: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
d7e0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
d7f0: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
d800: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20  **.** The final 
d810: 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c  parameter, xDel,
d820: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
d830: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
d840: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a  SQLITE_STATIC.**
d850: 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   or SQLITE_TRANS
d860: 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53  IENT. If it is S
d870: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74  QLITE_DYNAMIC, t
d880: 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
d890: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
d8a0: 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72  zName will be fr
d8b0: 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62  eed by sqlite3Db
d8c0: 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
d8d0: 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65  vdbe is destroye
d8e0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
d8f0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d900: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d920: 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e      /* Vdbe bein
d930: 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a  g configured */.
d940: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
d970: 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c  olumn zName appl
d980: 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ies to */.  int 
d990: 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  var,            
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d9b0: 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41  One of the COLNA
d9c0: 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a  ME_* constants *
d9d0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
d9e0: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
d9f0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
da00: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
da10: 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76  ning name */.  v
da20: 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
da30: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
da40: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  /* Memory manage
da50: 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f  ment strategy fo
da60: 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  r zName */.){.  
da70: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70  int rc;.  Mem *p
da80: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  ColName;.  asser
da90: 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f  t( idx<p->nResCo
daa0: 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
dab0: 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20  ( var<COLNAME_N 
dac0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
dad0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
dae0: 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61      assert( !zNa
daf0: 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49  me || xDel!=SQLI
db00: 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20  TE_DYNAMIC );.  
db10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
db20: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73  NOMEM;.  }.  ass
db30: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
db40: 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
db50: 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
db60: 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
db70: 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20  sColumn]);.  rc 
db80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
db90: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
dba0: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
dbb0: 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a  TE_UTF8, xDel);.
dbc0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20    assert( rc!=0 
dbd0: 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43  || !zName || (pC
dbe0: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45  olName->flags&ME
dbf0: 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20  M_Term)!=0 );.  
dc00: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
dc10: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
dc20: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
dc30: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
dc40: 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
dc50: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
dc60: 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
dc70: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
dc80: 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
dc90: 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
dca0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
dcb0: 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
dcc0: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
dcd0: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
dce0: 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
dcf0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
dd00: 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
dd10: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
dd20: 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
dd30: 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
dd40: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
dd50: 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
dd60: 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
dd70: 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
dd80: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
dd90: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
dda0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
ddb0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
ddc0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
ddd0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
dde0: 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69  LE.  /* With thi
ddf0: 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65  s option, sqlite
de00: 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64  3VtabSync() is d
de10: 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d  efined to be sim
de20: 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45  ply .  ** SQLITE
de30: 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20  _OK so p is not 
de40: 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e  used. .  */.  UN
de50: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
de60: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
de70: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
de80: 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
de90: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
dea0: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
deb0: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
dec0: 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
ded0: 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
dee0: 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
def0: 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
df00: 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
df10: 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
df20: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
df30: 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
df40: 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
df50: 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
df60: 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
df70: 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
df80: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
df90: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
dfa0: 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
dfb0: 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  p);..  /* This l
dfc0: 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
dfd0: 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
dfe0: 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
dff0: 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
e000: 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
e010: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
e020: 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
e030: 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
e040: 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
e050: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
e060: 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
e070: 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
e080: 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
e090: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
e0a0: 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
e0b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
e0c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
e0d0: 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
e0e0: 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
e0f0: 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
e100: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d   .  for(i=0; rc=
e110: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
e120: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
e130: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
e140: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
e150: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
e160: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
e170: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65  Bt) ){.      nee
e180: 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  dXcommit = 1;.  
e190: 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e      if( i!=1 ) n
e1a0: 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73  Trans++;.      s
e1b0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
e1c0: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20  (pBt);.      rc 
e1d0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  = sqlite3PagerEx
e1e0: 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69  clusiveLock(sqli
e1f0: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
e200: 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t));.      sqlit
e210: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
e220: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
e230: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e240: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
e250: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  c;.  }..  /* If 
e260: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72  there are any wr
e270: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite-transactions
e280: 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20   at all, invoke 
e290: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
e2a0: 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f  */.  if( needXco
e2b0: 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d  mmit && db->xCom
e2c0: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  mitCallback ){. 
e2d0: 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d     rc = db->xCom
e2e0: 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  mitCallback(db->
e2f0: 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20  pCommitArg);.   
e300: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
e310: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e320: 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
e330: 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  HOOK;.    }.  }.
e340: 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65  .  /* The simple
e350: 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20   case - no more 
e360: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
e370: 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e  e file (not coun
e380: 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45  ting the.  ** TE
e390: 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73  MP database) has
e3a0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61   a transaction a
e3b0: 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69  ctive.   There i
e3c0: 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68  s no need for th
e3d0: 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f  e.  ** master-jo
e3e0: 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  urnal..  **.  **
e3f0: 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
e400: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42  alue of sqlite3B
e410: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
e420: 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67  ) is a zero leng
e430: 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20  th.  ** string, 
e440: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69  it means the mai
e450: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d  n database is :m
e460: 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70  emory: or a temp
e470: 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a   file.  In .  **
e480: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f   that case we do
e490: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f   not support ato
e4a0: 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  mic multi-file c
e4b0: 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74  ommits, so use t
e4c0: 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20  he .  ** simple 
e4d0: 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20  case then too.. 
e4e0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c   */.  if( 0==sql
e4f0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c  ite3Strlen30(sql
e500: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
e510: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
e520: 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61  pBt)).   || nTra
e530: 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66  ns<=1.  ){.    f
e540: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
e550: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
e560: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
e570: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
e580: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
e590: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
e5a0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e5b0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
e5c0: 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20  seOne(pBt, 0);. 
e5d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
e5e0: 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d    /* Do the comm
e5f0: 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64  it only if all d
e600: 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73  atabases success
e610: 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70  fully complete p
e620: 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20  hase 1. .    ** 
e630: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74  If one of the Bt
e640: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
e650: 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c  e() calls fails,
e660: 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
e670: 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72  an.    ** IO err
e680: 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e  or while deletin
e690: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
e6a0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
e6b0: 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a  It is unlikely,.
e6c0: 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64      ** but could
e6d0: 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73   happen. In this
e6e0: 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72   case abandon pr
e6f0: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
e700: 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20  urn the error.. 
e710: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
e720: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
e730: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
e740: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
e750: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
e760: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
e770: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
e780: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
e790: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
e7a0: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
e7b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
e7c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e7d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
e7e0: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
e7f0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
e800: 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d  e complex case -
e810: 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74   There is a mult
e820: 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61  i-file write-tra
e830: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
e840: 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69  .  ** This requi
e850: 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  res a master jou
e860: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73  rnal file to ens
e870: 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
e880: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d  ion is.  ** comm
e890: 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a  itted atomicly..
e8a0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
e8b0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
e8c0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
e8d0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
e8e0: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  db->pVfs;.    in
e8f0: 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
e900: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
e910: 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65  r = 0;   /* File
e920: 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61  -name for the ma
e930: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster journal */.
e940: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
e950: 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
e960: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
e970: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
e980: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
e990: 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d  _file *pMaster =
e9a0: 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73   0;.    i64 offs
e9b0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  et = 0;.    int 
e9c0: 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  res;.    int ret
e9d0: 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ryCount = 0;.   
e9e0: 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a   int nMainFile;.
e9f0: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61  .    /* Select a
ea00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ea10: 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  file name */.   
ea20: 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c   nMainFile = sql
ea30: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
ea40: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61  inFile);.    zMa
ea50: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  ster = sqlite3MP
ea60: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a  rintf(db, "%s-mj
ea70: 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61  XXXXXX9XXz", zMa
ea80: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  inFile);.    if(
ea90: 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65   zMaster==0 ) re
eaa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
eab0: 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  M;.    do {.    
eac0: 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20    u32 iRandom;. 
ead0: 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f       if( retryCo
eae0: 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unt ){.        i
eaf0: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30  f( retryCount>10
eb00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
eb10: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
eb20: 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65  E_FULL, "MJ dele
eb30: 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  te: %s", zMaster
eb40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
eb50: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
eb60: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
eb70: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
eb80: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
eb90: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31  f( retryCount==1
eba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
ebb0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
ebc0: 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69  _FULL, "MJ colli
ebd0: 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  de: %s", zMaster
ebe0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ebf0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79     }.      retry
ec00: 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  Count++;.      s
ec10: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
ec20: 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d  s(sizeof(iRandom
ec30: 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20  ), &iRandom);.  
ec40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
ec50: 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65  intf(13, &zMaste
ec60: 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d  r[nMainFile], "-
ec70: 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20  mj%06X9%02X",.  
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52               (iR
eca0: 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66  andom>>8)&0xffff
ecb0: 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66  ff, iRandom&0xff
ecc0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
ecd0: 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20  antipenultimate 
ece0: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
ecf0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ed00: 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20  name must.      
ed10: 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f  ** be "9" to avo
ed20: 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f  id name collisio
ed30: 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b  ns when using 8+
ed40: 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a  3 filenames. */.
ed50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d        assert( zM
ed60: 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72  aster[sqlite3Str
ed70: 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33  len30(zMaster)-3
ed80: 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20  ]=='9' );.      
ed90: 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
eda0: 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d  x3(zMainFile, zM
edb0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63  aster);.      rc
edc0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
edd0: 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
ede0: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
edf0: 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
ee00: 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
ee10: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20  QLITE_OK && res 
ee20: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
ee30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ee40: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
ee50: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  ster journal. */
ee60: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ee70: 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28  te3OsOpenMalloc(
ee80: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26  pVfs, zMaster, &
ee90: 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20  pMaster, .      
eea0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
eeb0: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
eec0: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
eed0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
eee0: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
eef0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
ef00: 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20  _JOURNAL, 0.    
ef10: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
ef20: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ef30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ef40: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
ef50: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
ef60: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20  rn rc;.    }. . 
ef70: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
ef80: 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74  name of each dat
ef90: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
efa0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
efb0: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
efc0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
efd0: 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72   file. If an err
efe0: 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  or occurs at thi
eff0: 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20  s point close.  
f000: 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20    ** and delete 
f010: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f020: 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65  al file. All the
f030: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
f040: 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a  nal files.    **
f050: 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c   still have 'nul
f060: 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72  l' as the master
f070: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
f080: 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72  , so they will r
f090: 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20  oll.    ** back 
f0a0: 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66  independently if
f0b0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
f0c0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
f0d0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
f0e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
f0f0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
f100: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
f110: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
f120: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
f130: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
f140: 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73  const *zFile = s
f150: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f  qlite3BtreeGetJo
f160: 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a  urnalname(pBt);.
f170: 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
f180: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
f190: 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
f1a0: 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20  Ignore TEMP and 
f1b0: 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73  :memory: databas
f1c0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  es */.        }.
f1d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f1e0: 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20  zFile[0]!=0 );. 
f1f0: 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64         if( !need
f200: 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33  Sync && !sqlite3
f210: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
f220: 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  d(pBt) ){.      
f230: 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
f240: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f250: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f260: 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
f270: 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53   zFile, sqlite3S
f280: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
f290: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
f2a0: 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c     offset += sql
f2b0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
f2c0: 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  le)+1;.        i
f2d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f2e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
f2f0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
f300: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
f310: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
f320: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
f330: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
f340: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
f350: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
f360: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
f370: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
f380: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
f390: 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
f3a0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
f3b0: 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
f3c0: 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a  QUENTIAL device.
f3d0: 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
f3e0: 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  et this is not r
f3f0: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
f400: 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
f410: 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71   .     && 0==(sq
f420: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
f430: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
f440: 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
f450: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20  AP_SEQUENTIAL). 
f460: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
f470: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
f480: 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
f490: 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
f4a0: 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
f4b0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
f4c0: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
f4d0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
f4e0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
f4f0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
f500: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
f510: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
f520: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
f530: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
f540: 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
f550: 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
f560: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
f570: 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
f580: 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
f590: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
f5a0: 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
f5b0: 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
f5c0: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
f5d0: 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
f5e0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
f5f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f600: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
f610: 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
f620: 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
f630: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
f640: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
f650: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
f660: 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
f670: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
f680: 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
f690: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
f6a0: 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
f6b0: 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
f6c0: 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
f6d0: 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
f6e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
f6f0: 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
f700: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
f710: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
f720: 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
f730: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a   occurred..    *
f740: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
f750: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
f760: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
f770: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
f780: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
f790: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
f7a0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
f7b0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
f7c0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
f7d0: 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
f7e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
f7f0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
f800: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
f810: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
f820: 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69  TE_BUSY );.    i
f830: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f840: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f850: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
f860: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
f870: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
f880: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
f890: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
f8a0: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
f8b0: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
f8c0: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
f8d0: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
f8e0: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
f8f0: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
f900: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
f910: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
f920: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
f930: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
f940: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
f950: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
f960: 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
f970: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
f980: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
f990: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
f9a0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
f9b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
f9c0: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
f9d0: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
f9e0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
f9f0: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
fa00: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
fa10: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
fa20: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
fa30: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
fa40: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
fa50: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
fa60: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
fa70: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
fa80: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
fa90: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
faa0: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
fab0: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
fac0: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
fad0: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
fae0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
faf0: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
fb00: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
fb10: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
fb20: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
fb30: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
fb40: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
fb50: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
fb60: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
fb70: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
fb80: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
fb90: 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
fba0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
fbb0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
fbc0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
fbd0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
fbe0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
fbf0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
fc00: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
fc10: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
fc20: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
fc30: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
fc40: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
fc50: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
fc60: 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
fc70: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
fc80: 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
fc90: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
fca0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
fcb0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
fcc0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
fcd0: 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
fce0: 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63   sqlite3.nVdbeAc
fcf0: 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61  tive count varia
fd00: 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
fd10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
fd20: 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
fd30: 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
fd40: 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
fd50: 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
fd60: 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
fd70: 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
fd80: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
fd90: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
fda0: 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
fdb0: 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
fdc0: 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
fdd0: 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
fde0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
fdf0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
fe00: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
fe10: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
fe20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
fe30: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
fe40: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
fe50: 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
fe60: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  nt = 0;.  int nW
fe70: 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rite = 0;.  int 
fe80: 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d  nRead = 0;.  p =
fe90: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
fea0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
feb0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
fec0: 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d  _MAGIC_RUN && p-
fed0: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  >pc>=0 ){.      
fee0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
fef0: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
ff00: 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ) nWrite++;.    
ff10: 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64    if( p->bIsRead
ff20: 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20  er ) nRead++;.  
ff30: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
ff40: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Next;.  }.  asse
ff50: 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64  rt( cnt==db->nVd
ff60: 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73  beActive );.  as
ff70: 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62  sert( nWrite==db
ff80: 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a  ->nVdbeWrite );.
ff90: 20 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d    assert( nRead=
ffa0: 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29  =db->nVdbeRead )
ffb0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
ffc0: 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
ffd0: 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
ffe0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62  /*.** If the Vdb
fff0: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
10000 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f  first argument o
10010 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e  pened a statemen
10020 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  t-transaction,.*
10030 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20  * close it now. 
10040 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73  Argument eOp mus
10050 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45  t be either SAVE
10060 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f  POINT_ROLLBACK o
10070 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  r.** SAVEPOINT_R
10080 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73  ELEASE. If it is
10090 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
100a0 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74  ACK, then the st
100b0 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
100c0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
100d0 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73   back. If eOp is
100e0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
100f0 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  SE, then the .**
10100 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10110 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
10120 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
10130 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
10140 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
10150 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
10160 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
10170 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49  * Otherwise SQLI
10180 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
10190 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
101a0 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
101b0 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c   int eOp){.  sql
101c0 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d  ite3 *const db =
101d0 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
101e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
101f0 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65   /* If p->iState
10200 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  ment is greater 
10210 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
10220 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64  this Vdbe opened
10230 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65   a .  ** stateme
10240 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  nt transaction t
10250 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  hat should be cl
10260 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f  osed here. The o
10270 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  nly exception.  
10280 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f  ** is that an IO
10290 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20   error may have 
102a0 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e  occurred, causin
102b0 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  g an emergency r
102c0 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e  ollback..  ** In
102d0 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e   this case (db->
102e0 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20  nStatement==0), 
102f0 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74  and there is not
10300 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f  hing to do..  */
10310 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74  .  if( db->nStat
10320 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61  ement && p->iSta
10330 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e  tement ){.    in
10340 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  t i;.    const i
10350 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20  nt iSavepoint = 
10360 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b  p->iStatement-1;
10370 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f  ..    assert( eO
10380 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
10390 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41  LBACK || eOp==SA
103a0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
103b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
103c0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ->nStatement>0 )
103d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
103e0 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62  >iStatement==(db
103f0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d  ->nStatement+db-
10400 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  >nSavepoint) );.
10410 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10420 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
10430 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
10440 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
10450 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
10460 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
10470 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
10480 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
10490 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
104a0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
104b0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
104c0 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
104d0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
104e0 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
104f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10500 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c      if( rc2==SQL
10510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10520 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
10530 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
10540 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
10550 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
10560 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
10570 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
10580 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10590 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
105a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
105b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  }.    }.    db->
105c0 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20  nStatement--;.  
105d0 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
105e0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  = 0;..    if( rc
105f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10600 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
10610 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10620 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
10630 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
10640 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
10650 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
10660 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
10670 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
10680 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10690 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
106a0 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
106b0 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  db, SAVEPOINT_RE
106c0 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
106d0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
106e0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
106f0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10700 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  action is being 
10710 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73  rolled back, als
10720 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20  o restore the . 
10730 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68     ** database h
10740 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20  andles deferred 
10750 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74  constraint count
10760 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  er to the value 
10770 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20  it had when .   
10780 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
10790 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
107a0 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20  s opened.  */.  
107b0 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
107c0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
107d0 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  .      db->nDefe
107e0 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  rredCons = p->nS
107f0 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20  tmtDefCons;.    
10800 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
10810 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  mmCons = p->nStm
10820 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20  tDefImmCons;.   
10830 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10840 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
10850 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
10860 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  lled when a tran
10870 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62  saction opened b
10880 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  y the database .
10890 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69  ** handle associ
108a0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
108b0 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
108c0 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20  gument is about 
108d0 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74  to be .** commit
108e0 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72  ted. If there ar
108f0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65  e outstanding de
10900 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
10910 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  ey constraint.**
10920 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74   violations, ret
10930 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
10940 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
10950 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
10960 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
10970 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74  anding FK violat
10980 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75  ions and this fu
10990 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
109a0 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  ** SQLITE_ERROR,
109b0 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
109c0 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c  of the VM to SQL
109d0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
109e0 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64  OREIGNKEY.** and
109f0 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20   write an error 
10a00 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54  message to it. T
10a10 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
10a20 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e  E_ERROR..*/.#ifn
10a30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10a40 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20  FOREIGN_KEY.int 
10a50 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
10a60 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Fk(Vdbe *p, int 
10a70 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c  deferred){.  sql
10a80 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
10a90 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65  ;.  if( (deferre
10aa0 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72  d && (db->nDefer
10ab0 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66  redCons+db->nDef
10ac0 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29  erredImmCons)>0)
10ad0 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72   .   || (!deferr
10ae0 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73  ed && p->nFkCons
10af0 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a  traint>0) .  ){.
10b00 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
10b10 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
10b20 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d  REIGNKEY;.    p-
10b30 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
10b40 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c  E_Abort;.    sql
10b50 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
10b60 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
10b70 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
10b80 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b  traint failed");
10b90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10ba0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
10bb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10bc0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
10bd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10be0 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
10bf0 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
10c00 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
10c10 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
10c20 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
10c30 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
10c40 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
10c50 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
10c60 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
10c70 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
10c80 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
10c90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
10ca0 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
10cb0 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
10cc0 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
10cd0 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
10ce0 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
10cf0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49  E_MAGIC_HALT.  I
10d00 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f  t is harmless to
10d10 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e  .** call this on
10d20 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e   a VM that is in
10d30 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49   the SQLITE_MAGI
10d40 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a  C_HALT state..**
10d50 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
10d60 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
10d70 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
10d80 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
10d90 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
10da0 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
10db0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
10dc0 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
10dd0 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
10de0 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
10df0 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
10e00 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
10e10 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
10e20 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
10e30 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  t(Vdbe *p){.  in
10e40 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10e60 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   Used to store t
10e70 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20  ransient return 
10e80 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  codes */.  sqlit
10e90 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
10ea0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
10eb0 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
10ec0 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
10ed0 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
10ee0 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
10ef0 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
10f00 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
10f10 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
10f20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
10f30 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
10f40 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
10f50 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
10f60 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
10f70 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
10f80 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
10f90 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
10fa0 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
10fb0 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
10fc0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
10fd0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
10fe0 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
10ff0 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
11000 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
11010 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
11020 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
11030 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
11040 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
11050 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
11060 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
11070 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
11080 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
11090 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
110a0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
110b0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
110c0 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
110d0 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
110e0 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
110f0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
11100 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
11110 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65  OnceFlag ) memse
11120 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  t(p->aOnceFlag, 
11130 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29  0, p->nOnceFlag)
11140 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  ;.  closeAllCurs
11150 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ors(p);.  if( p-
11160 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
11170 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65  IC_RUN ){.    re
11180 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11190 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76    }.  checkActiv
111a0 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
111b0 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
111c0 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
111d0 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
111e0 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72  never started or
111f0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c   if the.  ** SQL
11200 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20   statement does 
11210 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74  not read or writ
11220 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  e a database fil
11230 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  e.  */.  if( p->
11240 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52  pc>=0 && p->bIsR
11250 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  eader ){.    int
11260 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
11270 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
11280 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20  om p->rc */.    
11290 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  int eStatementOp
112a0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73   = 0;.    int is
112b0 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
112c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
112d0 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70  to true if a 'sp
112e0 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a  ecial' error */.
112f0 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c  .    /* Lock all
11300 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20   btrees used by 
11310 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
11320 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11330 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f  Enter(p);..    /
11340 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20  * Check for one 
11350 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
11360 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63  rrors */.    mrc
11370 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b   = p->rc & 0xff;
11380 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
11390 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
113a0 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f 2a 20  _BLOCKED );  /* 
113b0 54 68 69 73 20 65 72 72 6f 72 20 6e 6f 20 6c 6f  This error no lo
113c0 6e 67 65 72 20 65 78 69 73 74 73 20 2a 2f 0a 20  nger exists */. 
113d0 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f     isSpecialErro
113e0 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f  r = mrc==SQLITE_
113f0 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51  NOMEM || mrc==SQ
11400 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20  LITE_IOERR.     
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11420 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
11430 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d  NTERRUPT || mrc=
11440 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20  =SQLITE_FULL;.  
11450 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45    if( isSpecialE
11460 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rror ){.      /*
11470 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61   If the query wa
11480 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20  s read-only and 
11490 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
114a0 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  s SQLITE_INTERRU
114b0 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f  PT, .      ** no
114c0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63   rollback is nec
114d0 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73  essary. Otherwis
114e0 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61  e, at least a sa
114f0 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
11500 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  * transaction mu
11510 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  st be rolled bac
11520 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  k to restore the
11530 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a   database to a .
11540 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74        ** consist
11550 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20  ent state..     
11560 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65   **.      ** Eve
11570 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  n if the stateme
11580 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c  nt is read-only,
11590 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
115a0 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20   to perform.    
115b0 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74    ** a statement
115c0 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   or transaction 
115d0 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69  rollback operati
115e0 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72  on. If the error
115f0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72   .      ** occur
11600 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  red while writin
11610 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
11620 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72  , sub-journal or
11630 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
11640 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 20  ** file as part 
11650 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  of an effort to 
11660 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73 70  free up cache sp
11670 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f  ace (see functio
11680 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72  n.      ** pager
11690 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 65  Stress() in page
116a0 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61  r.c), the rollba
116b0 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 74  ck is required t
116c0 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20  o restore .     
116d0 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f   ** the pager to
116e0 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74   a consistent st
116f0 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ate..      */.  
11700 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
11710 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c  Only || mrc!=SQL
11720 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b  ITE_INTERRUPT ){
11730 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72  .        if( (mr
11740 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
11750 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
11760 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53  ULL) && p->usesS
11770 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  tmtJournal ){.  
11780 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
11790 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
117a0 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
117b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
117c0 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f      /* We are fo
117d0 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63  rced to roll bac
117e0 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61  k the active tra
117f0 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65  nsaction. Before
11800 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20   doing.         
11810 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e   ** so, abort an
11820 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  y other statemen
11830 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63  ts this handle c
11840 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74  urrently has act
11850 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ive..          *
11860 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
11870 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
11880 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
11890 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
118a0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
118b0 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
118c0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61  .          db->a
118d0 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
118e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
118f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
11900 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61  heck for immedia
11910 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76  te foreign key v
11920 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  iolations. */.  
11930 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
11940 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11950 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
11960 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Fk(p, 0);.    }.
11970 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
11980 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
11990 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
119a0 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
119b0 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20  tive writer .   
119c0 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20   ** VM, then we 
119d0 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
119e0 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
119f0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
11a00 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
11a10 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
11a20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
11a30 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
11a40 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
11a50 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
11a60 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
11a70 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rred. .    */.  
11a80 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74    if( !sqlite3Vt
11a90 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20  abInSync(db) .  
11aa0 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f     && db->autoCo
11ab0 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62  mmit .     && db
11ac0 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70  ->nVdbeWrite==(p
11ad0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
11ae0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
11af0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
11b00 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
11b10 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
11b20 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
11b30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
11b40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
11b50 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20  ckFk(p, 1);.    
11b60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11b70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11b80 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e     if( NEVER(p->
11b90 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
11ba0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11bb0 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
11bc0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11bd0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
11be0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11bf0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11c00 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
11c10 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  IGNKEY;.        
11c20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20  }else{ .        
11c30 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
11c40 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
11c50 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  e, the vdbe prog
11c60 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66  ram was successf
11c70 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ul .          **
11c80 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46   or hit an 'OR F
11c90 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20  AIL' constraint 
11ca0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
11cb0 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
11cc0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b  n.          ** k
11cd0 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ey constraints t
11ce0 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72  o hold up the tr
11cf0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
11d00 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
11d10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
11d20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
11d30 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
11d40 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20  Commit(db, p);. 
11d50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11d60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11d70 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f  BUSY && p->readO
11d80 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nly ){.         
11d90 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
11da0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
11db0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
11dc0 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  SY;.        }els
11dd0 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
11de0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
11df0 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
11e00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
11e10 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
11e20 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
11e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11e40 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
11e50 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
11e60 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
11e70 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  dImmCons = 0;.  
11e80 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
11e90 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66  s &= ~SQLITE_Def
11ea0 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20  erFKs;.         
11eb0 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
11ec0 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
11ed0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11ee0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11ef0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
11f00 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
11f10 4f 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OK);.      }.   
11f20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
11f30 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
11f40 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
11f50 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
11f60 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
11f70 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
11f80 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
11f90 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
11fa0 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
11fb0 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
11fc0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
11fd0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
11fe0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
11ff0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
12000 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12010 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12020 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
12030 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
12040 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
12050 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
12060 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
12070 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
12080 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
12090 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
120a0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
120b0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73   eStatementOp is
120c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
120d0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
120e0 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
120f0 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69  .    ** be commi
12100 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
12110 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  ack. Call sqlite
12120 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
12130 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  ent() to.    ** 
12140 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f  do so. If this o
12150 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73  peration returns
12160 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
12170 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
12180 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f  ment.    ** erro
12190 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
121a0 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  _OK or SQLITE_CO
121b0 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70  NSTRAINT, then p
121c0 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a  romote the.    *
121d0 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * current statem
121e0 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ent error code..
121f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
12200 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20  StatementOp ){. 
12210 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12220 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
12230 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e  ent(p, eStatemen
12240 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tOp);.      if( 
12250 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rc ){.        if
12260 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
12270 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66  OK || (p->rc&0xf
12280 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
12290 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20  RAINT ){.       
122a0 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
122b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
122c0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
122d0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
122e0 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
122f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12300 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
12310 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
12320 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
12330 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12340 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
12350 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
12360 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
12370 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
12380 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
12390 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
123a0 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
123b0 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d  TE and no statem
123c0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ent transaction.
123d0 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
123e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64  rolled back, upd
123f0 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
12400 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e   connection chan
12410 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20  ge-counter. .   
12420 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63   */.    if( p->c
12430 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20  hangeCntOn ){.  
12440 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65      if( eStateme
12450 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f  ntOp!=SAVEPOINT_
12460 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
12470 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
12480 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
12490 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
124a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
124b0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
124c0 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
124d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
124e0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
124f0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
12500 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
12510 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
12520 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ave(p);.  }..  /
12530 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
12540 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
12550 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
12560 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
12570 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
12580 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
12590 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a  >nVdbeActive--;.
125a0 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
125b0 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65  Only ) db->nVdbe
125c0 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28  Write--;.    if(
125d0 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
125e0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b  db->nVdbeRead--;
125f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
12600 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62  >nVdbeActive>=db
12610 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20  ->nVdbeRead );. 
12620 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
12630 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56  VdbeRead>=db->nV
12640 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20  dbeWrite );.    
12650 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
12660 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d  eWrite>=0 );.  }
12670 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
12680 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
12690 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
126a0 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70  Cnt(db);.  if( p
126b0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
126c0 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
126d0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
126e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
126f0 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
12700 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
12710 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
12720 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
12730 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
12740 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
12750 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
12760 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
12770 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
12780 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
12790 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
127a0 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
127b0 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
127c0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
127d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
127e0 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
127f0 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
12800 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
12810 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  ive>0 || db->aut
12820 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
12830 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
12840 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
12850 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
12860 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
12870 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a  SQLITE_OK);.}...
12880 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
12890 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
128a0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
128b0 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
128c0 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
128d0 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
128e0 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
128f0 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
12900 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
12910 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
12920 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
12930 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
12940 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12950 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72  * Copy the error
12960 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
12970 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e  message belongin
12980 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61  g to the VDBE pa
12990 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
129a0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
129b0 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61   its database ha
129c0 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68  ndle (so that th
129d0 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72  ey will be .** r
129e0 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73  eturned by calls
129f0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63   to sqlite3_errc
12a00 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ode() and sqlite
12a10 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a  3_errmsg())..**.
12a20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12a30 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20   does not clear 
12a40 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63  the VDBE error c
12a50 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20  ode or message, 
12a60 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  just.** copies t
12a70 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62  hem to the datab
12a80 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
12a90 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  nt sqlite3VdbeTr
12aa0 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65  ansferError(Vdbe
12ab0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
12ac0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
12ad0 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
12ae0 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
12af0 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63  ){.    u8 malloc
12b00 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  Failed = db->mal
12b10 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 73  locFailed;.    s
12b20 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
12b30 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
12b40 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29  f( db->pErr==0 )
12b50 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69   db->pErr = sqli
12b60 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
12b70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
12b80 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
12b90 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
12ba0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
12bb0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
12bc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
12bd0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
12be0 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
12bf0 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69  iled = mallocFai
12c00 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72  led;.    db->err
12c10 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c  Code = rc;.  }el
12c20 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
12c30 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b  rror(db, rc, 0);
12c40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
12c50 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
12c60 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
12c70 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c  ./*.** If an SQL
12c80 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f  ITE_CONFIG_SQLLO
12c90 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74  G hook is regist
12ca0 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20  ered and the VM 
12cb0 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a  has been run, .*
12cc0 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a  * invoke it..*/.
12cd0 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
12ce0 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62  InvokeSqllog(Vdb
12cf0 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c  e *v){.  if( sql
12d00 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
12d10 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72  .xSqllog && v->r
12d20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
12d30 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63  v->zSql && v->pc
12d40 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  >=0 ){.    char 
12d50 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c  *zExpanded = sql
12d60 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 71  ite3VdbeExpandSq
12d70 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20  l(v, v->zSql);. 
12d80 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62     assert( v->db
12d90 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
12da0 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e  ;.    if( zExpan
12db0 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ded ){.      sql
12dc0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
12dd0 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20  .xSqllog(.      
12de0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
12df0 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
12e00 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61  rg, v->db, zExpa
12e10 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b  nded, 1.      );
12e20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
12e30 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70  Free(v->db, zExp
12e40 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20  anded);.    }.  
12e50 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
12e60 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  ne vdbeInvokeSql
12e70 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  log(x).#endif../
12e80 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20  *.** Clean up a 
12e90 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
12ea0 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20  tion but do not 
12eb0 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20  delete the VDBE 
12ec0 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69  just yet..** Wri
12ed0 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
12ee0 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72  sages into *pzEr
12ef0 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68  rMsg.  Return th
12f00 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a  e result code..*
12f10 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
12f20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20  routine is run, 
12f30 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
12f40 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65  be ready to be e
12f50 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e  xecuted.** again
12f60 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20  ..**.** To look 
12f70 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61  at it another wa
12f80 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
12f90 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65  resets the state
12fa0 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   of the.** virtu
12fb0 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20  al machine from 
12fc0 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f  VDBE_MAGIC_RUN o
12fd0 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  r VDBE_MAGIC_HAL
12fe0 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42  T back to.** VDB
12ff0 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f  E_MAGIC_INIT..*/
13000 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
13010 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a  Reset(Vdbe *p){.
13020 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
13030 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20   db = p->db;..  
13040 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64  /* If the VM did
13050 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70   not run to comp
13060 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20  letion or if it 
13070 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20  encountered an. 
13080 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20   ** error, then 
13090 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76  it might not hav
130a0 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72  e been halted pr
130b0 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74  operly.  So halt
130c0 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20  .  ** it now..  
130d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
130e0 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  Halt(p);..  /* I
130f0 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  f the VDBE has b
13100 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69  e run even parti
13110 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73  ally, then trans
13120 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f  fer the error co
13130 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f  de.  ** and erro
13140 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74  r message from t
13150 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65  he VDBE into the
13160 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
13170 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20  tructure.  But. 
13180 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20   ** if the VDBE 
13190 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65  has just been se
131a0 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73  t to run but has
131b0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78   not actually ex
131c0 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20  ecuted any.  ** 
131d0 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74  instructions yet
131e0 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e  , leave the main
131f0 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
13200 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68  information unch
13210 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
13220 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
13230 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c    vdbeInvokeSqll
13240 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  og(p);.    sqlit
13250 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72  e3VdbeTransferEr
13260 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  ror(p);.    sqli
13270 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
13280 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
13290 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
132a0 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c     if( p->runOnl
132b0 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72  yOnce ) p->expir
132c0 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ed = 1;.  }else 
132d0 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e  if( p->rc && p->
132e0 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f  expired ){.    /
132f0 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c  * The expired fl
13300 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68  ag was set on th
13310 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68  e VDBE before th
13320 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20  e first call.   
13330 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73   ** to sqlite3_s
13340 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69  tep(). For consi
13350 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71  stency (since sq
13360 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73  lite3_step() was
13370 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c  .    ** called),
13380 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
13390 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20  e error in this 
133a0 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20  case as well..  
133b0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
133c0 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c  Error(db, p->rc,
133d0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25   p->zErrMsg ? "%
133e0 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d  s" : 0, p->zErrM
133f0 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
13400 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
13410 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
13420 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
13430 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
13440 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
13450 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
13460 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20   Cleanup(p);..  
13470 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
13480 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
13490 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
134a0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44  ..  */.#ifdef VD
134b0 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
134c0 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66     FILE *out = f
134d0 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69  open("vdbe_profi
134e0 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20  le.out", "a");. 
134f0 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20     if( out ){.  
13500 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
13510 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
13520 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f  --- ");.      fo
13530 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
13540 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
13550 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32  printf(out, "%02
13560 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  x", p->aOp[i].op
13570 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  code);.      }. 
13580 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
13590 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69  , "\n");.      i
135a0 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20  f( p->zSql ){.  
135b0 20 20 20 20 20 20 63 68 61 72 20 63 2c 20 70 63        char c, pc
135c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70   = 0;.        fp
135d0 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22  rintf(out, "-- "
135e0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
135f0 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c  =0; (c = p->zSql
13600 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
13610 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d           if( pc=
13620 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28  ='\n' ) fprintf(
13630 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20  out, "-- ");.   
13640 20 20 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f         putc(c, o
13650 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ut);.          p
13660 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d  c = c;.        }
13670 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 21  .        if( pc!
13680 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28  ='\n' ) fprintf(
13690 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
136a0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
136b0 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
136c0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
136d0 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20  zHdr[100];.     
136e0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
136f0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29  ntf(sizeof(zHdr)
13700 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32  , zHdr, "%6u %12
13710 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20  llu %8llu ",.   
13720 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
13730 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20  ].cnt,.         
13740 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
13750 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  es,.           p
13760 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f  ->aOp[i].cnt>0 ?
13770 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
13780 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20  s/p->aOp[i].cnt 
13790 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  : 0.        );. 
137a0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
137b0 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b  ut, "%s", zHdr);
137c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
137d0 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
137e0 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
137f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
13800 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
13810 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
13820 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d  ->iCurrentTime =
13830 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   0;.  p->magic =
13840 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
13850 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
13860 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
13870 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
13880 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
13890 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
138a0 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
138b0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
138c0 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
138d0 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
138e0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
138f0 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
13900 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
13910 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
13920 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
13930 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13940 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
13950 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
13960 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
13970 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
13980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
13990 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
139a0 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
139b0 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
139c0 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  c );.  }.  sqlit
139d0 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
139e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
139f0 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  ./*.** If parame
13a00 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20  ter iOp is less 
13a10 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
13a20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  invoke the destr
13a30 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c  uctor for.** all
13a40 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20   auxiliary data 
13a50 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74  pointers current
13a60 6c 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65  ly cached by the
13a70 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a   VM passed as.**
13a80 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
13a90 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ent..**.** Or, i
13aa0 66 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72  f iOp is greater
13ab0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
13ac0 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
13ad0 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a   destructor is.*
13ae0 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66  * only invoked f
13af0 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61  or those auxilia
13b00 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73  ry data pointers
13b10 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
13b20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  user .** functio
13b30 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65  n invoked by the
13b40 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63   OP_Function opc
13b50 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69  ode at instructi
13b60 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d  on iOp of .** VM
13b70 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79   pVdbe, and only
13b80 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   then if:.**.** 
13b90 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61     * the associa
13ba0 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  ted function par
13bb0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32  ameter is the 32
13bc0 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75  nd or later (cou
13bd0 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72  nting.**      fr
13be0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
13bf0 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ), or.**.**    *
13c00 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
13c10 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65  ng bit in argume
13c20 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  nt mask is clear
13c30 20 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73   (where the firs
13c40 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69  t.**      functi
13c50 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72  on parameter cor
13c60 72 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30  rsponds to bit 0
13c70 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20   etc.)..*/.void 
13c80 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
13c90 65 41 75 78 44 61 74 61 28 56 64 62 65 20 2a 70  eAuxData(Vdbe *p
13ca0 56 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69  Vdbe, int iOp, i
13cb0 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44  nt mask){.  AuxD
13cc0 61 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64 62  ata **pp = &pVdb
13cd0 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 77  e->pAuxData;.  w
13ce0 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20  hile( *pp ){.   
13cf0 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d   AuxData *pAux =
13d00 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69   *pp;.    if( (i
13d10 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70  Op<0).     || (p
13d20 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26  Aux->iOp==iOp &&
13d30 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31 20   (pAux->iArg>31 
13d40 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b  || !(mask & MASK
13d50 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72 67  BIT32(pAux->iArg
13d60 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  )))).    ){.    
13d70 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78    testcase( pAux
13d80 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20  ->iArg==31 );.  
13d90 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44      if( pAux->xD
13da0 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
13db0 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70   pAux->xDelete(p
13dc0 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
13dd0 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
13de0 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pAux->pNext;.   
13df0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13e00 28 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78  (pVdbe->db, pAux
13e10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13e20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70      pp= &pAux->p
13e30 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
13e40 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
13e50 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
13e60 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
13e70 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
13e80 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
13e90 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f  .** except for o
13ea0 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68  bject itself, wh
13eb0 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64  ich is preserved
13ec0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
13ed0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
13ee0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
13ef0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
13f00 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20  te() is that.** 
13f10 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73  VdbeDelete() als
13f20 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64  o unlinks the Vd
13f30 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  be from the list
13f40 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74   of VMs associat
13f50 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64  ed with.** the d
13f60 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13f70 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65  on and frees the
13f80 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a   object itself..
13f90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
13fa0 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73  dbeClearObject(s
13fb0 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
13fc0 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72   *p){.  SubProgr
13fd0 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74  am *pSub, *pNext
13fe0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
13ff0 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c  ert( p->db==0 ||
14000 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20   p->db==db );.  
14010 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
14020 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
14030 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
14040 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
14050 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
14060 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f  COLNAME_N);.  fo
14070 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72  r(pSub=p->pProgr
14080 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  am; pSub; pSub=p
14090 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
140a0 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a   = pSub->pNext;.
140b0 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72      vdbeFreeOpAr
140c0 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f  ray(db, pSub->aO
140d0 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20  p, pSub->nOp);. 
140e0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
140f0 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a  (db, pSub);.  }.
14100 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72    for(i=p->nzVar
14110 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73  -1; i>=0; i--) s
14120 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14130 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20   p->azVar[i]);. 
14140 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
14150 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e  (db, p->aOp, p->
14160 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  nOp);.  sqlite3D
14170 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
14180 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
14190 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
141a0 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Sql);.  sqlite3D
141b0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72  bFree(db, p->pFr
141c0 65 65 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ee);.#if defined
141d0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
141e0 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 73  REE_EXPLAIN).  s
141f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14200 20 70 2d 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a 20   p->zExplain);. 
14210 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
14220 62 2c 20 70 2d 3e 70 45 78 70 6c 61 69 6e 29 3b  b, p->pExplain);
14230 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
14240 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
14250 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
14260 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
14270 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  e(Vdbe *p){.  sq
14280 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
14290 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
142a0 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
142b0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
142c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
142d0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
142e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  .  sqlite3VdbeCl
142f0 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29  earObject(db, p)
14300 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
14310 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
14320 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
14330 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
14340 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64   assert( db->pVd
14350 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d  be==p );.    db-
14360 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
14370 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
14380 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
14390 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
143a0 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70  ->pPrev;.  }.  p
143b0 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
143c0 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e  AGIC_DEAD;.  p->
143d0 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  db = 0;.  sqlite
143e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
143f0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
14400 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20  re the cursor p 
14410 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64  is ready to read
14420 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f   or write the ro
14430 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a  w to which it.**
14440 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69   was last positi
14450 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e  oned.  Return an
14460 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
14470 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49  n OOM fault or I
14480 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76  /O error.** prev
14490 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73  ents us from pos
144a0 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72  itioning the cur
144b0 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65  sor to its corre
144c0 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a  ct position..**.
144d0 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f  ** If a MoveTo o
144e0 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64  peration is pend
144f0 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ing on the given
14500 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f   cursor, then do
14510 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20   that.** MoveTo 
14520 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65  now.  If no move
14530 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65   is pending, che
14540 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
14550 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a   row has been.**
14560 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
14570 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
14580 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73  or and if it has
14590 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61  , mark the row a
145a0 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  s.** a NULL row.
145b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
145c0 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
145d0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
145e0 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20  correct row and 
145f0 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20  that row has.** 
14600 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64  not been deleted
14610 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
14620 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  the cursor, then
14630 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14640 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
14650 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
14660 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72  orMoveto(VdbeCur
14670 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  sor *p){.  if( p
14680 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
14690 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c   ){.    int res,
146a0 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
146b0 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65  TE_TEST.    exte
146c0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
146d0 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e  earch_count;.#en
146e0 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
146f0 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
14700 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
14710 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
14720 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  d(p->pCursor, 0,
14730 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74   p->movetoTarget
14740 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  , 0, &res);.    
14750 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
14760 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52  rc;.    p->lastR
14770 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f  owid = p->moveto
14780 54 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28 20  Target;.    if( 
14790 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20  res!=0 ) return 
147a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
147b0 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69  KPT;.    p->rowi
147c0 64 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69  dIsValid = 1;.#i
147d0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
147e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61  .    sqlite3_sea
147f0 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  rch_count++;.#en
14800 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72  dif.    p->defer
14810 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
14820 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75     p->cacheStatu
14830 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
14840 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
14850 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 69  pCursor ){.    i
14860 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20  nt hasMoved;.   
14870 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
14880 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
14890 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  oved(p->pCursor,
148a0 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20   &hasMoved);.   
148b0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
148c0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61 73   rc;.    if( has
148d0 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20 70  Moved ){.      p
148e0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
148f0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20  CACHE_STALE;.   
14900 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20     p->nullRow = 
14910 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
14920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
14940 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
14950 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s:.**.** sqlite3
14960 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29  VdbeSerialType()
14970 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
14980 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a  erialTypeLen().*
14990 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
149a0 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ialLen().** sqli
149b0 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
149c0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
149d0 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a  eSerialGet().**.
149e0 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74  ** encapsulate t
149f0 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72  he code that ser
14a00 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66  ializes values f
14a10 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51  or storage in SQ
14a20 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64  Lite.** data and
14a30 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20   index records. 
14a40 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20  Each serialized 
14a50 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f  value consists o
14a60 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74  f a.** 'serial-t
14a70 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20  ype' and a blob 
14a80 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72  of data. The ser
14a90 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38  ial type is an 8
14aa0 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a  -byte unsigned.*
14ab0 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65  * integer, store
14ac0 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  d as a varint..*
14ad0 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74  *.** In an SQLit
14ae0 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  e index record, 
14af0 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
14b00 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74  is stored direct
14b10 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ly before.** the
14b20 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68   blob of data th
14b30 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  at it correspond
14b40 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65  s to. In a table
14b50 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72   record, all ser
14b60 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65  ial.** types are
14b70 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
14b80 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  tart of the reco
14b90 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  rd, and the blob
14ba0 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20  s of data at.** 
14bb0 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74  the end. Hence t
14bc0 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
14bd0 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20  llow the caller 
14be0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a  to handle the.**
14bf0 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64   serial-type and
14c00 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72   data blob separ
14c10 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ately..**.** The
14c20 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
14c30 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76   describes the v
14c40 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63  arious storage c
14c50 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a  lasses for data:
14c60 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20  .**.**   serial 
14c70 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65  type        byte
14c80 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74  s of data      t
14c90 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ype.**   -------
14ca0 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
14cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
14cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
14cd0 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  *      0        
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
14cf0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a            NULL.*
14d00 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  *      1        
14d10 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
14d20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
14d30 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
14d40 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
14d50 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
14d60 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
14d70 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20  er.**      3    
14d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d90 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69   3            si
14da0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
14db0 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
14dc0 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20             4    
14dd0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
14de0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35  nteger.**      5
14df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e00 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
14e10 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
14e20 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20  .**      6      
14e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
14e40 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
14e50 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
14e60 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20     7            
14e70 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
14e80 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74        IEEE float
14e90 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20  .**      8      
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
14ec0 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a  ger constant 0.*
14ed0 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20  *      9        
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
14ef0 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
14f00 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20  r constant 1.** 
14f10 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20      10,11       
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f30 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
14f40 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a   for expansion.*
14f50 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65  *    N>=12 and e
14f60 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29  ven       (N-12)
14f70 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a  /2        BLOB.*
14f80 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f  *    N>=13 and o
14f90 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29  dd        (N-13)
14fa0 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a  /2        text.*
14fb0 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39  *.** The 8 and 9
14fc0 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65   types were adde
14fd0 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65  d in 3.3.0, file
14fe0 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f   format 4.  Prio
14ff0 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
15000 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
15010 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73   understand thos
15020 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  e serial types..
15030 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
15040 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65   the serial-type
15050 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
15060 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a  tored in pMem..*
15070 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
15080 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20  eSerialType(Mem 
15090 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
150a0 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66  format){.  int f
150b0 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
150c0 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  gs;.  int n;..  
150d0 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
150e0 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
150f0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
15100 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
15110 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
15120 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
15130 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
15140 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
15150 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
15160 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30  (((i64)0x0000800
15170 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
15180 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
15190 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
151a0 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
151b0 20 20 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36 42    if( i<(-MAX_6B
151c0 59 54 45 29 20 29 20 72 65 74 75 72 6e 20 36 3b  YTE) ) return 6;
151d0 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f  .      /* Previo
151e0 75 73 20 74 65 73 74 20 70 72 65 76 65 6e 74 73  us test prevents
151f0 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32 33 33 37  :  u = -(-922337
15200 32 30 33 36 38 35 34 37 37 35 38 30 38 29 20 2a  2036854775808) *
15210 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d 69 3b 0a  /.      u = -i;.
15220 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15230 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20   u = i;.    }.  
15240 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a    if( u<=127 ){.
15250 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 69        return ((i
15260 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66  &1)==i && file_f
15270 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38 2b 28 75  ormat>=4) ? 8+(u
15280 33 32 29 75 20 3a 20 31 3b 0a 20 20 20 20 7d 0a  32)u : 1;.    }.
15290 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37      if( u<=32767
152a0 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20   ) return 2;.   
152b0 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
152c0 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20  ) return 3;.    
152d0 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34  if( u<=214748364
152e0 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20  7 ) return 4;.  
152f0 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59    if( u<=MAX_6BY
15300 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20  TE ) return 5;. 
15310 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d     return 6;.  }
15320 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
15330 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Real ){.    ret
15340 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 7;.  }.  ass
15350 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d  ert( pMem->db->m
15360 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66  allocFailed || f
15370 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45  lags&(MEM_Str|ME
15380 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d  M_Blob) );.  n =
15390 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20   pMem->n;.  if( 
153a0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
153b0 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
153c0 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  m->u.nZero;.  }.
153d0 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29    assert( n>=0 )
153e0 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  ;.  return ((n*2
153f0 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
15400 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
15410 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
15420 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
15430 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  e data correspon
15440 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  ding to the supp
15450 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65  lied serial-type
15460 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
15470 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
15480 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  n(u32 serial_typ
15490 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e){.  if( serial
154a0 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
154b0 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
154c0 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
154d0 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
154e0 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d  const u8 aSize[]
154f0 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c   = { 0, 1, 2, 3,
15500 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20   4, 6, 8, 8, 0, 
15510 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72  0, 0, 0 };.    r
15520 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69  eturn aSize[seri
15530 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
15540 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
15550 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74   on an architect
15560 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65  ure with mixed-e
15570 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a  ndian floating .
15580 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41  ** points (ex: A
15590 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74  RM7) then swap t
155a0 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73  he lower 4 bytes
155b0 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70   with the .** up
155c0 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65  per 4 bytes.  Re
155d0 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
155e0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20  .**.** For most 
155f0 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74  architectures, t
15600 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
15610 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20  **.** (later):  
15620 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
15630 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69  o me that the mi
15640 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c  xed-endian probl
15650 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73  em.** on ARM7 is
15660 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47   an issue with G
15670 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65  CC, not with the
15680 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20   ARM7 chip.  It 
15690 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61  seems.** that ea
156a0 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  rly versions of 
156b0 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74  GCC stored the t
156c0 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34  wo words of a 64
156d0 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e  -bit.** float in
156e0 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72   the wrong order
156f0 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f  .  And that erro
15700 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61  r has been propa
15710 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69  gated.** ever si
15720 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20  nce.  The blame 
15730 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
15740 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f  ly with GCC, tho
15750 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68  ugh..** GCC migh
15760 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79  t have just copy
15770 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ing the problem 
15780 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d  from a prior com
15790 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61  piler..** I am a
157a0 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65  lso told that ne
157b0 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
157c0 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  GCC that follow 
157d0 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41  a different.** A
157e0 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20  BI get the byte 
157f0 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a  order right..**.
15800 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73  ** Developers us
15810 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e  ing SQLite on an
15820 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d   ARM7 should com
15830 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65  pile and run the
15840 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ir.** applicatio
15850 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  n using -DSQLITE
15860 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73  _DEBUG=1 at leas
15870 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45  t once.  With DE
15880 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  BUG.** enabled, 
15890 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c  some asserts bel
158a0 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74  ow will ensure t
158b0 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  hat the byte ord
158c0 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e  er of.** floatin
158d0 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69  g point values i
158e0 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a  s correct..**.**
158f0 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46   (2007-08-30)  F
15900 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61  rank van Vugt ha
15910 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70  s studied this p
15920 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a  roblem closely.*
15930 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68  * and has send h
15940 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74  is findings to t
15950 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f  he SQLite develo
15960 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20  pers.  Frank.** 
15970 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65  writes that some
15980 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f   Linux kernels o
15990 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ffer floating po
159a0 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20  int hardware.** 
159b0 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75  emulation that u
159c0 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20  ses only 32-bit 
159d0 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61  mantissas instea
159e0 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20  d of a full .** 
159f0 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69  48-bits as requi
15a00 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20  red by the IEEE 
15a10 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73  standard.  (This
15a20 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49   is the.** CONFI
15a30 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70  G_FPE_FASTFPE op
15a40 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20  tion.)  On such 
15a50 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e  systems, floatin
15a60 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20  g point.** byte 
15a70 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73  swapping becomes
15a80 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65   very complicate
15a90 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f  d.  To avoid pro
15aa0 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65  blems,.** the ne
15ab0 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61  cessary byte swa
15ac0 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64  pping is carried
15ad0 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d   out using a 64-
15ae0 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72  bit integer.** r
15af0 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d  ather than a 64-
15b00 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e  bit float.  Fran
15b10 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61  k assures us tha
15b20 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a  t the code here.
15b30 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d  ** works for him
15b40 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c  .  We, the devel
15b50 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77  opers, have no w
15b60 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e  ay to independen
15b70 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68  tly.** verify th
15b80 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65  is, but Frank se
15b90 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74  ems to know what
15ba0 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61   he is talking a
15bb0 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72  bout.** so we tr
15bc0 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64  ust him..*/.#ifd
15bd0 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  ef SQLITE_MIXED_
15be0 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
15bf0 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c  AT.static u64 fl
15c00 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b  oatSwap(u64 in){
15c10 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75  .  union {.    u
15c20 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b  64 r;.    u32 i[
15c30 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32  2];.  } u;.  u32
15c40 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b   t;..  u.r = in;
15c50 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20  .  t = u.i[0];. 
15c60 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d   u.i[0] = u.i[1]
15c70 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a  ;.  u.i[1] = t;.
15c80 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a    return u.r;.}.
15c90 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
15ca0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
15cb0 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28    X = floatSwap(
15cc0 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
15cd0 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
15ce0 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66  nFloat(X).#endif
15cf0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
15d00 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  e serialized dat
15d10 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76  a blob for the v
15d20 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
15d30 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66  Mem into .** buf
15d40 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
15d50 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
15d60 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75  has allocated su
15d70 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a  fficient space..
15d80 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
15d90 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
15da0 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75  itten..**.** nBu
15db0 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20  f is the amount 
15dc0 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e  of space left in
15dd0 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c   buf[].  The cal
15de0 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
15df0 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61  le.** for alloca
15e00 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63  ting enough spac
15e10 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f  e to buf[] to ho
15e20 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ld the entire fi
15e30 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a  eld, exclusive.*
15e40 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75  * of the pMem->u
15e50 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72  .nZero bytes for
15e60 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75   a MEM_Zero valu
15e70 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
15e80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
15e90 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69  tes actually wri
15ea0 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  tten into buf[].
15eb0 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
15ec0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
15ed0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
15ee0 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
15ef0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
15f00 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73   only.** if thos
15f10 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72  e bytes were zer
15f20 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f  oed in buf[]..*/
15f30 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
15f40 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62  eSerialPut(u8 *b
15f50 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75  uf, Mem *pMem, u
15f60 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
15f70 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f  .  u32 len;..  /
15f80 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
15f90 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
15fa0 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65  al_type<=7 && se
15fb0 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20  rial_type>0 ){. 
15fc0 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33     u64 v;.    u3
15fd0 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  2 i;.    if( ser
15fe0 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
15ff0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
16000 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(v)==sizeof(p
16010 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20  Mem->r) );.     
16020 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
16030 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  m->r, sizeof(v))
16040 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
16050 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
16060 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16070 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
16080 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
16090 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   i = sqlite3Vdbe
160a0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
160b0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
160c0 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20  while( i-- ){.  
160d0 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 75 38      buf[i] = (u8
160e0 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20  )(v&0xFF);.     
160f0 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a   v >>= 8;.    }.
16100 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
16110 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
16120 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
16130 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
16140 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
16150 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
16160 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
16170 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  ero)?pMem->u.nZe
16180 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20  ro:0).          
16190 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74     == (int)sqlit
161a0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
161b0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
161c0 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   );.    len = pM
161d0 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70  em->n;.    memcp
161e0 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
161f0 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  len);.    return
16200 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
16210 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
16220 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
16230 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e  turn 0;.}../* In
16240 70 75 74 20 22 78 22 20 69 73 20 61 20 73 65 71  put "x" is a seq
16250 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65  uence of unsigne
16260 64 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  d characters tha
16270 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a  t represent a.**
16280 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
16290 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ger.  Return the
162a0 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69   equivalent nati
162b0 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64  ve integer.*/.#d
162c0 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49  efine ONE_BYTE_I
162d0 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 28 78  NT(x)    ((i8)(x
162e0 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57  )[0]).#define TW
162f0 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20  O_BYTE_INT(x)   
16300 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30   (256*(i8)((x)[0
16310 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69  ])|(x)[1]).#defi
16320 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e  ne THREE_BYTE_IN
16330 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 69 38  T(x)  (65536*(i8
16340 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31  )((x)[0])|((x)[1
16350 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64  ]<<8)|(x)[2]).#d
16360 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f  efine FOUR_BYTE_
16370 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 32 29  UINT(x)  (((u32)
16380 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29  (x)[0]<<24)|((x)
16390 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d  [1]<<16)|((x)[2]
163a0 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a  <<8)|(x)[3])../*
163b0 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
163c0 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
163d0 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
163e0 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
163f0 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
16400 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
16410 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
16420 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
16430 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f  f bytes read..*/
16440 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
16450 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
16460 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
16470 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
16480 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
16490 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
164a0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
164c0 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
164d0 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
164e0 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
164f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16500 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
16510 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
16520 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 3b 0a   */.){.  u64 x;.
16530 20 20 75 33 32 20 79 3b 0a 20 20 73 77 69 74 63    u32 y;.  switc
16540 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
16550 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20  {.    case 10:  
16560 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
16570 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
16580 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
16590 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
165a0 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
165b0 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55  case 0: {  /* NU
165c0 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  LL */.      pMem
165d0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
165e0 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
165f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16600 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
16610 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
16620 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
16630 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28   = ONE_BYTE_INT(
16640 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
16650 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
16660 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
16670 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
16680 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
16690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
166a0 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
166b0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
166c0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
166d0 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  i = TWO_BYTE_INT
166e0 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
166f0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
16700 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
16710 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
16720 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
16730 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  2;.    }.    cas
16740 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
16750 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
16760 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
16770 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f  .i = THREE_BYTE_
16780 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
16790 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
167a0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
167b0 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
167c0 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
167d0 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 3;.    }.    
167e0 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
167f0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
16800 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20  er */.      y = 
16810 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
16820 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
16830 3e 75 2e 69 20 3d 20 28 69 36 34 29 2a 28 69 6e  >u.i = (i64)*(in
16840 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 70 4d 65  t*)&y;.      pMe
16850 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
16860 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
16870 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
16880 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
16890 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  4;.    }.    cas
168a0 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
168b0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
168c0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
168d0 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55  .i = FOUR_BYTE_U
168e0 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28  INT(buf+2) + (((
168f0 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
16900 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
16910 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
16920 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
16930 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
16940 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
16950 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d   return 6;.    }
16960 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f  .    case 6:   /
16970 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
16980 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
16990 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45  ase 7: { /* IEEE
169a0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
169b0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
169c0 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
169d0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
169e0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
169f0 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
16a00 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e  that integers an
16a10 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  d floating point
16a20 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20   values use the 
16a30 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  same.      ** by
16a40 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
16a50 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
16a60 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
16a70 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20  _FLOAT is.      
16a80 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
16a90 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
16aa0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
16ab0 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
16ac0 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20      ** endian.. 
16ad0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
16ae0 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
16af0 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
16b00 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20  0000)<<32;.     
16b10 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f   static const do
16b20 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20  uble r1 = 1.0;. 
16b30 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31       u64 t2 = t1
16b40 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
16b50 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29  dEndianFloat(t2)
16b60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16b70 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
16b80 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
16b90 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
16ba0 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
16bb0 64 69 66 0a 20 20 20 20 20 20 78 20 3d 20 46 4f  dif.      x = FO
16bc0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
16bd0 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  );.      y = FOU
16be0 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b  R_BYTE_UINT(buf+
16bf0 34 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  4);.      x = (x
16c00 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
16c10 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
16c20 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==6 ){.        p
16c30 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
16c40 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d  *)&x;.        pM
16c50 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
16c60 49 6e 74 3b 0a 20 20 20 20 20 20 20 20 74 65 73  Int;.        tes
16c70 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
16c80 3c 30 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  <0 );.      }els
16c90 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
16ca0 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
16cb0 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  && sizeof(pMem->
16cc0 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20  r)==8 );.       
16cd0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
16ce0 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20  Float(x);.      
16cf0 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e    memcpy(&pMem->
16d00 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
16d10 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
16d20 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  >flags = sqlite3
16d30 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f  IsNaN(pMem->r) ?
16d40 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f   MEM_Null : MEM_
16d50 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Real;.      }.  
16d60 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20      return 8;.  
16d70 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
16d80 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
16d90 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
16da0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
16db0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
16dc0 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
16dd0 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
16de0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
16df0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
16e00 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
16e10 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69  t: {.      stati
16e20 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61  c const u16 aFla
16e30 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62  g[] = { MEM_Blob
16e40 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f  |MEM_Ephem, MEM_
16e50 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b  Str|MEM_Ephem };
16e60 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d  .      u32 len =
16e70 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
16e80 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
16e90 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
16ea0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
16eb0 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65  = len;.      pMe
16ec0 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20  m->xDel = 0;.   
16ed0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
16ee0 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79   aFlag[serial_ty
16ef0 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74  pe&1];.      ret
16f00 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20  urn len;.    }. 
16f10 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
16f20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
16f30 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
16f40 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69  allocate suffici
16f50 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e  ent space for an
16f60 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
16f70 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72  ** structure lar
16f80 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20  ge enough to be 
16f90 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65  used with sqlite
16fa0 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
16fb0 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69  k() if.** the fi
16fc0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
16fd0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79  a pointer to Key
16fe0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70  Info structure p
16ff0 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54  KeyInfo..**.** T
17000 68 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68  he space is eith
17010 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  er allocated usi
17020 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ng sqlite3DbMall
17030 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20  ocRaw() or from 
17040 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e  within.** the un
17050 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70  aligned buffer p
17060 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65  assed via the se
17070 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61  cond and third a
17080 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d  rguments (presum
17090 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70  ably.** stack sp
170a0 61 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72  ace). If the for
170b0 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65  mer, then *ppFre
170c0 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  e is set to a po
170d0 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c  inter that shoul
170e0 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c  d.** be eventual
170f0 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20  ly freed by the 
17100 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c  caller using sql
17110 69 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72  ite3DbFree(). Or
17120 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c  , if the .** all
17130 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72  ocation comes fr
17140 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a  om the pSpace/sz
17150 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70  Space buffer, *p
17160 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
17170 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72  NULL.** before r
17180 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
17190 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
171a0 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
171b0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70  returned..*/.Unp
171c0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c  ackedRecord *sql
171d0 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
171e0 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b  ackedRecord(.  K
171f0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
17200 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17210 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
17220 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20   the record */. 
17230 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20   char *pSpace,  
17240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17250 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70   /* Unaligned sp
17260 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  ace available */
17270 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20  .  int szSpace, 
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17290 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53     /* Size of pS
172a0 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20  pace[] in bytes 
172b0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72  */.  char **ppFr
172c0 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
172d0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c       /* OUT: Cal
172e0 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20  ler should free 
172f0 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  this pointer */.
17300 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  ){.  UnpackedRec
17310 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ord *p;         
17320 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64       /* Unpacked
17330 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72   record to retur
17340 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b  n */.  int nOff;
17350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17360 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d         /* Increm
17370 65 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f  ent pSpace by nO
17380 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a  ff to align it *
17390 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
173c0 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
173d0 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20  for *p */..  /* 
173e0 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74  We want to shift
173f0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70   the pointer pSp
17400 61 63 65 20 75 70 20 73 75 63 68 20 74 68 61 74  ace up such that
17410 20 69 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c   it is 8-byte al
17420 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73  igned..  ** Thus
17430 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c  , we need to cal
17440 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20  culate a value, 
17450 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20  nOff, between 0 
17460 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20  and 7, to shift 
17470 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66  .  ** it by.  If
17480 20 70 53 70 61 63 65 20 69 73 20 61 6c 72 65 61   pSpace is alrea
17490 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  dy 8-byte aligne
174a0 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62  d, nOff should b
174b0 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e  e zero..  */.  n
174c0 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49  Off = (8 - (SQLI
174d0 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53  TE_PTR_TO_INT(pS
174e0 70 61 63 65 29 20 26 20 37 29 29 20 26 20 37 3b  pace) & 7)) & 7;
174f0 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
17500 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
17510 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65  dRecord)) + size
17520 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66  of(Mem)*(pKeyInf
17530 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20  o->nField+1);.  
17540 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63  if( nByte>szSpac
17550 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20  e+nOff ){.    p 
17560 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
17570 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  d *)sqlite3DbMal
17580 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d  locRaw(pKeyInfo-
17590 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >db, nByte);.   
175a0 20 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61 72   *ppFree = (char
175b0 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70   *)p;.    if( !p
175c0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
175d0 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55  else{.    p = (U
175e0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26  npackedRecord*)&
175f0 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20  pSpace[nOff];.  
17600 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20    *ppFree = 0;. 
17610 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20   }..  p->aMem = 
17620 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70  (Mem*)&((char*)p
17630 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )[ROUND8(sizeof(
17640 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
17650 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  ];.  assert( pKe
17660 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
17670 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65  r!=0 );.  p->pKe
17680 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
17690 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
176a0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
176b0 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70   + 1;.  return p
176c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
176d0 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65   the nKey-byte e
176e0 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63  ncoding of a rec
176f0 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70  ord in pKey[], p
17700 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20  opulate the .** 
17710 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
17720 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74  tructure indicat
17730 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68  ed by the fourth
17740 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74   argument with t
17750 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  he.** contents o
17760 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65  f the decoded re
17770 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  cord..*/ .void s
17780 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
17790 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66  Unpack(.  KeyInf
177a0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
177b0 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
177c0 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64  about the record
177d0 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74   format */.  int
177e0 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
177f0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
17800 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
17810 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
17820 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20   *pKey,      /* 
17830 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  The binary recor
17840 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
17850 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a  ecord *p      /*
17860 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73   Populate this s
17870 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20  tructure before 
17880 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b  returning. */.){
17890 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
178a0 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
178b0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
178c0 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e  har *)pKey;.  in
178d0 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b  t d; .  u32 idx;
178e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
17900 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72  t in aKey[] to r
17910 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31  ead from */.  u1
17920 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  6 u;            
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17940 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
17950 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20  ounter */.  u32 
17960 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d  szHdr;.  Mem *pM
17970 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20  em = p->aMem;.. 
17980 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d   p->default_rc =
17990 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   0;.  assert( EI
179a0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
179b0 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64  NT(pMem) );.  id
179c0 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  x = getVarint32(
179d0 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
179e0 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d  d = szHdr;.  u =
179f0 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   0;.  while( idx
17a00 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e  <szHdr && u<p->n
17a10 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79  Field && d<=nKey
17a20 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
17a30 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
17a40 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
17a50 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72  (&aKey[idx], ser
17a60 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70  ial_type);.    p
17a70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49  Mem->enc = pKeyI
17a80 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d  nfo->enc;.    pM
17a90 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em->db = pKeyInf
17aa0 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d  o->db;.    /* pM
17ab0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f  em->flags = 0; /
17ac0 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  / sqlite3VdbeSer
17ad0 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65  ialGet() will se
17ae0 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f  t this for us */
17af0 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c  .    pMem->zMall
17b00 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  oc = 0;.    d +=
17b10 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17b20 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
17b30 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
17b40 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
17b50 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61      u++;.  }.  a
17b60 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e  ssert( u<=pKeyIn
17b70 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29  fo->nField + 1 )
17b80 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
17b90 75 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  u;.}..#if SQLITE
17ba0 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69  _DEBUG./*.** Thi
17bb0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
17bc0 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72  res two index or
17bd0 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65   table record ke
17be0 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ys in the same w
17bf0 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c  ay.** as the sql
17c00 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
17c10 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e  mpare() routine.
17c20 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f   Unlike VdbeReco
17c30 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20  rdCompare(),.** 
17c40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  this function de
17c50 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63  serializes and c
17c60 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20 75  ompares values u
17c70 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69  sing the.** sqli
17c80 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
17c90 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65  () and sqlite3Me
17ca0 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74  mCompare() funct
17cb0 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64  ions. It is used
17cc0 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
17cd0 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
17ce0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6f 70  sure that the op
17cf0 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a  timized code in.
17d00 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  ** sqlite3VdbeRe
17d10 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65  cordCompare() re
17d20 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69  turns results wi
17d30 74 68 20 74 68 65 73 65 20 74 77 6f 20 70 72 69  th these two pri
17d40 6d 69 74 69 76 65 73 2e 0a 2a 2f 0a 73 74 61 74  mitives..*/.stat
17d50 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
17d60 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20  dCompareDebug(. 
17d70 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
17d80 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
17d90 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
17da0 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65  const UnpackedRe
17db0 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 2f 2a  cord *pPKey2  /*
17dc0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
17dd0 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
17de0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
17df0 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
17e00 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
17e10 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
17e20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
17e30 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
17e40 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
17e50 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
17e60 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a  zHdr1;        /*
17e70 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
17e80 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
17e90 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
17ea0 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
17eb0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17ec0 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
17ed0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
17ee0 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
17ef0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
17f00 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
17f10 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
17f20 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e  yInfo;.  mem1.en
17f30 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
17f40 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70  c;.  mem1.db = p
17f50 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f  KeyInfo->db;.  /
17f60 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30  * mem1.flags = 0
17f70 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e  ;  // Will be in
17f80 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c  itialized by sql
17f90 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
17fa0 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c  t() */.  VVA_ONL
17fb0 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20  Y( mem1.zMalloc 
17fc0 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e  = 0; ) /* Only n
17fd0 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28  eeded by assert(
17fe0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
17ff0 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20  .  /* Compilers 
18000 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61  may complain tha
18010 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f  t mem1.u.i is po
18020 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74  tentially uninit
18030 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65  ialized..  ** We
18040 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a   could initializ
18050 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68  e it, as shown h
18060 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20  ere, to silence 
18070 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73  those complaints
18080 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61  ..  ** But in fa
18090 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c  ct, mem1.u.i wil
180a0 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79  l never actually
180b0 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69   be used uniniti
180c0 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e  alized, and doin
180d0 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65  g .  ** the unne
180e0 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69  cessary initiali
180f0 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61  zation has a mea
18100 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65  surable negative
18110 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a   performance.  *
18120 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20  * impact, since 
18130 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
18140 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e  a very high runn
18150 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20  er.  And so, we 
18160 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69  choose.  ** to i
18170 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c  gnore the compil
18180 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20  er warnings and 
18190 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61  leave this varia
181a0 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  ble uninitialize
181b0 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65  d..  */.  /*  me
181c0 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20  m1.u.i = 0;  // 
181d0 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65  not needed, here
181e0 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70   to silence comp
181f0 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  iler warning */.
18200 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56    .  idx1 = getV
18210 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
18220 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73  zHdr1);.  d1 = s
18230 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28  zHdr1;.  assert(
18240 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
18250 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
18260 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
18270 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  eld || CORRUPT_D
18280 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
18290 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
182a0 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
182b0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
182c0 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
182d0 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
182e0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
182f0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
18300 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
18310 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
18320 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
18330 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
18340 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
18350 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
18360 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
18370 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
18380 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65  e1 );..    /* Ve
18390 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20  rify that there 
183a0 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70  is enough key sp
183b0 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f  ace remaining to
183c0 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20   avoid.    ** a 
183d0 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e  buffer overread.
183e0 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c    The "d1+serial
183f0 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70  _type1+2" subexp
18400 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  ression will.   
18410 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72   ** always be gr
18420 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
18430 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e  ual to the amoun
18440 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65  t of required ke
18450 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  y space..    ** 
18460 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69  Use that approxi
18470 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20  mation to avoid 
18480 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69  the more expensi
18490 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ve call to.    *
184a0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
184b0 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20  ialTypeLen() in 
184c0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
184d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
184e0 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
184f0 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20  2>(u32)nKey1.   
18500 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56    && d1+sqlite3V
18510 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
18520 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28  (serial_type1)>(
18530 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29  u32)nKey1 .    )
18540 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
18550 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74     }..    /* Ext
18560 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
18570 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
18580 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
18590 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
185a0 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
185b0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
185c0 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
185d0 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
185e0 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
185f0 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
18600 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
18610 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65  y2->aMem[i], pKe
18620 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29  yInfo->aColl[i])
18630 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
18640 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18650 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30   mem1.zMalloc==0
18660 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
18670 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ent below */.   
18680 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
18690 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
186a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
186b0 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74  rc;  /* Invert t
186c0 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45  he result for DE
186d0 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a  SC sort order. *
186e0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
186f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18700 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69  .    i++;.  }whi
18710 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
18720 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
18730 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  eld );..  /* No 
18740 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
18750 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
18760 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
18770 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
18780 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
18790 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
187a0 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
187b0 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
187c0 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
187d0 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
187e0 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
187f0 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a  Release(&mem1)..
18800 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
18810 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  em1.zMalloc==0 )
18820 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
18830 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
18840 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
18850 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
18860 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
18870 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
18880 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
18890 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
188a0 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20  the default_rc. 
188b0 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20   ** value.  */. 
188c0 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e   return pPKey2->
188d0 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 23 65  default_rc;.}.#e
188e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68  ndif../*.** Both
188f0 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65   *pMem1 and *pMe
18900 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e  m2 contain strin
18910 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72  g values. Compar
18920 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  e the two values
18930 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f  .** using the co
18940 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18950 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c   pColl. As usual
18960 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74  , return a negat
18970 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  ive , zero.** or
18980 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
18990 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73  if *pMem1 is les
189a0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
189b0 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
189c0 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73   .** *pMem2, res
189d0 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c  pectively. Simil
189e0 61 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20  ar in spirit to 
189f0 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d  "rc = (*pMem1) -
18a00 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a   (*pMem2);"..*/.
18a10 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
18a20 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
18a30 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  .  const Mem *pM
18a40 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  em1,.  const Mem
18a50 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74   *pMem2,.  const
18a60 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 0a   CollSeq *pColl.
18a70 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e  ){.  if( pMem1->
18a80 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
18a90 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74  ){.    /* The st
18aa0 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64  rings are alread
18ab0 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  y in the correct
18ac0 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c   encoding.  Call
18ad0 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d   the.     ** com
18ae0 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
18af0 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20   directly */.   
18b00 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78   return pColl->x
18b10 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
18b20 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d  ,pMem1->n,pMem1-
18b30 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d  >z,pMem2->n,pMem
18b40 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2->z);.  }else{.
18b50 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
18b60 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20  const void *v1, 
18b70 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c  *v2;.    int n1,
18b80 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b   n2;.    Mem c1;
18b90 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20  .    Mem c2;.   
18ba0 20 6d 65 6d 73 65 74 28 26 63 31 2c 20 30 2c 20   memset(&c1, 0, 
18bb0 73 69 7a 65 6f 66 28 63 31 29 29 3b 0a 20 20 20  sizeof(c1));.   
18bc0 20 6d 65 6d 73 65 74 28 26 63 32 2c 20 30 2c 20   memset(&c2, 0, 
18bd0 73 69 7a 65 6f 66 28 63 32 29 29 3b 0a 20 20 20  sizeof(c2));.   
18be0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
18bf0 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20  hallowCopy(&c1, 
18c00 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem1, MEM_Ephem
18c10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
18c20 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
18c30 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d  (&c2, pMem2, MEM
18c40 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20  _Ephem);.    v1 
18c50 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
18c60 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
18c70 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c1, pColl->e
18c80 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31  nc);.    n1 = v1
18c90 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a  ==0 ? 0 : c1.n;.
18ca0 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33      v2 = sqlite3
18cb0 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
18cc0 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70  e3_value*)&c2, p
18cd0 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
18ce0 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a  n2 = v2==0 ? 0 :
18cf0 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20   c2.n;.    rc = 
18d00 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
18d10 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31  l->pUser, n1, v1
18d20 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 73  , n2, v2);.    s
18d30 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
18d40 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73  ease(&c1);.    s
18d50 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
18d60 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72  ease(&c2);.    r
18d70 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a  eturn rc;.  }.}.
18d80 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
18d90 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69  he values contai
18da0 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d  ned by the two m
18db0 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74  emory cells, ret
18dc0 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69  urning.** negati
18dd0 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69  ve, zero or posi
18de0 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73  tive if pMem1 is
18df0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
18e00 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
18e10 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20  .** than pMem2. 
18e20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73  Sorting order is
18e30 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66   NULL's first, f
18e40 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65  ollowed by numbe
18e50 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20  rs (integers.** 
18e60 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65  and reals) sorte
18e70 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66  d numerically, f
18e80 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20  ollowed by text 
18e90 6f 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63  ordered by the c
18ea0 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
18eb0 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66  ence pColl and f
18ec0 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72  inally blob's or
18ed0 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28  dered by memcmp(
18ee0 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  )..**.** Two NUL
18ef0 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e  L values are con
18f00 73 69 64 65 72 65 64 20 65 71 75 61 6c 20 62 79  sidered equal by
18f10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
18f20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65  */.int sqlite3Me
18f30 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d  mCompare(const M
18f40 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74  em *pMem1, const
18f50 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e   Mem *pMem2, con
18f60 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
18f70 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  l){.  int rc;.  
18f80 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e  int f1, f2;.  in
18f90 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  t combined_flags
18fa0 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d  ;..  f1 = pMem1-
18fb0 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70  >flags;.  f2 = p
18fc0 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63  Mem2->flags;.  c
18fd0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20  ombined_flags = 
18fe0 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28  f1|f2;.  assert(
18ff0 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73   (combined_flags
19000 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d   & MEM_RowSet)==
19010 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f  0 );. .  /* If o
19020 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  ne value is NULL
19030 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  , it is less tha
19040 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20  n the other. If 
19050 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a  both values.  **
19060 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72   are NULL, retur
19070 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
19080 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d  combined_flags&M
19090 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
190a0 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75  eturn (f2&MEM_Nu
190b0 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75  ll) - (f1&MEM_Nu
190c0 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ll);.  }..  /* I
190d0 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61  f one value is a
190e0 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
190f0 6f 74 68 65 72 20 69 73 20 6e 6f 74 2c 20 74 68  other is not, th
19100 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e number is less
19110 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61  ..  ** If both a
19120 72 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f 6d 70  re numbers, comp
19130 61 72 65 20 61 73 20 72 65 61 6c 73 20 69 66 20  are as reals if 
19140 6f 6e 65 20 69 73 20 61 20 72 65 61 6c 2c 20 6f  one is a real, o
19150 72 20 61 73 20 69 6e 74 65 67 65 72 73 0a 20 20  r as integers.  
19160 2a 2a 20 69 66 20 62 6f 74 68 20 76 61 6c 75 65  ** if both value
19170 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 2e 0a  s are integers..
19180 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
19190 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49  ned_flags&(MEM_I
191a0 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a  nt|MEM_Real) ){.
191b0 20 20 20 20 64 6f 75 62 6c 65 20 72 31 2c 20 72      double r1, r
191c0 32 3b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26  2;.    if( (f1 &
191d0 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d   f2 & MEM_Int)!=
191e0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
191f0 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d  Mem1->u.i < pMem
19200 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20  2->u.i ) return 
19210 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  -1;.      if( pM
19220 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32  em1->u.i > pMem2
19230 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 31  ->u.i ) return 1
19240 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
19250 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19260 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  (f1&MEM_Real)!=0
19270 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 70   ){.      r1 = p
19280 4d 65 6d 31 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c  Mem1->r;.    }el
19290 73 65 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49  se if( (f1&MEM_I
192a0 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
192b0 72 31 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65  r1 = (double)pMe
192c0 6d 31 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c  m1->u.i;.    }el
192d0 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
192e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
192f0 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f2&MEM_Real)!
19300 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d  =0 ){.      r2 =
19310 20 70 4d 65 6d 32 2d 3e 72 3b 0a 20 20 20 20 7d   pMem2->r;.    }
19320 65 6c 73 65 20 69 66 28 20 28 66 32 26 4d 45 4d  else if( (f2&MEM
19330 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
19340 20 20 72 32 20 3d 20 28 64 6f 75 62 6c 65 29 70    r2 = (double)p
19350 4d 65 6d 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  Mem2->u.i;.    }
19360 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
19370 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
19380 20 69 66 28 20 72 31 3c 72 32 20 29 20 72 65 74   if( r1<r2 ) ret
19390 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  urn -1;.    if( 
193a0 72 31 3e 72 32 20 29 20 72 65 74 75 72 6e 20 31  r1>r2 ) return 1
193b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
193c0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65    }..  /* If one
193d0 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
193e0 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72  ng and the other
193f0 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20   is a blob, the 
19400 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a  string is less..
19410 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65    ** If both are
19420 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72   strings, compar
19430 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  e using the coll
19440 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e  ating functions.
19450 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
19460 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53  ined_flags&MEM_S
19470 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66  tr ){.    if( (f
19480 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  1 & MEM_Str)==0 
19490 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
194a0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
194b0 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d   (f2 & MEM_Str)=
194c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
194d0 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn -1;.    }..  
194e0 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d    assert( pMem1-
194f0 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63  >enc==pMem2->enc
19500 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19510 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
19520 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20  TE_UTF8 || .    
19530 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65          pMem1->e
19540 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
19550 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63  LE || pMem1->enc
19560 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  ==SQLITE_UTF16BE
19570 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   );..    /* The 
19580 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
19590 63 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e  ce must be defin
195a0 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
195b0 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a  , even if.    **
195c0 20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65   the user delete
195d0 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
195e0 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74  sequence after t
195f0 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
19600 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  is.    ** compil
19610 65 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74  ed (this was not
19620 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
19630 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  )..    */.    as
19640 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20  sert( !pColl || 
19650 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a  pColl->xCmp );..
19660 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
19670 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
19680 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
19690 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c  ng(pMem1, pMem2,
196a0 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20   pColl);.    }. 
196b0 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20     /* If a NULL 
196c0 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73  pointer was pass
196d0 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74  ed as the collat
196e0 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c  e function, fall
196f0 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20   through.    ** 
19700 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65  to the blob case
19710 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28   and use memcmp(
19720 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f  ).  */.  }. .  /
19730 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75  * Both values mu
19740 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f  st be blobs.  Co
19750 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63  mpare using memc
19760 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 63 20 3d  mp().  */.  rc =
19770 20 6d 65 6d 63 6d 70 28 70 4d 65 6d 31 2d 3e 7a   memcmp(pMem1->z
19780 2c 20 70 4d 65 6d 32 2d 3e 7a 2c 20 28 70 4d 65  , pMem2->z, (pMe
19790 6d 31 2d 3e 6e 3e 70 4d 65 6d 32 2d 3e 6e 29 3f  m1->n>pMem2->n)?
197a0 70 4d 65 6d 32 2d 3e 6e 3a 70 4d 65 6d 31 2d 3e  pMem2->n:pMem1->
197b0 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
197c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 4d 65 6d  ){.    rc = pMem
197d0 31 2d 3e 6e 20 2d 20 70 4d 65 6d 32 2d 3e 6e 3b  1->n - pMem2->n;
197e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
197f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
19800 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
19810 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
19820 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69  nction is a seri
19830 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20  al-type that.** 
19840 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
19850 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20  n integer - all 
19860 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31  values between 1
19870 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65   and 9 inclusive
19880 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54   .** except 7. T
19890 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73  he second points
198a0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
198b0 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67  taining an integ
198c0 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69  er value.** seri
198d0 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67  alized according
198e0 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e   to serial_type.
198f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
19900 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61  eserializes.** a
19910 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  nd returns the v
19920 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
19930 69 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65  i64 vdbeRecordDe
19940 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69  codeInt(u32 seri
19950 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75  al_type, const u
19960 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20  8 *aKey){.  u32 
19970 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  y;.  assert( COR
19980 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69  RUPT_DB || (seri
19990 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65  al_type>=1 && se
199a0 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20  rial_type<=9 && 
199b0 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20  serial_type!=7) 
199c0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
199d0 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
199e0 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65  case 0:.    case
199f0 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   1:.      testca
19a00 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
19a10 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
19a20 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b   ONE_BYTE_INT(aK
19a30 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a  ey);.    case 2:
19a40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19a50 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
19a60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57  .      return TW
19a70 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
19a80 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20  ;.    case 3:.  
19a90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
19aa0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
19ab0 20 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45      return THREE
19ac0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
19ad0 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20  .    case 4: {. 
19ae0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
19af0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
19b00 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
19b10 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
19b20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34       return (i64
19b30 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20  )*(int*)&y;.    
19b40 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a  }.    case 5: {.
19b50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19b60 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
19b70 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55        return FOU
19b80 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
19b90 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
19ba0 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
19bb0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20  T(aKey);.    }. 
19bc0 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20     case 6: {.   
19bd0 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f     u64 x = FOUR_
19be0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
19bf0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19c00 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
19c10 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
19c20 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55  2) | FOUR_BYTE_U
19c30 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20  INT(aKey+4);.   
19c40 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
19c50 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a  (i64*)&x;.    }.
19c60 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73    }..  return (s
19c70 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b  erial_type - 8);
19c80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
19c90 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
19ca0 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72   the two table r
19cb0 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63  ows or index rec
19cc0 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65  ords.** specifie
19cd0 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  d by {nKey1, pKe
19ce0 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20  y1} and pPKey2. 
19cf0 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65   It returns a ne
19d00 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
19d10 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
19d20 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c  ger if key1 is l
19d30 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
19d40 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65  to or .** greate
19d50 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68  r than key2.  Th
19d60 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  e {nKey1, pKey1}
19d70 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62   key must be a b
19d80 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62  lob.** created b
19d90 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  y th OP_MakeReco
19da0 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65  rd opcode of the
19db0 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65   VDBE.  The pPKe
19dc0 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62  y2.** key must b
19dd0 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73  e a parsed key s
19de0 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20  uch as obtained 
19df0 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56  from.** sqlite3V
19e00 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a  dbeParseRecord..
19e10 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
19e20 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  t bSkip is non-z
19e30 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
19e40 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
19e50 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  er has already.*
19e60 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  * determined tha
19e70 74 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  t the first fiel
19e80 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61  ds of the keys a
19e90 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20  re equal..**.** 
19ea0 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
19eb0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
19ec0 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
19ed0 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20  mber of fields. 
19ee0 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64  If all .** field
19ef0 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
19f00 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65   both keys are e
19f10 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79  qual, then pPKey
19f20 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73  2->default_rc is
19f30 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a   .** returned..*
19f40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
19f50 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a  eRecordCompare(.
19f60 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
19f70 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
19f80 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f    /* Left key */
19f90 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65  .  const Unpacke
19fa0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c  dRecord *pPKey2,
19fb0 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
19fc0 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20  */.  int bSkip  
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fe0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
19ff0 20 73 6b 69 70 20 74 68 65 20 66 69 72 73 74 20   skip the first 
1a000 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33  field */.){.  u3
1a010 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  2 d1;           
1a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a030 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
1a040 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
1a050 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   element */.  in
1a060 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a080 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66   Index of next f
1a090 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  ield to compare 
1a0a0 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
1a0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0c0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1a0d0 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e  record header in
1a0e0 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
1a0f0 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 20  idx1;           
1a100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1a110 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74  ffset of first t
1a120 79 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f  ype in header */
1a130 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
1a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a150 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
1a160 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68  ue */.  Mem *pRh
1a170 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  s = pPKey2->aMem
1a180 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  ;       /* Next 
1a190 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
1a1a0 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
1a1b0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1a1c0 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
1a1d0 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  Info;.  const un
1a1e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
1a1f0 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
1a200 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
1a210 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  1;.  Mem mem1;..
1a220 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73    /* If bSkip is
1a230 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
1a240 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
1a250 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  dy determined th
1a260 61 74 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  at the first.  *
1a270 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  * two elements i
1a280 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65  n the keys are e
1a290 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61  qual. Fix the va
1a2a0 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69  rious stack vari
1a2b0 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68  ables so.  ** th
1a2c0 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  at this routine 
1a2d0 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67  begins comparing
1a2e0 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66   at the second f
1a2f0 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62  ield. */.  if( b
1a300 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20  Skip ){.    u32 
1a310 73 31 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31  s1;.    idx1 = 1
1a320 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 26   + getVarint32(&
1a330 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20  aKey1[1], s1);. 
1a340 20 20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79     szHdr1 = aKey
1a350 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73  1[0];.    d1 = s
1a360 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56  zHdr1 + sqlite3V
1a370 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1a380 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b  (s1);.    i = 1;
1a390 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d  .    pRhs++;.  }
1a3a0 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d  else{.    idx1 =
1a3b0 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1a3c0 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20  y1, szHdr1);.   
1a3d0 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
1a3e0 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20    i = 0;.  }..  
1a3f0 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a  VVA_ONLY( mem1.z
1a400 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1a410 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1a420 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1a430 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nts */.  assert(
1a440 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1a450 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32  o->nField+pPKey2
1a460 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  ->pKeyInfo->nXFi
1a470 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
1a480 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43  eld .       || C
1a490 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
1a4a0 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1a4b0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1a4c0 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
1a4d0 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1a4e0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29  Info->nField>0 )
1a4f0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
1a500 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
1a510 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
1a520 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
1a530 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53  ype;..    /* RHS
1a540 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a   is an integer *
1a550 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e  /.    if( pRhs->
1a560 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
1a570 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
1a580 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1a590 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1];.      testca
1a5a0 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1a5b0 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1a5c0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
1a5d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1a5e0 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1a5f0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1a600 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1a610 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1a620 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1a630 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1a640 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20 28    double rhs = (
1a650 64 6f 75 62 6c 65 29 70 52 68 73 2d 3e 75 2e 69  double)pRhs->u.i
1a660 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1a670 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1a680 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
1a690 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
1a6a0 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31          if( mem1
1a6b0 2e 72 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20  .r<rhs ){.      
1a6c0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1a6d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d       }else if( m
1a6e0 65 6d 31 2e 72 3e 72 68 73 20 29 7b 0a 20 20 20  em1.r>rhs ){.   
1a6f0 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1a700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a710 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1a720 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63  64 lhs = vdbeRec
1a730 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72  ordDecodeInt(ser
1a740 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31  ial_type, &aKey1
1a750 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  [d1]);.        i
1a760 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75  64 rhs = pRhs->u
1a770 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  .i;.        if( 
1a780 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs<rhs ){.     
1a790 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1a7a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a7b0 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs>rhs ){.     
1a7c0 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1a7d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1a7e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1a7f0 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20  S is real */.   
1a800 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e   else if( pRhs->
1a810 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
1a820 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c   ){.      serial
1a830 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1a840 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73  x1];.      if( s
1a850 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
1a860 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
1a870 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1a880 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1a890 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1a8a0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1a8b0 65 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c  e{.        doubl
1a8c0 65 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 72 3b  e rhs = pRhs->r;
1a8d0 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20  .        double 
1a8e0 6c 68 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  lhs;.        sql
1a8f0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1a900 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
1a910 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31  rial_type, &mem1
1a920 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
1a930 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
1a940 0a 20 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d  .          lhs =
1a950 20 6d 65 6d 31 2e 72 3b 0a 20 20 20 20 20 20 20   mem1.r;.       
1a960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a970 20 20 6c 68 73 20 3d 20 28 64 6f 75 62 6c 65 29    lhs = (double)
1a980 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20  mem1.u.i;.      
1a990 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1a9a0 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs<rhs ){.     
1a9b0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1a9c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a9d0 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs>rhs ){.     
1a9e0 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1a9f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1aa00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1aa10 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f  S is a string */
1aa20 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1aa30 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1aa40 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74  Str ){.      get
1aa50 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1aa60 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  idx1], serial_ty
1aa70 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  pe);.      testc
1aa80 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1aa90 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1aaa0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
1aab0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1aac0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1aad0 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
1aae0 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20  pe & 0x01) ){.  
1aaf0 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1ab00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ab10 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65      mem1.n = (se
1ab20 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20  rial_type - 12) 
1ab30 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73  / 2;.        tes
1ab40 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e  tcase( (d1+mem1.
1ab50 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  n)==(unsigned)nK
1ab60 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ey1 );.        t
1ab70 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d  estcase( (d1+mem
1ab80 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65  1.n+1)==(unsigne
1ab90 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1aba0 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e     if( (d1+mem1.
1abb0 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e  n) > (unsigned)n
1abc0 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20  Key1 ){.        
1abd0 20 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20    rc = 1;       
1abe0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1abf0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1ac00 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79    }else if( pKey
1ac10 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  Info->aColl[i] )
1ac20 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  {.          mem1
1ac30 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
1ac40 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  >enc;.          
1ac50 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
1ac60 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  fo->db;.        
1ac70 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d    mem1.flags = M
1ac80 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20  EM_Str;.        
1ac90 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72    mem1.z = (char
1aca0 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20  *)&aKey1[d1];.  
1acb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
1acc0 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1acd0 67 28 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70  g(&mem1, pRhs, p
1ace0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
1acf0 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
1ad00 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
1ad10 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31   nCmp = MIN(mem1
1ad20 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  .n, pRhs->n);.  
1ad30 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
1ad40 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
1ad50 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
1ad60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1ad70 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e  ==0 ) rc = mem1.
1ad80 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20  n - pRhs->n; .  
1ad90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ada0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1adb0 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20  S is a blob */. 
1adc0 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
1add0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
1ade0 6f 62 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56  ob ){.      getV
1adf0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69  arint32(&aKey1[i
1ae00 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  dx1], serial_typ
1ae10 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1ae20 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1ae30 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1ae40 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
1ae50 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20  || (serial_type 
1ae60 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20  & 0x01) ){.     
1ae70 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1ae80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ae90 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72   int nStr = (ser
1aea0 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f  ial_type - 12) /
1aeb0 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   2;.        test
1aec0 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d  case( (d1+nStr)=
1aed0 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1aee0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1aef0 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31  case( (d1+nStr+1
1af00 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1af10 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y1 );.        if
1af20 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75  ( (d1+nStr) > (u
1af30 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1af40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1af50 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1af60 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
1af70 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
1af80 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1af90 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c  nCmp = MIN(nStr,
1afa0 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20   pRhs->n);.     
1afb0 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70       rc = memcmp
1afc0 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68  (&aKey1[d1], pRh
1afd0 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20  s->z, nCmp);.   
1afe0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30         if( rc==0
1aff0 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70   ) rc = nStr - p
1b000 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20  Rhs->n;.        
1b010 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1b020 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e  .    /* RHS is n
1b030 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b  ull */.    else{
1b040 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1b050 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1b060 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 65  ;.      rc = (se
1b070 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20  rial_type!=0);. 
1b080 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
1b090 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1b0a0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
1b0b0 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20  Order[i] ){.    
1b0c0 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20      rc = -rc;.  
1b0d0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
1b0e0 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 0a 20  rt( CORRUPT_DB. 
1b0f0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 72 63 3c           || (rc<
1b100 30 20 26 26 20 76 64 62 65 52 65 63 6f 72 64 43  0 && vdbeRecordC
1b110 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1b120 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1b130 29 3c 30 29 0a 20 20 20 20 20 20 20 20 20 20 7c  )<0).          |
1b140 7c 20 28 72 63 3e 30 20 26 26 20 76 64 62 65 52  | (rc>0 && vdbeR
1b150 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1b160 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
1b170 70 50 4b 65 79 32 29 3e 30 29 0a 20 20 20 20 20  pPKey2)>0).     
1b180 20 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f       || pKeyInfo
1b190 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1b1a0 65 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ed.      );.    
1b1b0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a    assert( mem1.z
1b1c0 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
1b1d0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
1b1e0 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
1b1f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
1b200 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b    i++;.    pRhs+
1b210 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  +;.    d1 += sql
1b220 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1b230 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
1b240 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20  e);.    idx1 += 
1b250 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e  sqlite3VarintLen
1b260 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
1b270 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75   }while( idx1<(u
1b280 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26  nsigned)szHdr1 &
1b290 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
1b2a0 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67  ld && d1<=(unsig
1b2b0 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20  ned)nKey1 );..  
1b2c0 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
1b2d0 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
1b2e0 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
1b2f0 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
1b300 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
1b310 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
1b320 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
1b330 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
1b340 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
1b350 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
1b360 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
1b370 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1b380 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  em1).  */.  asse
1b390 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63  rt( mem1.zMalloc
1b3a0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
1b3b0 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
1b3c0 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  at one or both o
1b3d0 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
1b3e0 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
1b3f0 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
1b400 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
1b410 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
1b420 2e 20 52 65 74 75 72 6e 20 74 68 65 20 74 68 65  . Return the the
1b430 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a   default_rc.  **
1b440 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73   value.  */.  as
1b450 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
1b460 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65   .       || pPKe
1b470 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  y2->default_rc==
1b480 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1b490 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1b4a0 65 79 31 2c 20 70 50 4b 65 79 32 29 20 0a 20 20  ey1, pPKey2) .  
1b4b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65  );.  return pPKe
1b4c0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1b4d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1b4e0 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74  nction is an opt
1b4f0 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  imized version o
1b500 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  f sqlite3VdbeRec
1b510 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a  ordCompare() .**
1b520 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69   that (a) the fi
1b530 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b  rst field of pPK
1b540 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ey2 is an intege
1b550 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a  r, and (b) the .
1b560 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65  ** size-of-heade
1b570 72 20 76 61 72 69 6e 74 20 61 74 20 74 68 65 20  r varint at the 
1b580 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f  start of (pKey1/
1b590 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61  nKey1) fits in a
1b5a0 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20   single.** byte 
1b5b0 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68  (i.e. is less th
1b5c0 61 6e 20 31 32 38 29 2e 0a 2a 2f 0a 73 74 61 74  an 128)..*/.stat
1b5d0 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1b5e0 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69  dCompareInt(.  i
1b5f0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1b600 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
1b610 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f  Left key */.  co
1b620 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  nst UnpackedReco
1b630 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52  rd *pPKey2, /* R
1b640 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ight key */.  in
1b650 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20  t bSkip         
1b660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1b670 67 6e 6f 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  gnored */.){.  c
1b680 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20  onst u8 *aKey = 
1b690 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  &((const u8*)pKe
1b6a0 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29  y1)[*(const u8*)
1b6b0 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20  pKey1 & 0x3F];. 
1b6c0 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65   int serial_type
1b6d0 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70   = ((const u8*)p
1b6e0 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20  Key1)[1];.  int 
1b6f0 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20  res;.  u32 y;.  
1b700 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76 20 3d  u64 x;.  i64 v =
1b710 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1b720 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b  .u.i;.  i64 lhs;
1b730 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1b740 54 45 52 28 62 53 6b 69 70 29 3b 0a 0a 20 20 61  TER(bSkip);..  a
1b750 73 73 65 72 74 28 20 62 53 6b 69 70 3d 3d 30 20  ssert( bSkip==0 
1b760 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
1b770 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
1b780 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62  case 1: { /* 1-b
1b790 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1b7a0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1b7b0 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  = ONE_BYTE_INT(a
1b7c0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1b7d0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1b7e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b7f0 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
1b800 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
1b810 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1b820 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45    lhs = TWO_BYTE
1b830 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1b840 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1b850 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1b860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1b870 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
1b880 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1b890 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48  /.      lhs = TH
1b8a0 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
1b8b0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1b8c0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1b8d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b8e0 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
1b8f0 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
1b900 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1b910 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
1b920 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1b930 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74  lhs = (i64)*(int
1b940 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&y;.      test
1b950 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1b960 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b970 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
1b980 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
1b990 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1b9a0 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54    lhs = FOUR_BYT
1b9b0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
1b9c0 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
1b9d0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1b9e0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1b9f0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1ba00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ba10 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a      case 6: { /*
1ba20 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
1ba30 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1ba40 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
1ba50 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1ba60 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
1ba70 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1ba80 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  y+4);.      lhs 
1ba90 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
1baa0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1bab0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1bac0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1bad0 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20  e 8: .      lhs 
1bae0 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1baf0 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20  ;.    case 9:.  
1bb00 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20      lhs = 1;.   
1bb10 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f     break;..    /
1bb20 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c  * This case coul
1bb30 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74  d be removed wit
1bb40 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68  hout changing th
1bb50 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e  e results of run
1bb60 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73  ning.    ** this
1bb70 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67   code. Including
1bb80 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20 74   it causes gcc t
1bb90 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 73  o generate a fas
1bba0 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20 20  ter switch .    
1bbb0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69  ** statement (si
1bbc0 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  nce the range of
1bbd0 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73 20   switch targets 
1bbe0 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a 65  now starts at ze
1bbf0 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73  ro and.    ** is
1bc00 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74   contiguous) but
1bc10 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
1bc20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f  any duplicate co
1bc30 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  de to be generat
1bc40 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63  ed.    ** (as gc
1bc50 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75  c is clever enou
1bc60 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  gh to combine th
1bc70 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73  e two like cases
1bc80 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a  ). Other .    **
1bc90 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74   compilers might
1bca0 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f   be similar.  */
1bcb0 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63 61   .    case 0: ca
1bcc0 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75  se 7:.      retu
1bcd0 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
1bce0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
1bcf0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1bd00 2c 20 30 29 3b 0a 0a 20 20 20 20 64 65 66 61 75  , 0);..    defau
1bd10 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
1bd20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1bd30 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
1bd40 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1bd50 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76  0);.  }..  if( v
1bd60 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  >lhs ){.    res 
1bd70 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
1bd80 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20  }else if( v<lhs 
1bd90 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
1bda0 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65  ey2->r2;.  }else
1bdb0 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
1bdc0 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  eld>1 ){.    /* 
1bdd0 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
1bde0 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
1bdf0 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70   are equal. Comp
1be00 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67  are the trailing
1be10 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e   .    ** fields.
1be20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73    */.    res = s
1be30 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1be40 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
1be50 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29  Key1, pPKey2, 1)
1be60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1be70 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
1be80 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
1be90 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64  ys are equal and
1bea0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72   there are no tr
1beb0 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69  ailing.    ** fi
1bec0 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b  elds. Return pPK
1bed0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
1bee0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f  in this case. */
1bef0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
1bf00 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
1bf10 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 72   }..  assert( (r
1bf20 65 73 3d 3d 30 20 26 26 20 76 64 62 65 52 65 63  es==0 && vdbeRec
1bf30 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1bf40 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1bf50 4b 65 79 32 29 3d 3d 30 29 0a 20 20 20 20 20 20  Key2)==0).      
1bf60 20 7c 7c 20 28 72 65 73 3c 30 20 26 26 20 76 64   || (res<0 && vd
1bf70 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1bf80 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1bf90 31 2c 20 70 50 4b 65 79 32 29 3c 30 29 0a 20 20  1, pPKey2)<0).  
1bfa0 20 20 20 20 20 7c 7c 20 28 72 65 73 3e 30 20 26       || (res>0 &
1bfb0 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  & vdbeRecordComp
1bfc0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1bfd0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3e 30  pKey1, pPKey2)>0
1bfe0 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52  ).       || CORR
1bff0 55 50 54 5f 44 42 0a 20 20 29 3b 0a 20 20 72 65  UPT_DB.  );.  re
1c000 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
1c010 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c020 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
1c030 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
1c040 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1c050 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20  pare() .** that 
1c060 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (a) the first fi
1c070 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73  eld of pPKey2 is
1c080 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20   a string, that 
1c090 28 62 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (b) the first fi
1c0a0 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20  eld.** uses the 
1c0b0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1c0c0 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63  ce BINARY and (c
1c0d0 29 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d  ) that the size-
1c0e0 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
1c0f0 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72   .** at the star
1c100 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79  t of (pKey1/nKey
1c110 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  1) fits in a sin
1c120 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61  gle byte..*/.sta
1c130 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f  tic int vdbeReco
1c140 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
1c150 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1c160 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1c170 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1c180 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64    const Unpacked
1c190 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
1c1a0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1c1b0 20 20 69 6e 74 20 62 53 6b 69 70 0a 29 7b 0a 20    int bSkip.){. 
1c1c0 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31   const u8 *aKey1
1c1d0 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b   = (const u8*)pK
1c1e0 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  ey1;.  int seria
1c1f0 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65  l_type;.  int re
1c200 73 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  s;.  UNUSED_PARA
1c210 4d 45 54 45 52 28 62 53 6b 69 70 29 3b 0a 0a 20  METER(bSkip);.. 
1c220 20 61 73 73 65 72 74 28 20 62 53 6b 69 70 3d 3d   assert( bSkip==
1c230 30 20 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74  0 );.  getVarint
1c240 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65  32(&aKey1[1], se
1c250 72 69 61 6c 5f 74 79 70 65 29 3b 0a 0a 20 20 69  rial_type);..  i
1c260 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1c270 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  2 ){.    res = p
1c280 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20  PKey2->r1;      
1c290 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
1c2a0 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20   is a number or 
1c2b0 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73  a null */.  }els
1c2c0 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
1c2d0 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a  ype & 0x01) ){ .
1c2e0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1c2f0 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r2;      /* (p
1c300 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
1c310 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65   blob */.  }else
1c320 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a  {.    int nCmp;.
1c330 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20      int nStr;.  
1c340 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b    int szHdr = aK
1c350 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74  ey1[0];..    nSt
1c360 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
1c370 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66  -12) / 2;.    if
1c380 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29  ( (szHdr + nStr)
1c390 20 3e 20 6e 4b 65 79 31 20 29 20 72 65 74 75 72   > nKey1 ) retur
1c3a0 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75  n 0;    /* Corru
1c3b0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 6e 43 6d  ption */.    nCm
1c3c0 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d  p = MIN( pPKey2-
1c3d0 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72  >aMem[0].n, nStr
1c3e0 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65   );.    res = me
1c3f0 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64  mcmp(&aKey1[szHd
1c400 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r], pPKey2->aMem
1c410 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20  [0].z, nCmp);.. 
1c420 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
1c430 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74  .      res = nSt
1c440 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r - pPKey2->aMem
1c450 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28  [0].n;.      if(
1c460 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
1c470 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e     if( pPKey2->n
1c480 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20  Field>1 ){.     
1c490 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74       res = sqlit
1c4a0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1c4b0 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  are(nKey1, pKey1
1c4c0 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20  , pPKey2, 1);.  
1c4d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c4e0 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
1c4f0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
1c500 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c510 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30   }else if( res>0
1c520 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
1c530 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
1c540 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c550 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1c560 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >r1;.      }.   
1c570 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30   }else if( res>0
1c580 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
1c590 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
1c5a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73  }else{.      res
1c5b0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
1c5c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1c5d0 72 74 28 20 28 72 65 73 3d 3d 30 20 26 26 20 76  rt( (res==0 && v
1c5e0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c5f0 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1c600 79 31 2c 20 70 50 4b 65 79 32 29 3d 3d 30 29 0a  y1, pPKey2)==0).
1c610 20 20 20 20 20 20 20 7c 7c 20 28 72 65 73 3c 30         || (res<0
1c620 20 26 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f   && vdbeRecordCo
1c630 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
1c640 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29  , pKey1, pPKey2)
1c650 3c 30 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 72  <0).       || (r
1c660 65 73 3e 30 20 26 26 20 76 64 62 65 52 65 63 6f  es>0 && vdbeReco
1c670 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
1c680 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1c690 65 79 32 29 3e 30 29 0a 20 20 20 20 20 20 20 7c  ey2)>0).       |
1c6a0 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 29  | CORRUPT_DB.  )
1c6b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
1c6c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1c6d0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
1c6e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1c6f0 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61  dCompare() compa
1c700 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  tible function.*
1c710 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63  * suitable for c
1c720 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69  omparing seriali
1c730 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74  zed records to t
1c740 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f  he unpacked reco
1c750 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  rd passed.** as 
1c760 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
1c770 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70  t..*/.RecordComp
1c780 61 72 65 20 73 71 6c 69 74 65 33 56 64 62 65 46  are sqlite3VdbeF
1c790 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63  indCompare(Unpac
1c7a0 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
1c7b0 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64   /* varintRecord
1c7c0 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64  CompareInt() and
1c7d0 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
1c7e0 70 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74  pareString() bot
1c7f0 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68  h assume.  ** th
1c800 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68  at the size-of-h
1c810 65 61 64 65 72 20 76 61 72 69 6e 74 20 74 68 61  eader varint tha
1c820 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20  t occurs at the 
1c830 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 72 65  start of each re
1c840 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69  cord.  ** fits i
1c850 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
1c860 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20  (i.e. is 127 or 
1c870 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63  less). varintRec
1c880 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a  ordCompareInt().
1c890 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65    ** also assume
1c8a0 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66  s that it is saf
1c8b0 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20  e to overread a 
1c8c0 62 75 66 66 65 72 20 62 79 20 61 74 20 6c 65 61  buffer by at lea
1c8d0 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78  st the .  ** max
1c8e0 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65  imum possible le
1c8f0 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  gal header size 
1c900 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42 65  plus 8 bytes. Be
1c910 63 61 75 73 65 20 74 68 65 72 65 20 69 73 0a 20  cause there is. 
1c920 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
1c930 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 37 34  o be at least 74
1c940 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62   (but not 136) b
1c950 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
1c960 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20  following each. 
1c970 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65   ** buffer passe
1c980 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72  d to varintRecor
1c990 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68  dCompareInt() th
1c9a0 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76  is makes it conv
1c9b0 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c  enient to.  ** l
1c9c0 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66  imit the size of
1c9d0 20 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 36   the header to 6
1c9e0 34 20 62 79 74 65 73 20 69 6e 20 63 61 73 65 73  4 bytes in cases
1c9f0 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
1ca00 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61   field.  ** is a
1ca10 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a  n integer..  **.
1ca20 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74    ** The easiest
1ca30 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20   way to enforce 
1ca40 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f  this limit is to
1ca50 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72   consider only r
1ca60 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a  ecords with.  **
1ca70 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65   13 fields or le
1ca80 73 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74  ss. If the first
1ca90 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74   field is an int
1caa0 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75  eger, the maximu
1cab0 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61  m legal.  ** hea
1cac0 64 65 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a  der size is (12*
1cad0 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73  5 + 1 + 1) bytes
1cae0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
1caf0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1cb00 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e   + p->pKeyInfo->
1cb10 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a  nXField)<=13 ){.
1cb20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
1cb30 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73  p->aMem[0].flags
1cb40 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65  ;.    if( p->pKe
1cb50 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1cb60 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d  r[0] ){.      p-
1cb70 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  >r1 = 1;.      p
1cb80 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  ->r2 = -1;.    }
1cb90 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72  else{.      p->r
1cba0 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d  1 = -1;.      p-
1cbb0 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  >r2 = 1;.    }. 
1cbc0 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
1cbd0 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20  MEM_Int) ){.    
1cbe0 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63    return vdbeRec
1cbf0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20  ordCompareInt;. 
1cc00 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
1cc10 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  e( flags & MEM_R
1cc20 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  eal );.    testc
1cc30 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
1cc40 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73  _Null );.    tes
1cc50 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
1cc60 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69  EM_Blob );.    i
1cc70 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d  f( (flags & (MEM
1cc80 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d  _Real|MEM_Null|M
1cc90 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20  EM_Blob))==0 && 
1cca0 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  p->pKeyInfo->aCo
1ccb0 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ll[0]==0 ){.    
1ccc0 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20    assert( flags 
1ccd0 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20  & MEM_Str );.   
1cce0 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65     return vdbeRe
1ccf0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1cd00 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  g;.    }.  }..  
1cd10 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1cd20 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b  beRecordCompare;
1cd30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70  .}../*.** pCur p
1cd40 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65  oints at an inde
1cd50 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20  x entry created 
1cd60 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
1cd70 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
1cd80 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69  ** Read the rowi
1cd90 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c  d (the last fiel
1cda0 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29  d in the record)
1cdb0 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
1cdc0 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75   *rowid..** Retu
1cdd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
1cde0 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
1cdf0 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  , or an error co
1ce00 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  de otherwise..**
1ce10 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62  .** pCur might b
1ce20 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65  e pointing to te
1ce30 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  xt obtained from
1ce40 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
1ce50 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20  ase file..** So 
1ce60 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e  the content cann
1ce70 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20  ot be trusted.  
1ce80 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  Do appropriate c
1ce90 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e  hecks on the con
1cea0 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tent..*/.int sql
1ceb0 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
1cec0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74  (sqlite3 *db, Bt
1ced0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
1cee0 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
1cef0 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
1cf00 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73   int rc;.  u32 s
1cf10 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
1cf20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
1cf30 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
1cf40 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
1cf50 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
1cf60 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c  rowid */.  u32 l
1cf70 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20  enRowid;     /* 
1cf80 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69  Size of the rowi
1cf90 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b  d */.  Mem m, v;
1cfa0 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
1cfb0 45 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  ETER(db);..  /* 
1cfc0 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  Get the size of 
1cfd0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e  the index entry.
1cfe0 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65    Only indices e
1cff0 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20  ntries of less. 
1d000 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72   ** than 2GiB ar
1d010 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74  e support - anyt
1d020 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20  hing large must 
1d030 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  be database corr
1d040 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79  uption..  ** Any
1d050 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
1d060 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74  etected in sqlit
1d070 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
1d080 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73  Ptr(), though, s
1d090 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65  o.  ** this code
1d0a0 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75   can safely assu
1d0b0 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79  me that nCellKey
1d0c0 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20   is 32-bits  .  
1d0d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
1d0e0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
1d0f0 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
1d100 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29    VVA_ONLY(rc =)
1d110 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1d120 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
1d130 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
1d140 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d150 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  ;     /* pCur is
1d160 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
1d170 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
1d180 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  fail */.  assert
1d190 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51  ( (nCellKey & SQ
1d1a0 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28  LITE_MAX_U32)==(
1d1b0 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a  u64)nCellKey );.
1d1c0 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
1d1d0 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
1d1e0 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nt of the index 
1d1f0 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65  entry */.  memse
1d200 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&m, 0, sizeof(
1d210 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  m));.  rc = sqli
1d220 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
1d230 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33  ree(pCur, 0, (u3
1d240 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  2)nCellKey, 1, &
1d250 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
1d260 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d270 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64   }..  /* The ind
1d280 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65  ex entry must be
1d290 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65  gin with a heade
1d2a0 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69  r size */.  (voi
1d2b0 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
1d2c0 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
1d2d0 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
1d2e0 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  r==3 );.  testca
1d2f0 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29  se( szHdr==m.n )
1d300 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
1d310 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74  (szHdr<3 || (int
1d320 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20  )szHdr>m.n) ){. 
1d330 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
1d340 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
1d350 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74  }..  /* The last
1d360 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e   field of the in
1d370 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  dex should be an
1d380 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52   integer - the R
1d390 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66  OWID..  ** Verif
1d3a0 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  y that the last 
1d3b0 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20  entry really is 
1d3c0 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  an integer. */. 
1d3d0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
1d3e0 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
1d3f0 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
1d400 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1d410 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20  ypeRowid==1 );. 
1d420 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1d430 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73  owid==2 );.  tes
1d440 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1d450 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
1d460 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20  e( typeRowid==4 
1d470 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1d480 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20  ypeRowid==5 );. 
1d490 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1d4a0 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73  owid==6 );.  tes
1d4b0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1d4c0 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==8 );.  testcas
1d4d0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20  e( typeRowid==9 
1d4e0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
1d4f0 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c  y(typeRowid<1 ||
1d500 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20   typeRowid>9 || 
1d510 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b  typeRowid==7) ){
1d520 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
1d530 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
1d540 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
1d550 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1d560 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f  alTypeLen(typeRo
1d570 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
1d580 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64  ( (u32)m.n==szHd
1d590 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
1d5a0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33  if( unlikely((u3
1d5b0 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  2)m.n<szHdr+lenR
1d5c0 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
1d5d0 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
1d5e0 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
1d5f0 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
1d600 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
1d610 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
1d620 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
1d630 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
1d640 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
1d650 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
1d660 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
1d670 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
1d680 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1d690 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
1d6a0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
1d6b0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
1d6c0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1d6d0 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
1d6e0 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
1d6f0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
1d700 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
1d710 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1d720 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
1d730 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
1d740 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
1d750 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b   m.zMalloc!=0 );
1d760 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
1d770 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
1d780 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1d790 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f  RRUPT_BKPT;.}../
1d7a0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
1d7b0 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65   key of the inde
1d7c0 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  x entry that cur
1d7d0 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69  sor pC is pointi
1d7e0 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a  ng to against.**
1d7f0 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20   the key string 
1d800 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57  in pUnpacked.  W
1d810 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20  rite into *pRes 
1d820 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74  a number.** that
1d830 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65   is negative, ze
1d840 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1d850 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68  if pC is less th
1d860 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a  an, equal to,.**
1d870 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1d880 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74   pUnpacked.  Ret
1d890 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1d8a0 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
1d8b0 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74  pUnpacked is eit
1d8c0 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68  her created with
1d8d0 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69  out a rowid or i
1d8e0 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74  s truncated so t
1d8f0 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20  hat it.** omits 
1d900 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  the rowid at the
1d910 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64   end.  The rowid
1d920 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1d930 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a  he index entry.*
1d940 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20  * is ignored as 
1d950 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68  well.  Hence, th
1d960 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
1d970 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65  compares the pre
1d980 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65  fixes .** of the
1d990 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74   keys prior to t
1d9a0 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20  he final rowid, 
1d9b0 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b  not the entire k
1d9c0 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
1d9d0 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70  e3VdbeIdxKeyComp
1d9e0 61 72 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f  are(.  VdbeCurso
1d9f0 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
1da00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1da10 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
1da20 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 63 6f   against */.  co
1da30 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  nst UnpackedReco
1da40 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 2f  rd *pUnpacked, /
1da50 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69  * Unpacked versi
1da60 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69  on of key */.  i
1da70 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da90 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
1daa0 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
1dab0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
1dac0 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
1dad0 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
1dae0 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70  or *pCur = pC->p
1daf0 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b  Cursor;.  Mem m;
1db00 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1db10 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
1db20 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
1db30 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
1db40 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
1db50 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
1db60 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
1db70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
1db80 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
1db90 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
1dba0 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
1dbb0 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c  il */.  /* nCell
1dbc0 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  Key will always 
1dbd0 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
1dbe0 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61   0xffffffff beca
1dbf0 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20  use of the way. 
1dc00 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61   ** that btreePa
1dc10 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
1dc20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
1dc30 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d  t32() are implem
1dc40 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e  ented */.  if( n
1dc50 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43  CellKey<=0 || nC
1dc60 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ellKey>0x7ffffff
1dc70 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  f ){.    *res = 
1dc80 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
1dc90 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1dca0 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  T;.  }.  memset(
1dcb0 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29  &m, 0, sizeof(m)
1dcc0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1dcd0 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
1dce0 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30  e(pC->pCursor, 0
1dcf0 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
1dd00 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
1dd10 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1dd20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d  rc;.  }.  *res =
1dd30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1dd40 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
1dd50 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 2c 20 30  .z, pUnpacked, 0
1dd60 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1dd70 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
1dd80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dd90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
1dda0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
1ddb0 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72  he value to be r
1ddc0 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65  eturned by subse
1ddd0 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a  quent calls to.*
1dde0 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  * sqlite3_change
1ddf0 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62  s() on the datab
1de00 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e  ase handle 'db'.
1de10 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
1de20 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
1de30 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
1de40 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73   nChange){.  ass
1de50 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1de60 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
1de70 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61  x) );.  db->nCha
1de80 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  nge = nChange;. 
1de90 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67   db->nTotalChang
1dea0 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a  e += nChange;.}.
1deb0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61  ./*.** Set a fla
1dec0 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f  g in the vdbe to
1ded0 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
1dee0 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20  ge counter when 
1def0 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a  it is finalised.
1df00 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a  ** or reset..*/.
1df10 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1df20 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62  CountChanges(Vdb
1df30 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e  e *v){.  v->chan
1df40 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a  geCntOn = 1;.}..
1df50 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79  /*.** Mark every
1df60 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
1df70 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
1df80 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
1df90 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20  onnection.** as 
1dfa0 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  expired..**.** A
1dfb0 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d  n expired statem
1dfc0 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72  ent means that r
1dfd0 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
1dfe0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
1dff0 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20  .** recommend.  
1e000 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72  Statements expir
1e010 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61  e when things ha
1e020 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74  ppen that make t
1e030 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73  heir.** programs
1e040 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f   obsolete.  Remo
1e050 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65  ving user-define
1e060 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63  d functions or c
1e070 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
1e080 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69  ences, or changi
1e090 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  ng an authorizat
1e0a0 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  ion function are
1e0b0 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a   the types of.**
1e0c0 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b   things that mak
1e0d0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
1e0e0 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a  ments obsolete..
1e0f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1e100 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
1e110 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20  tements(sqlite3 
1e120 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
1e130 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70  .  for(p = db->p
1e140 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Vdbe; p; p=p->pN
1e150 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70  ext){.    p->exp
1e160 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  ired = 1;.  }.}.
1e170 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1e180 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
1e190 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
1e1a0 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  dbe..*/.sqlite3 
1e1b0 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56  *sqlite3VdbeDb(V
1e1c0 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72  dbe *v){.  retur
1e1d0 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  n v->db;.}../*.*
1e1e0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1e1f0 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
1e200 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
1e210 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1e220 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70  value bound.** p
1e230 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66  arameter iVar of
1e240 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69   VM v. Except, i
1e250 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
1e260 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75  n SQL NULL, retu
1e270 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64  rn .** 0 instead
1e280 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e  . Unless it is N
1e290 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e  ULL, apply affin
1e2a0 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20  ity aff (one of 
1e2b0 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a  the SQLITE_AFF_*
1e2c0 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74  .** constants) t
1e2d0 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f  o the value befo
1e2e0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e  re returning it.
1e2f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
1e300 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62  ned value must b
1e310 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
1e320 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
1e330 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a  te3ValueFree()..
1e340 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  */.sqlite3_value
1e350 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
1e360 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20  BoundValue(Vdbe 
1e370 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38  *v, int iVar, u8
1e380 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28   aff){.  assert(
1e390 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
1e3a0 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   v ){.    Mem *p
1e3b0 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69  Mem = &v->aVar[i
1e3c0 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20  Var-1];.    if( 
1e3d0 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  0==(pMem->flags 
1e3e0 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20  & MEM_Null) ){. 
1e3f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
1e400 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  ue *pRet = sqlit
1e410 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62  e3ValueNew(v->db
1e420 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
1e430 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1e440 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28  ite3VdbeMemCopy(
1e450 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65  (Mem *)pRet, pMe
1e460 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
1e470 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66  te3ValueApplyAff
1e480 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c  inity(pRet, aff,
1e490 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
1e4a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1e4b0 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a  urn pRet;.    }.
1e4c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1e4d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
1e4e0 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20  re SQL variable 
1e4f0 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e  iVar so that bin
1e500 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65  ding a new value
1e510 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a   to it signals.*
1e520 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f  * to sqlite3_reo
1e530 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72  ptimize() that r
1e540 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20  e-preparing the 
1e550 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65  statement may re
1e560 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74  sult.** in a bet
1e570 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  ter query plan..
1e580 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1e590 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64  dbeSetVarmask(Vd
1e5a0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29  be *v, int iVar)
1e5b0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
1e5c0 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72  >0 );.  if( iVar
1e5d0 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78  >32 ){.    v->ex
1e5e0 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66  pmask = 0xffffff
1e5f0 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ff;.  }else{.   
1e600 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28   v->expmask |= (
1e610 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d  (u32)1 << (iVar-
1e620 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  1));.  }.}..#ifn
1e630 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e640 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
1e650 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f  ** Transfer erro
1e660 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66  r message text f
1e670 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  rom an sqlite3_v
1e680 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78  tab.zErrMsg (tex
1e690 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d  t stored.** in m
1e6a0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
1e6b0 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
1e6c0 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e  oc) into a Vdbe.
1e6d0 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
1e6e0 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
1e6f0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
1e700 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29  sqlite3DbMalloc)
1e710 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e720 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73  3VtabImportErrms
1e730 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74  g(Vdbe *p, sqlit
1e740 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b  e3_vtab *pVtab){
1e750 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1e760 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65   p->db;.  sqlite
1e770 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
1e780 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
1e790 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44  rrMsg = sqlite3D
1e7a0 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74 61  bStrDup(db, pVta
1e7b0 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  b->zErrMsg);.  s
1e7c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
1e7d0 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
1e7e0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
1e7f0 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
1e800 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1e810 41 4c 54 41 42 4c 45 20 2a 2f 0a                 ALTABLE */.