/ Hex Artifact Content
Login

Artifact dba006f67c9fd1b1d07ee7fb0fb38aa1905161d1:


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 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c  t nOp elements l
08d0: 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69  arger .** than i
08e0: 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e  ts current size.
08f0: 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65   nOp is guarante
0900: 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
0910: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
0920: 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  o 1024/sizeof(Op
0930: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f  )..**.** If an o
0940: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
0950: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
0960: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72  resizing the arr
0970: 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ay, return.** SQ
0980: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74  LITE_NOMEM. In t
0990: 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f  his case Vdbe.aO
09a0: 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41  p and Parse.nOpA
09b0: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
09c0: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
09d0: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
09e0: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
09f0: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a00: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0a10: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0a20: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0a30: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0a40: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0a50: 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69  Array(Vdbe *v, i
0a60: 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f  nt nOp){.  VdbeO
0a70: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  p *pNew;.  Parse
0a80: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
0a90: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
0aa0: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0ab0: 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69  TRESS compile-ti
0ac0: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73  me option is des
0ad0: 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20  igned to force. 
0ae0: 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e   ** more frequen
0af0: 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68  t reallocs and h
0b00: 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72  ence provide mor
0b10: 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20  e opportunities 
0b20: 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61  for .  ** simula
0b30: 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20  ted OOM faults. 
0b40: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0b50: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67  LLOC_STRESS is g
0b60: 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20  enerally used.  
0b70: 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ** during testin
0b80: 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51  g only.  With SQ
0b90: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0ba0: 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68  C_STRESS grow th
0bb0: 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20  e op array.  ** 
0bc0: 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20  by the minimum* 
0bd0: 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20  amount required 
0be0: 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72  until the size r
0bf0: 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72  eaches 512.  Nor
0c00: 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  mal.  ** operati
0c10: 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49  on (without SQLI
0c20: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
0c30: 53 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f  STRESS) is to do
0c40: 75 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74  uble the current
0c50: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  .  ** size of th
0c60: 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64  e op array or ad
0c70: 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20  d 1KB of space, 
0c80: 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
0c90: 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20  ller. */.#ifdef 
0ca0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0cb0: 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74  LOC_STRESS.  int
0cc0: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0cd0: 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e  lloc>=512 ? p->n
0ce0: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e  OpAlloc*2 : p->n
0cf0: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65  OpAlloc+nOp);.#e
0d00: 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d  lse.  int nNew =
0d10: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20   (p->nOpAlloc ? 
0d20: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0d30: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f  (int)(1024/sizeo
0d40: 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45  f(Op)));.  UNUSE
0d50: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29  D_PARAMETER(nOp)
0d60: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
0d70: 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73  rt( nOp<=(1024/s
0d80: 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20  izeof(Op)) );.  
0d90: 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70  assert( nNew>=(p
0da0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20  ->nOpAlloc+nOp) 
0db0: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
0dc0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e  te3DbRealloc(p->
0dd0: 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77  db, v->aOp, nNew
0de0: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20  *sizeof(Op));.  
0df0: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
0e00: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71  p->nOpAlloc = sq
0e10: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
0e20: 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73  e(p->db, pNew)/s
0e30: 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76  izeof(Op);.    v
0e40: 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20  ->aOp = pNew;.  
0e50: 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77  }.  return (pNew
0e60: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
0e70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a  QLITE_NOMEM);.}.
0e80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0e90: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72 6f 75  EBUG./* This rou
0ea0: 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 20 63  tine is just a c
0eb0: 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
0ec0: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
0ed0: 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a  int that will.**
0ee0: 20 66 69 72 65 20 61 66 74 65 72 20 65 61 63 68   fire after each
0ef0: 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73 65 72   opcode is inser
0f00: 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61 79 65  ted and displaye
0f10: 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52 41 47  d using.** "PRAG
0f20: 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74 72 61  MA vdbe_addoptra
0f30: 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61 74 69  ce=on"..*/.stati
0f40: 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64 64 6f  c void test_addo
0f50: 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69  p_breakpoint(voi
0f60: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  d){.  static int
0f70: 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b 0a 7d   n = 0;.  n++;.}
0f80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
0f90: 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63  dd a new instruc
0fa0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74  tion to the list
0fb0: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   of instructions
0fc0: 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a   current in the.
0fd0: 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e  ** VDBE.  Return
0fe0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
0ff0: 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74  the new instruct
1000: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ion..**.** Param
1010: 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eters:.**.**    
1020: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
1030: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56  Pointer to the V
1040: 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20  DBE.**.**    op 
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65               The
1060: 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73   opcode for this
1070: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a   instruction.**.
1080: 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70 33  **    p1, p2, p3
1090: 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a        Operands.*
10a0: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c  *.** Use the sql
10b0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
10c0: 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  abel() function 
10d0: 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73  to fix an addres
10e0: 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c  s and.** the sql
10f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1100: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63  () function to c
1110: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
1120: 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65  of the P4.** ope
1130: 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rand..*/.int sql
1140: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 56  ite3VdbeAddOp3(V
1150: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
1160: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20  int p1, int p2, 
1170: 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69  int p3){.  int i
1180: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
1190: 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  ..  i = p->nOp;.
11a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
11b0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
11c0: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
11d0: 20 6f 70 3e 30 20 26 26 20 6f 70 3c 30 78 66 66   op>0 && op<0xff
11e0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 61   );.  if( p->pPa
11f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69  rse->nOpAlloc<=i
1200: 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72 6f 77   ){.    if( grow
1210: 4f 70 41 72 72 61 79 28 70 2c 20 31 29 20 29 7b  OpArray(p, 1) ){
1220: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1230: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
1240: 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26  nOp++;.  pOp = &
1250: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70  p->aOp[i];.  pOp
1260: 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f  ->opcode = (u8)o
1270: 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30  p;.  pOp->p5 = 0
1280: 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31  ;.  pOp->p1 = p1
1290: 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32  ;.  pOp->p2 = p2
12a0: 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33  ;.  pOp->p3 = p3
12b0: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20  ;.  pOp->p4.p = 
12c0: 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  0;.  pOp->p4type
12d0: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23   = P4_NOTUSED;.#
12e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
12f0: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
1300: 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d  ENTS.  pOp->zCom
1310: 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ment = 0;.#endif
1320: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1330: 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e 64 62  EBUG.  if( p->db
1340: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1350: 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
1360: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 2c 20 6b  ){.    int jj, k
1370: 6b 3b 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50  k;.    Parse *pP
1380: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
1390: 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d  ;.    for(jj=kk=
13a0: 30 3b 20 6a 6a 3c 53 51 4c 49 54 45 5f 4e 5f 43  0; jj<SQLITE_N_C
13b0: 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b 2b 29 7b 0a  OLCACHE; jj++){.
13c0: 20 20 20 20 20 20 73 74 72 75 63 74 20 79 43 6f        struct yCo
13d0: 6c 43 61 63 68 65 20 2a 78 20 3d 20 70 50 61 72  lCache *x = pPar
13e0: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20 2b 20  se->aColCache + 
13f0: 6a 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 78 2d  jj;.      if( x-
1400: 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e  >iLevel>pParse->
1410: 69 43 61 63 68 65 4c 65 76 65 6c 20 7c 7c 20 78  iCacheLevel || x
1420: 2d 3e 69 52 65 67 3d 3d 30 20 29 20 63 6f 6e 74  ->iReg==0 ) cont
1430: 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 72 69 6e  inue;.      prin
1440: 74 66 28 22 20 72 5b 25 64 5d 3d 7b 25 64 3a 25  tf(" r[%d]={%d:%
1450: 64 7d 22 2c 20 78 2d 3e 69 52 65 67 2c 20 78 2d  d}", x->iReg, x-
1460: 3e 69 54 61 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c  >iTable, x->iCol
1470: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b  umn);.      kk++
1480: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1490: 6b 6b 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22  kk ) printf("\n"
14a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14b0: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
14c0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
14d0: 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65 61   test_addop_brea
14e0: 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a 23 65  kpoint();.  }.#e
14f0: 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45  ndif.#ifdef VDBE
1500: 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e  _PROFILE.  pOp->
1510: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f  cycles = 0;.  pO
1520: 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  p->cnt = 0;.#end
1530: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1540: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20  _VDBE_COVERAGE. 
1550: 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65 20 3d   pOp->iSrcLine =
1560: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   0;.#endif.  ret
1570: 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c  urn i;.}.int sql
1580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 56  ite3VdbeAddOp0(V
1590: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b  dbe *p, int op){
15a0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
15b0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
15c0: 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69  p, 0, 0, 0);.}.i
15d0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
15e0: 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp1(Vdbe *p, in
15f0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20  t op, int p1){. 
1600: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1610: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1620: 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e   p1, 0, 0);.}.in
1630: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1640: 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op2(Vdbe *p, int
1650: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
1660: 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p2){.  return s
1670: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1680: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1690: 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  0);.}.../*.** Ad
16a0: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
16b0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
16c0: 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e   value as a poin
16d0: 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
16e0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
16f0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
1700: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
1710: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
1720: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
1730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1740: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
1750: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
1760: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
1770: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1780: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
1790: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
17a0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17c0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
17d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17e0: 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34  P4,    /* The P4
17f0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1800: 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20  t p4type        
1810: 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20    /* P4 operand 
1820: 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  type */.){.  int
1830: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1840: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1850: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
1860: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1870: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34  eP4(p, addr, zP4
1880: 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74  , p4type);.  ret
1890: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
18a0: 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72  ** Add an OP_Par
18b0: 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e  seSchema opcode.
18c0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
18d0: 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f  s broken out fro
18e0: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
18f0: 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69  AddOp4() since i
1900: 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20  t needs to also 
1910: 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c  needs to mark al
1920: 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68  l btrees.** as h
1930: 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e  aving been used.
1940: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72  .**.** The zWher
1950: 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61  e string must ha
1960: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
1970: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
1980: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20  lloc()..** This 
1990: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b  routine will tak
19a0: 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  e ownership of t
19b0: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  he allocated mem
19c0: 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ory..*/.void sql
19d0: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
19e0: 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a 70  SchemaOp(Vdbe *p
19f0: 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20  , int iDb, char 
1a00: 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *zWhere){.  int 
1a10: 6a 3b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  j;.  int addr = 
1a20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a30: 33 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  3(p, OP_ParseSch
1a40: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 29 3b  ema, iDb, 0, 0);
1a50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
1a60: 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20  angeP4(p, addr, 
1a70: 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d  zWhere, P4_DYNAM
1a80: 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  IC);.  for(j=0; 
1a90: 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b  j<p->db->nDb; j+
1aa0: 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  +) sqlite3VdbeUs
1ab0: 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d  esBtree(p, j);.}
1ac0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f  ../*.** Add an o
1ad0: 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75  pcode that inclu
1ae0: 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65  des the p4 value
1af0: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   as an integer..
1b00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1b10: 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56  beAddOp4Int(.  V
1b20: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
1b30: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
1b40: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
1b50: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
1b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b70: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
1b80: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
1b90: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
1ba0: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1bb0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
1bc0: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
1bd0: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
1be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1bf0: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
1c00: 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20   int p4         
1c10: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f       /* The P4 o
1c20: 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74  perand as an int
1c30: 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  eger */.){.  int
1c40: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1c50: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1c60: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
1c70: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1c80: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53 51 4c  eP4(p, addr, SQL
1c90: 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70  ITE_INT_TO_PTR(p
1ca0: 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  4), P4_INT32);. 
1cb0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1cc0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1cd0: 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  new symbolic lab
1ce0: 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75  el for an instru
1cf0: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79  ction that has y
1d00: 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65  et to be.** code
1d10: 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63  d.  The symbolic
1d20: 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79   label is really
1d30: 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65   just a negative
1d40: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a   number.  The.**
1d50: 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73   label can be us
1d60: 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c  ed as the P2 val
1d70: 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ue of an operati
1d80: 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e  on.  Later, when
1d90: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73  .** the label is
1da0: 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73   resolved to a s
1db0: 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c  pecific address,
1dc0: 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73   the VDBE will s
1dd0: 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69  can.** through i
1de0: 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73  ts operation lis
1df0: 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c  t and change all
1e00: 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68   values of P2 wh
1e10: 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65  ich match.** the
1e20: 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20   label into the 
1e30: 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73  resolved address
1e40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45  ..**.** The VDBE
1e50: 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32   knows that a P2
1e60: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
1e70: 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73  l because labels
1e80: 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e   are.** always n
1e90: 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76  egative and P2 v
1ea0: 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73  alues are suppos
1eb0: 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  e to be non-nega
1ec0: 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  tive..** Hence, 
1ed0: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
1ee0: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74  lue is a label t
1ef0: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
1f00: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a  e resolved..**.*
1f10: 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * Zero is return
1f20: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ed if a malloc()
1f30: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73   fails..*/.int s
1f40: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1f50: 62 65 6c 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  bel(Vdbe *v){.  
1f60: 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50  Parse *p = v->pP
1f70: 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 20 3d 20  arse;.  int i = 
1f80: 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61  p->nLabel++;.  a
1f90: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
1fa0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1fb0: 20 29 3b 0a 20 20 69 66 28 20 28 69 20 26 20 28   );.  if( (i & (
1fc0: 69 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  i-1))==0 ){.    
1fd0: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69  p->aLabel = sqli
1fe0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
1ff0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61  ee(p->db, p->aLa
2000: 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  bel, .          
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 2a               (i*
2030: 32 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  2+1)*sizeof(p->a
2040: 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a  Label[0]));.  }.
2050: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
2060: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
2070: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20  [i] = -1;.  }.  
2080: 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a  return -1-i;.}..
2090: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61  /*.** Resolve la
20a0: 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68  bel "x" to be th
20b0: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
20c0: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
20d0: 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72  n to.** be inser
20e0: 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65  ted.  The parame
20f0: 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61 76  ter "x" must hav
2100: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  e been obtained 
2110: 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20  from.** a prior 
2120: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
2130: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a  dbeMakeLabel()..
2140: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2150: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2160: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 78 29 7b  Vdbe *v, int x){
2170: 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d  .  Parse *p = v-
2180: 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 6a  >pParse;.  int j
2190: 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72   = -1-x;.  asser
21a0: 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( v->magic==VDB
21b0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
21c0: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e    assert( j<p->n
21d0: 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 41  Label );.  if( A
21e0: 4c 57 41 59 53 28 6a 3e 3d 30 29 20 26 26 20 70  LWAYS(j>=0) && p
21f0: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
2200: 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76  p->aLabel[j] = v
2210: 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ->nOp;.  }.  p->
2220: 69 46 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f  iFixedOp = v->nO
2230: 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p - 1;.}../*.** 
2240: 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73  Mark the VDBE as
2250: 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e   one that can on
2260: 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69  ly be run one ti
2270: 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
2280: 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e  te3VdbeRunOnlyOn
2290: 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  ce(Vdbe *p){.  p
22a0: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20  ->runOnlyOnce = 
22b0: 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  1;.}..#ifdef SQL
22c0: 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c  ITE_DEBUG /* sql
22d0: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
22e0: 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f  rt() logic */../
22f0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2300: 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63  ng type and func
2310: 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  tion are used to
2320: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2330: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20   all opcodes.** 
2340: 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70  in a Vdbe main p
2350: 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20  rogram and each 
2360: 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  of the sub-progr
2370: 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69  ams (triggers) i
2380: 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65  t may .** invoke
2390: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
23a0: 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75  irectly. It shou
23b0: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f  ld be used as fo
23c0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  llows:.**.**   O
23d0: 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62  p *pOp;.**   Vdb
23e0: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a  eOpIter sIter;.*
23f0: 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73  *.**   memset(&s
2400: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
2410: 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49  sIter));.**   sI
2420: 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20  ter.v = v;      
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66        // v is of
2450: 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20   type Vdbe* .** 
2460: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
2470: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
2480: 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f  r)) ){.**     //
2490: 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69   Do something wi
24a0: 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a  th pOp.**   }.**
24b0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
24c0: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70  (v->db, sIter.ap
24d0: 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70  Sub);.** .*/.typ
24e0: 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65  edef struct Vdbe
24f0: 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65  OpIter VdbeOpIte
2500: 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70  r;.struct VdbeOp
2510: 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76  Iter {.  Vdbe *v
2520: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2530: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69      /* Vdbe to i
2540: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
2550: 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f  he opcodes of */
2560: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
2570: 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a  apSub;        /*
2580: 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   Array of subpro
2590: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
25a0: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
25b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
25c0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70  of entries in ap
25d0: 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64  Sub */.  int iAd
25e0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
25f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
2600: 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  f next instructi
2610: 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  on to return */.
2620: 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20    int iSub;     
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2640: 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  0 = main program
2650: 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d  , 1 = first sub-
2660: 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a  program etc. */.
2670: 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70  };.static Op *op
2680: 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49  IterNext(VdbeOpI
2690: 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20  ter *p){.  Vdbe 
26a0: 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20  *v = p->v;.  Op 
26b0: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20  *pRet = 0;.  Op 
26c0: 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b  *aOp;.  int nOp;
26d0: 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c  ..  if( p->iSub<
26e0: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20  =p->nSub ){..   
26f0: 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20   if( p->iSub==0 
2700: 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76  ){.      aOp = v
2710: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
2720: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d   = v->nOp;.    }
2730: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20  else{.      aOp 
2740: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53  = p->apSub[p->iS
2750: 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20  ub-1]->aOp;.    
2760: 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    nOp = p->apSub
2770: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70  [p->iSub-1]->nOp
2780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2790: 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70  rt( p->iAddr<nOp
27a0: 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20   );..    pRet = 
27b0: 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a  &aOp[p->iAddr];.
27c0: 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a      p->iAddr++;.
27d0: 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72      if( p->iAddr
27e0: 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70  ==nOp ){.      p
27f0: 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20  ->iSub++;.      
2800: 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20  p->iAddr = 0;.  
2810: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70    }.  .    if( p
2820: 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  Ret->p4type==P4_
2830: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
2840: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
2850: 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65  (p->nSub+1)*size
2860: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
2870: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
2880: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2890: 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nSub; j++){.  
28a0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53        if( p->apS
28b0: 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e  ub[j]==pRet->p4.
28c0: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
28d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28e0: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29  if( j==p->nSub )
28f0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53  {.        p->apS
2900: 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ub = sqlite3DbRe
2910: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64  allocOrFree(v->d
2920: 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79  b, p->apSub, nBy
2930: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  te);.        if(
2940: 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20   !p->apSub ){.  
2950: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
2960: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2970: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70  .          p->ap
2980: 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d  Sub[p->nSub++] =
2990: 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72   pRet->p4.pProgr
29a0: 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  am;.        }.  
29b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
29c0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
29d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  }../*.** Check i
29e0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74  f the program st
29f0: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61  ored in the VM a
2a00: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
2a10: 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72  Parse may.** thr
2a20: 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65  ow an ABORT exce
2a30: 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74  ption (causing t
2a40: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  he statement, bu
2a50: 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61  t not entire tra
2a60: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  nsaction.** to b
2a70: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20  e rolled back). 
2a80: 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
2a90: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61  s true if the ma
2aa0: 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e  in program or an
2ab0: 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d  y.** sub-program
2ac0: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f  s contains any o
2ad0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
2ae0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  .**.**   *  OP_H
2af0: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49  alt with P1=SQLI
2b00: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
2b10: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
2b20: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66  *   *  OP_HaltIf
2b30: 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c  Null with P1=SQL
2b40: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
2b50: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
2b60: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
2b70: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
2b80: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
2b90: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20  _VRename.**   * 
2ba0: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69   OP_FkCounter wi
2bb0: 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69  th P2==0 (immedi
2bc0: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
2bd0: 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a  constraint).**.*
2be0: 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61  * Then check tha
2bf0: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  t the value of P
2c00: 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73  arse.mayAbort is
2c10: 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41   true if an.** A
2c20: 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f  BORT may be thro
2c30: 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  wn, or false oth
2c40: 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74  erwise. Return t
2c50: 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a  rue if it does.*
2c60: 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73  * match, or fals
2c70: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69  e otherwise. Thi
2c80: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
2c90: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
2ca0: 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20  d as.** part of 
2cb0: 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  an assert statem
2cc0: 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69  ent in the compi
2cd0: 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a  ler. Similar to:
2ce0: 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28  .**.**   assert(
2cf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
2d00: 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  rtMayAbort(pPars
2d10: 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65  e->pVdbe, pParse
2d20: 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a  ->mayAbort) );.*
2d30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2d40: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
2d50: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79  Vdbe *v, int may
2d60: 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61  Abort){.  int ha
2d70: 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 4f 70  sAbort = 0;.  Op
2d80: 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49   *pOp;.  VdbeOpI
2d90: 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d  ter sIter;.  mem
2da0: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
2db0: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20  izeof(sIter));. 
2dc0: 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20   sIter.v = v;.. 
2dd0: 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f   while( (pOp = o
2de0: 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72  pIterNext(&sIter
2df0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
2e00: 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f   opcode = pOp->o
2e10: 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f  pcode;.    if( o
2e20: 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f  pcode==OP_Destro
2e30: 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  y || opcode==OP_
2e40: 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64  VUpdate || opcod
2e50: 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 23  e==OP_VRename .#
2e60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e70: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
2e80: 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d      || (opcode==
2e90: 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 20  OP_FkCounter && 
2ea0: 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f  pOp->p1==0 && pO
2eb0: 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e 64 69  p->p2==1) .#endi
2ec0: 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f  f.     || ((opco
2ed0: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f  de==OP_Halt || o
2ee0: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66  pcode==OP_HaltIf
2ef0: 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20  Null) .      && 
2f00: 28 28 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d  ((pOp->p1&0xff)=
2f10: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
2f20: 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f  NT && pOp->p2==O
2f30: 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b  E_Abort)).    ){
2f40: 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20  .      hasAbort 
2f50: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
2f60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
2f70: 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
2f80: 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b  b, sIter.apSub);
2f90: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72  ..  /* Return tr
2fa0: 75 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d  ue if hasAbort==
2fb0: 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20  mayAbort. Or if 
2fc0: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
2fd0: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20   occurred..  ** 
2fe0: 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  If malloc failed
2ff0: 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65  , then the while
3000: 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61  () loop above ma
3010: 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61  y not have itera
3020: 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ted.  ** through
3030: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64   all opcodes and
3040: 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65   hasAbort may be
3050: 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
3060: 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72  . Return.  ** tr
3070: 75 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65  ue for this case
3080: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
3090: 61 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20  assert() in the 
30a0: 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20  callers frame.  
30b0: 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e  ** from failing.
30c0: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20    */.  return ( 
30d0: 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  v->db->mallocFai
30e0: 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d  led || hasAbort=
30f0: 3d 6d 61 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23  =mayAbort );.}.#
3100: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3110: 44 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69  DEBUG - the sqli
3120: 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
3130: 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  t() function */.
3140: 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f  ./*.** Loop thro
3150: 75 67 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ugh the program 
3160: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76  looking for P2 v
3170: 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 6e  alues that are n
3180: 65 67 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75  egative.** on ju
3190: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e  mp instructions.
31a0: 20 20 45 61 63 68 20 73 75 63 68 20 76 61 6c 75    Each such valu
31b0: 65 20 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52  e is a label.  R
31c0: 65 73 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61  esolve the.** la
31d0: 62 65 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74  bel by setting t
31e0: 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69  he P2 value to i
31f0: 74 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a  ts correct non-z
3200: 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
3210: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3220: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74   called once aft
3230: 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68  er all opcodes h
3240: 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ave been inserte
3250: 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c  d..**.** Variabl
3260: 65 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20  e *pMaxFuncArgs 
3270: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61  is set to the ma
3280: 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61  ximum value of a
3290: 6e 79 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a  ny P2 argument .
32a0: 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63  ** to an OP_Func
32b0: 74 69 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70  tion, OP_AggStep
32c0: 20 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f   or OP_VFilter o
32d0: 70 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75  pcode. This is u
32e0: 73 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74  sed by .** sqlit
32f0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
3300: 29 20 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64  ) to size the Vd
3310: 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79  be.apArg[] array
3320: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f  ..**.** The Op.o
3330: 70 66 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20  pflags field is 
3340: 73 65 74 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64  set on all opcod
3350: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
3360: 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  id resolveP2Valu
3370: 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  es(Vdbe *p, int 
3380: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a  *pMaxFuncArgs){.
3390: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
33a0: 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46  MaxArgs = *pMaxF
33b0: 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70  uncArgs;.  Op *p
33c0: 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  Op;.  Parse *pPa
33d0: 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b  rse = p->pParse;
33e0: 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d  .  int *aLabel =
33f0: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3b   pParse->aLabel;
3400: 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  .  p->readOnly =
3410: 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 64   1;.  p->bIsRead
3420: 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 4f  er = 0;.  for(pO
3430: 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e  p=p->aOp, i=p->n
3440: 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  Op-1; i>=0; i--,
3450: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20   pOp++){.    u8 
3460: 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70  opcode = pOp->op
3470: 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 4e 4f  code;..    /* NO
3480: 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f 20 75  TE: Be sure to u
3490: 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  pdate mkopcodeh.
34a0: 61 77 6b 20 77 68 65 6e 20 61 64 64 69 6e 67 20  awk when adding 
34b0: 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20 20 20  or removing.    
34c0: 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d 20 74 68  ** cases from th
34d0: 69 73 20 73 77 69 74 63 68 21 20 2a 2f 0a 20 20  is switch! */.  
34e0: 20 20 73 77 69 74 63 68 28 20 6f 70 63 6f 64 65    switch( opcode
34f0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
3500: 50 5f 46 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 20  P_Function:.    
3510: 20 20 63 61 73 65 20 4f 50 5f 41 67 67 53 74 65    case OP_AggSte
3520: 70 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  p: {.        if(
3530: 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67   pOp->p5>nMaxArg
3540: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70  s ) nMaxArgs = p
3550: 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 20 20 20 20  Op->p5;.        
3560: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
3570: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61       case OP_Tra
3580: 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20  nsaction: {.    
3590: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21      if( pOp->p2!
35a0: 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  =0 ) p->readOnly
35b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a   = 0;.        /*
35c0: 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   fall thru */.  
35d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
35e0: 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a   OP_AutoCommit:.
35f0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 61        case OP_Sa
3600: 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20  vepoint: {.     
3610: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
3620: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
3630: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  ak;.      }.#ifn
3640: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3650: 57 41 4c 0a 20 20 20 20 20 20 63 61 73 65 20 4f  WAL.      case O
3660: 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65  P_Checkpoint:.#e
3670: 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20  ndif.      case 
3680: 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20  OP_Vacuum:.     
3690: 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c   case OP_Journal
36a0: 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  Mode: {.        
36b0: 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  p->readOnly = 0;
36c0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52  .        p->bIsR
36d0: 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  eader = 1;.     
36e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
36f0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
3700: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
3710: 4c 45 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  LE.      case OP
3720: 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20  _VUpdate: {.    
3730: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
3740: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
3750: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  rgs = pOp->p2;. 
3760: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3770: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3780: 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20   OP_VFilter: {. 
3790: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
37a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
37b0: 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b  >nOp - i >= 3 );
37c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
37d0: 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
37e0: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
37f0: 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d         n = pOp[-
3800: 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 69  1].p1;.        i
3810: 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20  f( n>nMaxArgs ) 
3820: 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20  nMaxArgs = n;.  
3830: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3840: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
3850: 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a    case OP_Next:.
3860: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65        case OP_Ne
3870: 78 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20  xtIfOpen:.      
3880: 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65  case OP_SorterNe
3890: 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f  xt: {.        pO
38a0: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d  p->p4.xAdvance =
38b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
38c0: 74 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  t;.        pOp->
38d0: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41  p4type = P4_ADVA
38e0: 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65  NCE;.        bre
38f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3900: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 0a    case OP_Prev:.
3910: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72        case OP_Pr
3920: 65 76 49 66 4f 70 65 6e 3a 20 7b 0a 20 20 20 20  evIfOpen: {.    
3930: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76      pOp->p4.xAdv
3940: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74  ance = sqlite3Bt
3950: 72 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20  reePrevious;.   
3960: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
3970: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
3980: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3990: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
39a0: 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20   pOp->opflags = 
39b0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
39c0: 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20  perty[opcode];. 
39d0: 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66     if( (pOp->opf
39e0: 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d  lags & OPFLG_JUM
39f0: 50 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32  P)!=0 && pOp->p2
3a00: 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  <0 ){.      asse
3a10: 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70  rt( -1-pOp->p2<p
3a20: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b  Parse->nLabel );
3a30: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
3a40: 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e   aLabel[-1-pOp->
3a50: 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p2];.    }.  }. 
3a60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
3a70: 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c  ->db, pParse->aL
3a80: 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d  abel);.  pParse-
3a90: 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70  >aLabel = 0;.  p
3aa0: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20  Parse->nLabel = 
3ab0: 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72  0;.  *pMaxFuncAr
3ac0: 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20  gs = nMaxArgs;. 
3ad0: 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52   assert( p->bIsR
3ae0: 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61  eader!=0 || DbMa
3af0: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72  skAllZero(p->btr
3b00: 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a  eeMask) );.}../*
3b10: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
3b20: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
3b30: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
3b40: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
3b50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3b60: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
3b70: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
3b80: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
3b90: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
3ba0: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
3bb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
3bc0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
3bd0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
3be0: 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20  rray of opcodes 
3bf0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
3c00: 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73  ** the Vdbe pass
3c10: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
3c20: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20  argument. It is 
3c30: 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
3c40: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f  onsibility.** to
3c50: 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65   arrange for the
3c60: 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20   returned array 
3c70: 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  to be eventually
3c80: 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65   freed using the
3c90: 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41   .** vdbeFreeOpA
3ca0: 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rray() function.
3cb0: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
3cc0: 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69  turning, *pnOp i
3cd0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
3ce0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3cf0: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  n the returned.*
3d00: 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a  * array. Also, *
3d10: 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20  pnMaxArg is set 
3d20: 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  to the larger of
3d30: 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
3d40: 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e  ue and .** the n
3d50: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3d60: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41   in the Vdbe.apA
3d70: 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69  rg[] array requi
3d80: 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  red to execute t
3d90: 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  he .** returned 
3da0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65  program..*/.Vdbe
3db0: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54  Op *sqlite3VdbeT
3dc0: 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  akeOpArray(Vdbe 
3dd0: 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69  *p, int *pnOp, i
3de0: 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20  nt *pnMaxArg){. 
3df0: 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70   VdbeOp *aOp = p
3e00: 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->aOp;.  assert(
3e10: 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e   aOp && !p->db->
3e20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
3e30: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
3e40: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
3e50: 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20  Btree() was not 
3e60: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56  called on this V
3e70: 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44  M */.  assert( D
3e80: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e  bMaskAllZero(p->
3e90: 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20  btreeMask) );.. 
3ea0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
3eb0: 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20  (p, pnMaxArg);. 
3ec0: 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b   *pnOp = p->nOp;
3ed0: 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20  .  p->aOp = 0;. 
3ee0: 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a   return aOp;.}..
3ef0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c  /*.** Add a whol
3f00: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74  e list of operat
3f10: 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72  ions to the oper
3f20: 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65  ation stack.  Re
3f30: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72  turn the.** addr
3f40: 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74  ess of the first
3f50: 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64   operation added
3f60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
3f70: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64  VdbeAddOpList(Vd
3f80: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20  be *p, int nOp, 
3f90: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
3fa0: 20 2a 61 4f 70 2c 20 69 6e 74 20 69 4c 69 6e 65   *aOp, int iLine
3fb0: 6e 6f 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  no){.  int addr;
3fc0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3fd0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3fe0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
3ff0: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
4000: 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63  pParse->nOpAlloc
4010: 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28   && growOpArray(
4020: 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72  p, nOp) ){.    r
4030: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
4040: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  ddr = p->nOp;.  
4050: 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30  if( ALWAYS(nOp>0
4060: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
4070: 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63      VdbeOpList c
4080: 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b  onst *pIn = aOp;
4090: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
40a0: 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29  nOp; i++, pIn++)
40b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d  {.      int p2 =
40c0: 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pIn->p2;.      
40d0: 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26  VdbeOp *pOut = &
40e0: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a  p->aOp[i+addr];.
40f0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f        pOut->opco
4100: 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65  de = pIn->opcode
4110: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31  ;.      pOut->p1
4120: 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20   = pIn->p1;.    
4130: 20 20 69 66 28 20 70 32 3c 30 20 29 7b 0a 20 20    if( p2<0 ){.  
4140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
4150: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
4160: 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty[pOut->opcode
4170: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 20 29  ] & OPFLG_JUMP )
4180: 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  ;.        pOut->
4190: 70 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52  p2 = addr + ADDR
41a0: 28 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  (p2);.      }els
41b0: 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d  e{.        pOut-
41c0: 3e 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20  >p2 = p2;.      
41d0: 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33  }.      pOut->p3
41e0: 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20   = pIn->p3;.    
41f0: 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d    pOut->p4type =
4200: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20   P4_NOTUSED;.   
4210: 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20     pOut->p4.p = 
4220: 30 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  0;.      pOut->p
4230: 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  5 = 0;.#ifdef SQ
4240: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
4250: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
4260: 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e     pOut->zCommen
4270: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  t = 0;.#endif.#i
4280: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
4290: 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20  _COVERAGE.      
42a0: 70 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  pOut->iSrcLine =
42b0: 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73   iLineno+i;.#els
42c0: 65 0a 20 20 20 20 20 20 28 76 6f 69 64 29 69 4c  e.      (void)iL
42d0: 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69  ineno;.#endif.#i
42e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
42f0: 47 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 64  G.      if( p->d
4300: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
4310: 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
4320: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4330: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
4340: 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f  , i+addr, &p->aO
4350: 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20  p[i+addr]);.    
4360: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
4370: 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e  .    p->nOp += n
4380: 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Op;.  }.  return
4390: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
43a0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
43b0: 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61   of the P1 opera
43c0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
43d0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
43e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
43f0: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
4400: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
4410: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
4420: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
4430: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
4440: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
4450: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
4460: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
4470: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
4480: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
4490: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
44a0: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
44b0: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
44c0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
44d0: 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e    if( ((u32)p->n
44e0: 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  Op)>addr ){.    
44f0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20  p->aOp[addr].p1 
4500: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
4510: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
4520: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f  alue of the P2 o
4530: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
4540: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
4550: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
4560: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72  ne is useful for
4570: 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20   setting a jump 
4580: 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a  destination..*/.
4590: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
45a0: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
45b0: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
45c0: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
45d0: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  p!=0 );.  if( ((
45e0: 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72  u32)p->nOp)>addr
45f0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
4600: 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20  ddr].p2 = val;. 
4610: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
4620: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
4630: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66  the P3 operand f
4640: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
4650: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
4660: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
4670: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
4680: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
4690: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
46a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33  =0 );.  if( ((u3
46b0: 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29  2)p->nOp)>addr )
46c0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
46d0: 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p3 = val;.  }
46e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
46f0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
4700: 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P5 operand for
4710: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
4720: 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72  ly.** added oper
4730: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
4740: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4750: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76  P5(Vdbe *p, u8 v
4760: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
4770: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
4780: 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  aOp ){.    asser
4790: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
47a0: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
47b0: 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20  -1].p5 = val;.  
47c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
47d0: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
47e0: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
47f0: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
4800: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
4810: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
4820: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
4830: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
4840: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4850: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
4860: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
4870: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
4880: 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e  eP2(p, addr, p->
4890: 6e 4f 70 29 3b 0a 20 20 70 2d 3e 70 50 61 72 73  nOp);.  p->pPars
48a0: 65 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d  e->iFixedOp = p-
48b0: 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  >nOp - 1;.}.../*
48c0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
48d0: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
48e0: 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c  re is ephemeral,
48f0: 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20   then free it.  
4900: 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65  If.** the FuncDe
4910: 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61  f is not epherma
4920: 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69  l, then do nothi
4930: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
4940: 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c  id freeEphemeral
4950: 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  Function(sqlite3
4960: 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70   *db, FuncDef *p
4970: 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  Def){.  if( ALWA
4980: 59 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65  YS(pDef) && (pDe
4990: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
49a0: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d  QLITE_FUNC_EPHEM
49b0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
49c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
49d0: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ef);.  }.}..stat
49e0: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
49f0: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
4a00: 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a  *, Op *, int);..
4a10: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50  /*.** Delete a P
4a20: 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73  4 value if neces
4a30: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sary..*/.static 
4a40: 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69  void freeP4(sqli
4a50: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74  te3 *db, int p4t
4a60: 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a  ype, void *p4){.
4a70: 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20    if( p4 ){.    
4a80: 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20  assert( db );.  
4a90: 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65    switch( p4type
4aa0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50   ){.      case P
4ab0: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61  4_REAL:.      ca
4ac0: 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20  se P4_INT64:.   
4ad0: 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d     case P4_DYNAM
4ae0: 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  IC:.      case P
4af0: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
4b00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4b10: 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20  ree(db, p4);.   
4b20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4b30: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4b40: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
4b50: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
4b60: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
4b70: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
4b80: 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29  ef((KeyInfo*)p4)
4b90: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4ba0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4bb0: 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20  ase P4_MPRINTF: 
4bc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4bd0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4be0: 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  0 ) sqlite3_free
4bf0: 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (p4);.        br
4c00: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4c10: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
4c20: 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72  EF: {.        fr
4c30: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
4c40: 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66  ion(db, (FuncDef
4c50: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
4c60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4c70: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
4c80: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
4c90: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4ca0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
4cb0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
4cc0: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
4cd0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  )p4);.        }e
4ce0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d  lse{.          M
4cf0: 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34  em *p = (Mem*)p4
4d00: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
4d10: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
4d20: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
4d30: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4d40: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  ee(db, p);.     
4d50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
4d60: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4d70: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a    case P4_VTAB :
4d80: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
4d90: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4da0: 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  =0 ) sqlite3Vtab
4db0: 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a  Unlock((VTable *
4dc0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
4dd0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4de0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
4df0: 46 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61  Free the space a
4e00: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70  llocated for aOp
4e10: 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75   and any p4 valu
4e20: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
4e30: 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20   the.** opcodes 
4e40: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
4e50: 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20  . If aOp is not 
4e60: 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d  NULL it is assum
4e70: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a  ed to contain .*
4e80: 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a  * nOp entries. .
4e90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
4ea0: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
4eb0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a  qlite3 *db, Op *
4ec0: 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20  aOp, int nOp){. 
4ed0: 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20   if( aOp ){.    
4ee0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72  Op *pOp;.    for
4ef0: 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61  (pOp=aOp; pOp<&a
4f00: 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b  Op[nOp]; pOp++){
4f10: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62  .      freeP4(db
4f20: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
4f30: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65  Op->p4.p);.#ifde
4f40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4f50: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
4f60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
4f70: 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43  Free(db, pOp->zC
4f80: 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20  omment);.#endif 
4f90: 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20      .    }.  }. 
4fa0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4fb0: 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  b, aOp);.}../*.*
4fc0: 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72  * Link the SubPr
4fd0: 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73  ogram object pas
4fe0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
4ff0: 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20  d argument into 
5000: 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69  the linked.** li
5010: 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50  st at Vdbe.pSubP
5020: 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73  rogram. This lis
5030: 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c  t is used to del
5040: 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67  ete all sub-prog
5050: 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77  ram.** objects w
5060: 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f  hen the VM is no
5070: 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
5080: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5090: 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67  3VdbeLinkSubProg
50a0: 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c  ram(Vdbe *pVdbe,
50b0: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b   SubProgram *p){
50c0: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56  .  p->pNext = pV
50d0: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20  dbe->pProgram;. 
50e0: 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d   pVdbe->pProgram
50f0: 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = p;.}../*.** C
5100: 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65  hange the opcode
5110: 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50   at addr into OP
5120: 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71  _Noop.*/.void sq
5130: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
5140: 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69  oNoop(Vdbe *p, i
5150: 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20  nt addr){.  if( 
5160: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20  addr<p->nOp ){. 
5170: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d     VdbeOp *pOp =
5180: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
5190: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
51a0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72 65  = p->db;.    fre
51b0: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
51c0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
51d0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c  .    memset(pOp,
51e0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30   0, sizeof(pOp[0
51f0: 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70  ]));.    pOp->op
5200: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
5210: 20 20 20 20 69 66 28 20 61 64 64 72 3d 3d 70 2d      if( addr==p-
5220: 3e 6e 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f 70 2d  >nOp-1 ) p->nOp-
5230: 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  -;.  }.}../*.** 
5240: 52 65 6d 6f 76 65 20 74 68 65 20 6c 61 73 74 20  Remove the last 
5250: 6f 70 63 6f 64 65 20 69 6e 73 65 72 74 65 64 0a  opcode inserted.
5260: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
5270: 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63  beDeletePriorOpc
5280: 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20  ode(Vdbe *p, u8 
5290: 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d 3e 6e  op){.  if( (p->n
52a0: 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72 73 65  Op-1)>(p->pParse
52b0: 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26 20 70  ->iFixedOp) && p
52c0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
52d0: 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20  opcode==op ){.  
52e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
52f0: 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e  ngeToNoop(p, p->
5300: 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  nOp-1);.    retu
5310: 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 1;.  }else{. 
5320: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
5340: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
5350: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
5360: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
5370: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
5380: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
5390: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
53a0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
53b0: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
53c0: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
53d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
53e0: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
53f0: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
5400: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
5410: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
5420: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
5430: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
5440: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
5450: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
5460: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
5470: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
5480: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
5490: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
54a0: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
54b0: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
54c0: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
54d0: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
54e0: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
54f0: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
5500: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
5510: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
5520: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
5530: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
5540: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
5550: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
5560: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
5570: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
5580: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
5590: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
55a0: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
55b0: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
55c0: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
55d0: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
55e0: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
55f0: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
5600: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
5610: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
5620: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
5630: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
5640: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5650: 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65  dbeChangeP4(Vdbe
5660: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
5670: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
5680: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
5690: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
56a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ;.  assert( p!=0
56b0: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
56c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
56d0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
56e0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
56f0: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->aOp==0 || db->
5700: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
5710: 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56 54      if( n!=P4_VT
5720: 41 42 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  AB ){.      free
5730: 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a  P4(db, n, (void*
5740: 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b  )*(char**)&zP4);
5750: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
5760: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
5770: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61   p->nOp>0 );.  a
5780: 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e  ssert( addr<p->n
5790: 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  Op );.  if( addr
57a0: 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d  <0 ){.    addr =
57b0: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
57c0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
57d0: 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73 65 72 74  [addr];.  assert
57e0: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
57f0: 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20 20 20 20  4_NOTUSED.      
5800: 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d   || pOp->p4type=
5810: 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20 20 20 20  =P4_INT32.      
5820: 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d   || pOp->p4type=
5830: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20  =P4_KEYINFO );. 
5840: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
5850: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
5860: 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70  .p);.  pOp->p4.p
5870: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50   = 0;.  if( n==P
5880: 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f  4_INT32 ){.    /
5890: 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73  * Note: this cas
58a0: 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75  t is safe, becau
58b0: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61  se the origin da
58c0: 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20  ta point was an 
58d0: 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  int.    ** that 
58e0: 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63  was cast to a (c
58f0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f  onst char *). */
5900: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d  .    pOp->p4.i =
5910: 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
5920: 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  NT(zP4);.    pOp
5930: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e  ->p4type = P4_IN
5940: 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  T32;.  }else if(
5950: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70   zP4==0 ){.    p
5960: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
5970: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5980: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65  P4_NOTUSED;.  }e
5990: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45  lse if( n==P4_KE
59a0: 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4f 70  YINFO ){.    pOp
59b0: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
59c0: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
59d0: 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46  type = P4_KEYINF
59e0: 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  O;.  }else if( n
59f0: 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20  ==P4_VTAB ){.   
5a00: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f   pOp->p4.p = (vo
5a10: 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  id*)zP4;.    pOp
5a20: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56 54  ->p4type = P4_VT
5a30: 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  AB;.    sqlite3V
5a40: 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20  tabLock((VTable 
5a50: 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 65  *)zP4);.    asse
5a60: 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29 7a  rt( ((VTable *)z
5a70: 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29  P4)->db==p->db )
5a80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c  ;.  }else if( n<
5a90: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  0 ){.    pOp->p4
5aa0: 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b  .p = (void*)zP4;
5ab0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
5ac0: 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29   = (signed char)
5ad0: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
5ae0: 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73  if( n==0 ) n = s
5af0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
5b00: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
5b10: 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  .z = sqlite3DbSt
5b20: 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34  rNDup(p->db, zP4
5b30: 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  , n);.    pOp->p
5b40: 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d  4type = P4_DYNAM
5b50: 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  IC;.  }.}../*.**
5b60: 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74   Set the P4 on t
5b70: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
5b80: 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f   added opcode to
5b90: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72   the KeyInfo for
5ba0: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69   the.** index gi
5bb0: 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ven..*/.void sql
5bc0: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
5bd0: 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
5be0: 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
5bf0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
5c00: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
5c10: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
5c20: 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
5c30: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
5c40: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
5c50: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
5c60: 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50  eyInfoOfIndex(pP
5c70: 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20 20  arse, pIdx),.   
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c90: 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
5ca0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
5cb0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
5cc0: 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43  COMMENTS./*.** C
5cd0: 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e  hange the commen
5ce0: 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
5cf0: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73  cently coded ins
5d00: 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a  truction.  Or.**
5d10: 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20   insert a No-op 
5d20: 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d  and add the comm
5d30: 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20  ent to that new 
5d40: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
5d50: 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  is.** makes the 
5d60: 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72  code easier to r
5d70: 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67  ead during debug
5d80: 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  ging.  None of t
5d90: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69  his happens.** i
5da0: 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62  n a production b
5db0: 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uild..*/.static 
5dc0: 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e  void vdbeVCommen
5dd0: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
5de0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
5df0: 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61  va_list ap){.  a
5e00: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
5e10: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a  || p->aOp==0 );.
5e20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
5e30: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d  ==0 || p->aOp[p-
5e40: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
5e50: 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  ==0 || p->db->ma
5e60: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
5e70: 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  if( p->nOp ){.  
5e80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
5e90: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
5ea0: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e  bFree(p->db, p->
5eb0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
5ec0: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e  omment);.    p->
5ed0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
5ee0: 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  omment = sqlite3
5ef0: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
5f00: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
5f10: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
5f20: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65  VdbeComment(Vdbe
5f30: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
5f40: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
5f50: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
5f60: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f  if( p ){.    va_
5f70: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
5f80: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
5f90: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
5fa0: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
5fb0: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  (ap);.  }.}.void
5fc0: 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70   sqlite3VdbeNoop
5fd0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
5fe0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
5ff0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
6000: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
6010: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
6020: 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50  VdbeAddOp0(p, OP
6030: 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73  _Noop);.    va_s
6040: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
6050: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d  );.    vdbeVComm
6060: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20  ent(p, zFormat, 
6070: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
6080: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ap);.  }.}.#endi
6090: 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  f  /* NDEBUG */.
60a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56  .#ifdef SQLITE_V
60b0: 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a  DBE_COVERAGE./*.
60c0: 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
60d0: 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65   if the iSrcLine
60e0: 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70   field for the p
60f0: 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20  reviously coded 
6100: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
6110: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6120: 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64  SetLineNumber(Vd
6130: 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65  be *v, int iLine
6140: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
6150: 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72  GetOp(v,-1)->iSr
6160: 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d  cLine = iLine;.}
6170: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6180: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20  E_VDBE_COVERAGE 
6190: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
61a0: 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   the opcode for 
61b0: 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e  a given address.
61c0: 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73    If the address
61d0: 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20   is -1, then.** 
61e0: 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  return the most 
61f0: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
6200: 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  d opcode..**.** 
6210: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
6220: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73  cation error has
6230: 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20   occurred prior 
6240: 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f  to the calling o
6250: 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  f this.** routin
6260: 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  e, then a pointe
6270: 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62  r to a dummy Vdb
6280: 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75  eOp will be retu
6290: 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f  rned.  That opco
62a0: 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c  de.** is readabl
62b0: 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62  e but not writab
62c0: 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73  le, though it is
62d0: 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61   cast to a writa
62e0: 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68  ble value..** Th
62f0: 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75  e return of a du
6300: 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77  mmy opcode allow
6310: 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  s the call to co
6320: 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69  ntinue functioni
6330: 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f 4f  ng.** after a OO
6340: 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20  M fault without 
6350: 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20  having to check 
6360: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65  to see if the re
6370: 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68  turn from .** th
6380: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
6390: 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20  valid pointer.  
63a0: 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20  But because the 
63b0: 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20  dummy.opcode is 
63c0: 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c  0,.** dummy will
63d0: 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 65   never be writte
63e0: 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76  n to.  This is v
63f0: 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 20  erified by code 
6400: 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a  inspection and.*
6410: 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74  * by running wit
6420: 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56  h Valgrind..*/.V
6430: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
6440: 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c  beGetOp(Vdbe *p,
6450: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a   int addr){.  /*
6460: 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74   C89 specifies t
6470: 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  hat the constant
6480: 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65   "dummy" will be
6490: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
64a0: 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20  all.  ** zeros, 
64b0: 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74  which is correct
64c0: 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65  .  MSVC generate
64d0: 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76  s a warning, nev
64e0: 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20  ertheless. */.  
64f0: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75  static VdbeOp du
6500: 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  mmy;  /* Ignore 
6510: 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67  the MSVC warning
6520: 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61   about no initia
6530: 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  lizer */.  asser
6540: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
6550: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
6560: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
6570: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
6580: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  p - 1;.  }.  ass
6590: 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26  ert( (addr>=0 &&
65a0: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c   addr<p->nOp) ||
65b0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
65c0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
65d0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
65e0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
65f0: 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b  (VdbeOp*)&dummy;
6600: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
6610: 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64  turn &p->aOp[add
6620: 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64  r];.  }.}..#if d
6630: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
6640: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
6650: 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74  MENTS)./*.** Ret
6660: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76  urn an integer v
6670: 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20  alue for one of 
6680: 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74  the parameters t
6690: 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f 70  o the opcode pOp
66a0: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
66b0: 79 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a 2a  y character c..*
66c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61  /.static int tra
66d0: 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c 20  nslateP(char c, 
66e0: 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a  const Op *pOp){.
66f0: 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20 72    if( c=='1' ) r
6700: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20  eturn pOp->p1;. 
6710: 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72 65   if( c=='2' ) re
6720: 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  turn pOp->p2;.  
6730: 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65 74  if( c=='3' ) ret
6740: 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69  urn pOp->p3;.  i
6750: 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74 75  f( c=='4' ) retu
6760: 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20  rn pOp->p4.i;.  
6770: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a  return pOp->p5;.
6780: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
6790: 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68   a string for th
67a0: 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c  e "comment" fiel
67b0: 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f  d of a VDBE opco
67c0: 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a  de listing..**.*
67d0: 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a 20  * The Synopsis: 
67e0: 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74  field in comment
67f0: 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20  s in the vdbe.c 
6800: 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74 73  source file gets
6810: 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f   converted.** to
6820: 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e 67   an extra string
6830: 20 74 68 61 74 20 69 73 20 61 70 70 65 6e 64 65   that is appende
6840: 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  d to the sqlite3
6850: 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49  OpcodeName().  I
6860: 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65  n the.** absence
6870: 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e   of other commen
6880: 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 69  ts, this synopsi
6890: 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f  s becomes the co
68a0: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63  mment on the opc
68b0: 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61  ode..** Some tra
68c0: 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a  nslation occurs:
68d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  .**.**       "PX
68e0: 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d  "      ->  "r[X]
68f0: 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50  ".**       "PX@P
6900: 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58  Y"   ->  "r[X..X
6910: 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d  +Y-1]"  or "r[x]
6920: 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 20 31  " if y is 0 or 1
6930: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59  .**       "PX@PY
6940: 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b  +1" ->  "r[X..X+
6950: 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d 22  Y]"    or "r[x]"
6960: 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 20   if y is 0.**   
6970: 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e      "PY..PY"  ->
6980: 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20    "r[X..Y]"     
6990: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 3c   or "r[x]" if y<
69a0: 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  =x.*/.static int
69b0: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28   displayComment(
69c0: 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70  .  const Op *pOp
69d0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63  ,     /* The opc
69e0: 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e  ode to be commen
69f0: 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ted */.  const c
6a00: 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50  har *zP4,   /* P
6a10: 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e  reviously obtain
6a20: 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34 20  ed value for P4 
6a30: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  */.  char *zTemp
6a40: 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ,       /* Write
6a50: 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
6a60: 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 20    int nTemp     
6a70: 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76       /* Space av
6a80: 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70  ailable in zTemp
6a90: 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  [] */.){.  const
6aa0: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a   char *zOpName;.
6ab0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
6ac0: 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e  ynopsis;.  int n
6ad0: 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69  OpName;.  int ii
6ae0: 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20  , jj;.  zOpName 
6af0: 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  = sqlite3OpcodeN
6b00: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
6b10: 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71  ;.  nOpName = sq
6b20: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f  lite3Strlen30(zO
6b30: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f  pName);.  if( zO
6b40: 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d  pName[nOpName+1]
6b50: 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   ){.    int seen
6b60: 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  Com = 0;.    cha
6b70: 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73  r c;.    zSynops
6b80: 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20  is = zOpName += 
6b90: 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20  nOpName + 1;.   
6ba0: 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a   for(ii=jj=0; jj
6bb0: 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d  <nTemp-1 && (c =
6bc0: 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21   zSynopsis[ii])!
6bd0: 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  =0; ii++){.     
6be0: 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20   if( c=='P' ){. 
6bf0: 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f         c = zSyno
6c00: 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20  psis[++ii];.    
6c10: 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29      if( c=='4' )
6c20: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
6c30: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6c40: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
6c50: 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20   "%s", zP4);.   
6c60: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
6c70: 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20  =='X' ){.       
6c80: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6c90: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
6ca0: 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f  emp+jj, "%s", pO
6cb0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  p->zComment);.  
6cc0: 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20          seenCom 
6cd0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
6ce0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
6cf0: 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65  t v1 = translate
6d00: 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  P(c, pOp);.     
6d10: 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20       int v2;.   
6d20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
6d30: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
6d40: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22  , zTemp+jj, "%d"
6d50: 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , v1);.         
6d60: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
6d70: 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50  nopsis+ii+1, "@P
6d80: 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 2)==0 ){.    
6d90: 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b          ii += 3;
6da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
6db0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
6dc0: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20  30(zTemp+jj);.  
6dd0: 20 20 20 20 20 20 20 20 20 20 76 32 20 3d 20 74            v2 = t
6de0: 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70  ranslateP(zSynop
6df0: 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20  sis[ii], pOp);. 
6e00: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
6e10: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
6e20: 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30  +ii+1,"+1",2)==0
6e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6e40: 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20    ii += 2;.     
6e50: 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20           v2++;. 
6e60: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
6e70: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 32 3e           if( v2>
6e80: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
6e90: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6ea0: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
6eb0: 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20  emp+jj, "..%d", 
6ec0: 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20  v1+v2-1);.      
6ed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6ee0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
6ef0: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69  cmp(zSynopsis+ii
6f00: 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d  +1, "..P3", 4)==
6f10: 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20  0 && pOp->p3==0 
6f20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
6f30: 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
6f40: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
6f50: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
6f60: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
6f70: 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  p+jj);.      }el
6f80: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  se{.        zTem
6f90: 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  p[jj++] = c;.   
6fa0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
6fb0: 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a  f( !seenCom && j
6fc0: 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70  j<nTemp-5 && pOp
6fd0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
6fe0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6ff0: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
7000: 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c  Temp+jj, "; %s",
7010: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
7020: 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c  .      jj += sql
7030: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
7040: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20  mp+jj);.    }.  
7050: 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29    if( jj<nTemp )
7060: 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a   zTemp[jj] = 0;.
7070: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
7080: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
7090: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
70a0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
70b0: 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  "%s", pOp->zComm
70c0: 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73  ent);.    jj = s
70d0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
70e0: 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Temp);.  }else{.
70f0: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
7100: 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20  ;.    jj = 0;.  
7110: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d  }.  return jj;.}
7120: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7130: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a 23 69 66  E_DEBUG */...#if
7140: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7150: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c  _OMIT_EXPLAIN) |
7160: 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  | !defined(NDEBU
7170: 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66  G) \.     || def
7180: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
7190: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
71a0: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
71b0: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
71c0: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
71d0: 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74  s the P4 paramet
71e0: 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65  er for an opcode
71f0: 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66  ..** Use zTemp f
7200: 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  or any required 
7210: 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
7220: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
7230: 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50  c char *displayP
7240: 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20  4(Op *pOp, char 
7250: 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d  *zTemp, int nTem
7260: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20  p){.  char *zP4 
7270: 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72  = zTemp;.  asser
7280: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
7290: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
72a0: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  4type ){.    cas
72b0: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
72c0: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
72d0: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
72e0: 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
72f0: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
7300: 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
7310: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
7320: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
7330: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7340: 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28 25 64 22  p, zTemp, "k(%d"
7350: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
7360: 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73  ld);.      i = s
7370: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7380: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Temp);.      for
7390: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
73a0: 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a  ->nField; j++){.
73b0: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
73c0: 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66  *pColl = pKeyInf
73d0: 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  o->aColl[j];.   
73e0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
73f0: 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f  *zColl = pColl ?
7400: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
7410: 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20 20 69  "nil";.        i
7420: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
7430: 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20  rlen30(zColl);. 
7440: 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 36 20         if( n==6 
7450: 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c 6c 2c  && memcmp(zColl,
7460: 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d 30 20 29  "BINARY",6)==0 )
7470: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c  {.          zCol
7480: 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20  l = "B";.       
7490: 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20     n = 1;.      
74a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
74b0: 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20  i+n>nTemp-6 ){. 
74c0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
74d0: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22  &zTemp[i],",..."
74e0: 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ,4);.          b
74f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
7500: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
7510: 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  +] = ',';.      
7520: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
7530: 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b  aSortOrder[j] ){
7540: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70  .          zTemp
7550: 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20  [i++] = '-';.   
7560: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
7570: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
7580: 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a 20 20   zColl, n+1);.  
7590: 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20        i += n;.  
75a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d      }.      zTem
75b0: 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  p[i++] = ')';.  
75c0: 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30      zTemp[i] = 0
75d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
75e0: 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20  i<nTemp );.     
75f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7600: 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45    case P4_COLLSE
7610: 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  Q: {.      CollS
7620: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d  eq *pColl = pOp-
7630: 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  >p4.pColl;.     
7640: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7650: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7660: 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c  "(%.20s)", pColl
7670: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
7680: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7690: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
76a0: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
76b0: 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70  f *pDef = pOp->p
76c0: 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  4.pFunc;.      s
76d0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
76e0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
76f0: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
7700: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
7710: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7720: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
7730: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
7740: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7750: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
7760: 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  %lld", *pOp->p4.
7770: 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65  pI64);.      bre
7780: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7790: 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20  se P4_INT32: {. 
77a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
77b0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
77c0: 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70  mp, "%d", pOp->p
77d0: 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61  4.i);.      brea
77e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
77f0: 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P4_REAL: {.   
7800: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7810: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7820: 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d  , "%.16g", *pOp-
7830: 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20  >p4.pReal);.    
7840: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7850: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
7860: 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
7870: 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d  m = pOp->p4.pMem
7880: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
7890: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
78a0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
78b0: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
78c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
78d0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
78e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
78f0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7900: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
7910: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
7920: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7930: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
7940: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
7950: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7960: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7970: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
7980: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
7990: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
79a0: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
79b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
79c0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
79d0: 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  emp, "NULL");.  
79e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
79f0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
7a00: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
7a10: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34  b );.        zP4
7a20: 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20   = "(blob)";.   
7a30: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7a40: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
7a50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7a60: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
7a70: 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20  e P4_VTAB: {.   
7a80: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20     sqlite3_vtab 
7a90: 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34  *pVtab = pOp->p4
7aa0: 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20  .pVtab->pVtab;. 
7ab0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7ac0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7ad0: 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22  mp, "vtab:%p:%p"
7ae0: 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e  , pVtab, pVtab->
7af0: 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20  pModule);.      
7b00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
7b10: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
7b20: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
7b30: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7b40: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7b50: 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20   "intarray");.  
7b60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7b70: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42  .    case P4_SUB
7b80: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20  PROGRAM: {.     
7b90: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7ba0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7bb0: 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  "program");.    
7bc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7bd0: 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e     case P4_ADVAN
7be0: 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d  CE: {.      zTem
7bf0: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
7c00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7c10: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
7c20: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
7c30: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
7c40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
7c50: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
7c60: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
7c70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7c80: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50    }.  assert( zP
7c90: 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  4!=0 );.  return
7ca0: 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   zP4;.}.#endif..
7cb0: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
7cc0: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
7cd0: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
7ce0: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
7cf0: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
7d00: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
7d10: 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  ents need to kno
7d20: 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65  w in advance the
7d30: 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66   complete set of
7d40: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
7d50: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
7d60: 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b   be use.  A mask
7d70: 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61   of these databa
7d80: 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61  ses.** is mainta
7d90: 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65  ined in p->btree
7da0: 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f  Mask.  The p->lo
7db0: 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20  ckMask value is 
7dc0: 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  the subset of.**
7dd0: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66   p->btreeMask of
7de0: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
7df0: 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c  will require a l
7e00: 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ock..*/.void sql
7e10: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
7e20: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
7e30: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ){.  assert( i>=
7e40: 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44  0 && i<p->db->nD
7e50: 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65  b && i<(int)size
7e60: 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b  of(yDbMask)*8 );
7e70: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e  .  assert( i<(in
7e80: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  t)sizeof(p->btre
7e90: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62  eMask)*8 );.  Db
7ea0: 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65  MaskSet(p->btree
7eb0: 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20  Mask, i);.  if( 
7ec0: 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42  i!=1 && sqlite3B
7ed0: 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e  treeSharable(p->
7ee0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20  db->aDb[i].pBt) 
7ef0: 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
7f00: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29  (p->lockMask, i)
7f10: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65  ;.  }.}..#if !de
7f20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7f30: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
7f40: 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
7f50: 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20  SAFE>0./*.** If 
7f60: 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
7f70: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68  ed to support sh
7f80: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
7f90: 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  and to be thread
7fa0: 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  safe,.** this ro
7fb0: 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68  utine obtains th
7fc0: 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74  e mutex associat
7fd0: 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53  ed with each BtS
7fe0: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a  hared structure.
7ff0: 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61  ** that may be a
8000: 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56  ccessed by the V
8010: 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
8020: 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e  rgument. In doin
8030: 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20  g so it also.** 
8040: 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65  sets the BtShare
8050: 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65  d.db member of e
8060: 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61  ach of the BtSha
8070: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20  red structures, 
8080: 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74  ensuring.** that
8090: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73   the correct bus
80a0: 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
80b0: 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66  ck is invoked if
80c0: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a   required..**.**
80d0: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
80e0: 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74  t threadsafe but
80f0: 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68   does support sh
8100: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
8110: 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33   then.** sqlite3
8120: 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20  BtreeEnter() is 
8130: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74  invoked to set t
8140: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76  he BtShared.db v
8150: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61  ariables.** of a
8160: 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73  ll of BtShared s
8170: 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73  tructures access
8180: 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74  ible via the dat
8190: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a  abase handle .**
81a0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
81b0: 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49   the VM..**.** I
81c0: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
81d0: 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64  threadsafe and d
81e0: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
81f0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
8200: 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e, this.** funct
8210: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
8220: 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72  **.** The p->btr
8230: 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20  eeMask field is 
8240: 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c  a bitmask of all
8250: 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65   btrees that the
8260: 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74   prepared .** st
8270: 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65  atement p will e
8280: 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20  ver use.  Let N 
8290: 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
82a0: 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65   bits in p->btre
82b0: 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70  eMask.** corresp
82c0: 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73  onding to btrees
82d0: 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64   that use shared
82e0: 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68   cache.  Then th
82f0: 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20  e runtime of.** 
8300: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8310: 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69  N*N.  But as N i
8320: 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68  s rarely more th
8330: 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c  an 1, this shoul
8340: 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72  d not.** be a pr
8350: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
8360: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
8370: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
8380: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
8390: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
83a0: 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62  nt nDb;.  if( Db
83b0: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c  MaskAllZero(p->l
83c0: 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72  ockMask) ) retur
83d0: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
83e0: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
83f0: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
8400: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
8410: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
8420: 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29  i=0; i<nDb; i++)
8430: 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26  {.    if( i!=1 &
8440: 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  & DbMaskTest(p->
8450: 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41  lockMask,i) && A
8460: 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74  LWAYS(aDb[i].pBt
8470: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  !=0) ){.      sq
8480: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
8490: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
84a0: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
84b0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
84c0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
84d0: 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54  _CACHE) && SQLIT
84e0: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f  E_THREADSAFE>0./
84f0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20  *.** Unlock all 
8500: 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72  of the btrees pr
8510: 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20  eviously locked 
8520: 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  by a call to sql
8530: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e  ite3VdbeEnter().
8540: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8550: 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a  VdbeLeave(Vdbe *
8560: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
8570: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
8580: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
8590: 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c  ;.  if( DbMaskAl
85a0: 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73  lZero(p->lockMas
85b0: 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  k) ) return;  /*
85c0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
85d0: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   */.  db = p->db
85e0: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
85f0: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
8600: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  Db;.  for(i=0; i
8610: 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nDb; i++){.    
8620: 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61  if( i!=1 && DbMa
8630: 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61  skTest(p->lockMa
8640: 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28  sk,i) && ALWAYS(
8650: 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29  aDb[i].pBt!=0) )
8660: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
8670: 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d  treeLeave(aDb[i]
8680: 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pBt);.    }.  }
8690: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .}.#endif..#if d
86a0: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
86b0: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
86c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
86d0: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  .** Print a sing
86e0: 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  le opcode.  This
86f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
8700: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f   for debugging o
8710: 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
8720: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
8730: 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20  FILE *pOut, int 
8740: 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  pc, Op *pOp){.  
8750: 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61  char *zP4;.  cha
8760: 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68  r zPtr[50];.  ch
8770: 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20  ar zCom[100];.  
8780: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
8790: 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25  r *zFormat1 = "%
87a0: 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64  4d %-13s %4d %4d
87b0: 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58 20   %4d %-13s %.2X 
87c0: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
87d0: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
87e0: 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69  dout;.  zP4 = di
87f0: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74  splayP4(pOp, zPt
8800: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
8810: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
8820: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
8830: 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c 61  OMMENTS.  displa
8840: 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50  yComment(pOp, zP
8850: 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28  4, zCom, sizeof(
8860: 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20  zCom));.#else.  
8870: 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e  zCom[0] = 0;.#en
8880: 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68  dif.  /* NB:  Th
8890: 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  e sqlite3OpcodeN
88a0: 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ame() function i
88b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
88c0: 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20 20   code created.  
88d0: 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f  ** by the mkopco
88e0: 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70  deh.awk and mkop
88f0: 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70 74  codec.awk script
8900: 73 20 77 68 69 63 68 20 65 78 74 72 61 63 74 20  s which extract 
8910: 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61  the.  ** informa
8920: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 64  tion from the vd
8930: 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78 74  be.c source text
8940: 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 4f   */.  fprintf(pO
8950: 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63  ut, zFormat1, pc
8960: 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  , .      sqlite3
8970: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
8980: 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31  opcode), pOp->p1
8990: 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e  , pOp->p2, pOp->
89a0: 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35  p3, zP4, pOp->p5
89b0: 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29  ,.      zCom.  )
89c0: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
89d0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
89e0: 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72  * Release an arr
89f0: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
8a00: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ents.*/.static v
8a10: 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  oid releaseMemAr
8a20: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
8a30: 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e  N){.  if( p && N
8a40: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e   ){.    Mem *pEn
8a50: 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  d;.    sqlite3 *
8a60: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
8a70: 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  u8 malloc_failed
8a80: 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   = db->mallocFai
8a90: 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  led;.    if( db-
8aa0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b  >pnBytesFreed ){
8ab0: 0a 20 20 20 20 20 20 66 6f 72 28 70 45 6e 64 3d  .      for(pEnd=
8ac0: 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70  &p[N]; p<pEnd; p
8ad0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
8ae0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8af0: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
8b00: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
8b10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
8b20: 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45  pEnd=&p[N]; p<pE
8b30: 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  nd; p++){.      
8b40: 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d  assert( (&p[1])=
8b50: 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62  =pEnd || p[0].db
8b60: 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20  ==p[1].db );.   
8b70: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
8b80: 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e  e3VdbeCheckMemIn
8b90: 76 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a  variants(p) );..
8ba0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
8bb0: 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e  ock is really an
8bc0: 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e   inlined version
8bd0: 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d   of sqlite3VdbeM
8be0: 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20  emRelease().    
8bf0: 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20    ** that takes 
8c00: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
8c10: 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d   fact that the m
8c20: 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65  emory cell value
8c30: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65   is .      ** be
8c40: 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20  ing set to NULL 
8c50: 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20  after releasing 
8c60: 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f  any dynamic reso
8c70: 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a  urces..      **.
8c80: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73        ** The jus
8c90: 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64  tification for d
8ca0: 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20  uplicating code 
8cb0: 69 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e  is that accordin
8cc0: 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63  g to .      ** c
8cd0: 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63  allgrind, this c
8ce0: 61 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20  auses a certain 
8cf0: 74 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74  test case to hit
8d00: 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20   the CPU 4.7 .  
8d10: 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c      ** percent l
8d20: 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20  ess (x86 linux, 
8d30: 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e  gcc version 4.1.
8d40: 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20  2, -O6) than if 
8d50: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
8d60: 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65  3MemRelease() we
8d70: 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68  re called from h
8d80: 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74  ere. With -O2, t
8d90: 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20  his jumps.      
8da0: 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e  ** to 6.6 percen
8db0: 74 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65  t. The test case
8dc0: 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30   is inserting 10
8dd0: 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74  00 rows into a t
8de0: 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77  able .      ** w
8df0: 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75  ith no indexes u
8e00: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72  sing a single pr
8e10: 65 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74  epared INSERT st
8e20: 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20  atement, bind() 
8e30: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
8e40: 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61  set(). Inserts a
8e50: 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20  re grouped into 
8e60: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  a transaction.. 
8e70: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65       */.      te
8e80: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
8e90: 20 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20   & MEM_Agg );.  
8ea0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
8eb0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e  >flags & MEM_Dyn
8ec0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8ed0: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
8ee0: 45 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20  EM_Frame );.    
8ef0: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
8f00: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
8f10: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
8f20: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67  ->flags&(MEM_Agg
8f30: 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61  |MEM_Dyn|MEM_Fra
8f40: 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29  me|MEM_RowSet) )
8f50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8f60: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
8f70: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  p);.      }else 
8f80: 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29  if( p->zMalloc )
8f90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8fa0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
8fb0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
8fc0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b   p->zMalloc = 0;
8fd0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
8fe0: 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  p->flags = MEM_U
8ff0: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 0a  ndefined;.    }.
9000: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
9010: 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61  iled = malloc_fa
9020: 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iled;.  }.}../*.
9030: 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65  ** Delete a Vdbe
9040: 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64  Frame object and
9050: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56   its contents. V
9060: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
9070: 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
9080: 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67  d by the OP_Prog
9090: 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71  ram opcode in sq
90a0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
90b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
90c0: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
90d0: 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20  VdbeFrame *p){. 
90e0: 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61   int i;.  Mem *a
90f0: 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d  Mem = VdbeFrameM
9100: 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72  em(p);.  VdbeCur
9110: 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56  sor **apCsr = (V
9120: 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d  dbeCursor **)&aM
9130: 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d  em[p->nChildMem]
9140: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
9150: 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b  ->nChildCsr; i++
9160: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
9170: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e  beFreeCursor(p->
9180: 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20  v, apCsr[i]);.  
9190: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
91a0: 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68  ray(aMem, p->nCh
91b0: 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74  ildMem);.  sqlit
91c0: 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64  e3DbFree(p->v->d
91d0: 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  b, p);.}..#ifnde
91e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
91f0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
9200: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
9210: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
9220: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
9230: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
9240: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
9250: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
9260: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
9270: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
9280: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
9290: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
92a0: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
92b0: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
92c0: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
92d0: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
92e0: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
92f0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
9300: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69  plain==1, each i
9310: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69  nstruction is li
9320: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70  sted.  When.** p
9330: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e  ->explain==2, on
9340: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  ly OP_Explain in
9350: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c  structions are l
9360: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a  isted and these.
9370: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20  ** are shown in 
9380: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d  a different form
9390: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  at.  p->explain=
93a0: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  =2 is used to im
93b0: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41  plement.** EXPLA
93c0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a  IN QUERY PLAN..*
93d0: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
93e0: 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74  lain==1, first t
93f0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
9400: 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20  is listed, then 
9410: 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74  each of.** the t
9420: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
9430: 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e  ms are listed on
9440: 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74  e by one..*/.int
9450: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
9460: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
9470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9480: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
9490: 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20    int nRow;     
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77         /* Stop w
94c0: 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65  hen row count re
94d0: 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  aches this */.  
94e0: 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20  int nSub = 0;   
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9500: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9510: 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e  f sub-vdbes seen
9520: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62   so far */.  Sub
9530: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20  Program **apSub 
9540: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
9550: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
9560: 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d  b-vdbes */.  Mem
9570: 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20   *pSub = 0;     
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9590: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
95a0: 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73   hold array of s
95b0: 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c  ubprogs */.  sql
95c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
95d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
95e0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
95f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
9600: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
9630: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
9640: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9660: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
9670: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  */.  Mem *pMem =
9680: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20   &p->aMem[1];   
9690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
96a0: 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74  st Mem of result
96b0: 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72   set */..  asser
96c0: 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b  t( p->explain );
96d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
96e0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
96f0: 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RUN );.  assert(
9700: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
9710: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
9720: 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63  TE_BUSY || p->rc
9730: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
9740: 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  ;..  /* Even tho
9750: 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ugh this opcode 
9760: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e  does not use dyn
9770: 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72  amic strings for
9780: 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  .  ** the result
9790: 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  , result columns
97a0: 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61   may become dyna
97b0: 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20  mic if the user 
97c0: 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74  calls.  ** sqlit
97d0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
97e0: 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72  (), causing a tr
97f0: 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46  anslation to UTF
9800: 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20  -16 encoding..  
9810: 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  */.  releaseMemA
9820: 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20  rray(pMem, 8);. 
9830: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
9840: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
9850: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
9860: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
9870: 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f  ppens if a mallo
9880: 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c  c() inside a cal
9890: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c  l to sqlite3_col
98a0: 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20  umn_text() or.  
98b0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
98c0: 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69  umn_text16() fai
98d0: 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d  led.  */.    db-
98e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
98f0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
9900: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
9910: 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
9920: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
9930: 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f  rows reaches nRo
9940: 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  w, that means th
9950: 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68  e.  ** listing h
9960: 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20  as finished and 
9970: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73  sqlite3_step() s
9980: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c  hould return SQL
9990: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e  ITE_DONE..  ** n
99a0: 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f  Row is the sum o
99b0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
99c0: 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  rows in the main
99d0: 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20   program, plus. 
99e0: 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74   ** the sum of t
99f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
9a00: 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72  s in all trigger
9a10: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63   subprograms enc
9a20: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f  ountered.  ** so
9a30: 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20   far.  The nRow 
9a40: 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65  value will incre
9a50: 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67  ase as new trigg
9a60: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
9a70: 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65  re.  ** encounte
9a80: 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77  red, but p->pc w
9a90: 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63  ill eventually c
9aa0: 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e  atch up to nRow.
9ab0: 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70  .  */.  nRow = p
9ac0: 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e  ->nOp;.  if( p->
9ad0: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
9ae0: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38    /* The first 8
9af0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72   memory cells ar
9b00: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72  e used for the r
9b10: 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77  esult set.  So w
9b20: 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  e will.    ** co
9b30: 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68  mmandeer the 9th
9b40: 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20   cell to use as 
9b50: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61  storage for an a
9b60: 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
9b70: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67  .    ** to trigg
9b80: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  er subprograms. 
9b90: 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61   The VDBE is gua
9ba0: 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20  ranteed to have 
9bb0: 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a  at least 9.    *
9bc0: 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20  * cells.  */.   
9bd0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d   assert( p->nMem
9be0: 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d  >9 );.    pSub =
9bf0: 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20   &p->aMem[9];.  
9c00: 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67    if( pSub->flag
9c10: 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  s&MEM_Blob ){.  
9c20: 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69      /* On the fi
9c30: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
9c40: 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62  te3_step(), pSub
9c50: 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c   will hold a NUL
9c60: 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20  L.  It is.      
9c70: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ** initialized t
9c80: 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20  o a BLOB by the 
9c90: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72  P4_SUBPROGRAM pr
9ca0: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62  ocessing logic b
9cb0: 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53  elow */.      nS
9cc0: 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a  ub = pSub->n/siz
9cd0: 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20  eof(Vdbe*);.    
9ce0: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
9cf0: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
9d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
9d10: 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b  i=0; i<nSub; i++
9d20: 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  ){.      nRow +=
9d30: 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a   apSub[i]->nOp;.
9d40: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b      }.  }..  do{
9d50: 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b  .    i = p->pc++
9d60: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52  ;.  }while( i<nR
9d70: 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e  ow && p->explain
9d80: 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d  ==2 && p->aOp[i]
9d90: 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c  .opcode!=OP_Expl
9da0: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  ain );.  if( i>=
9db0: 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72  nRow ){.    p->r
9dc0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
9dd0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
9de0: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ONE;.  }else if(
9df0: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
9e00: 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  upted ){.    p->
9e10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
9e20: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
9e30: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
9e40: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
9e50: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
9e60: 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  db, "%s", sqlite
9e70: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b  3ErrStr(p->rc));
9e80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
9e90: 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20  ar *zP4;.    Op 
9ea0: 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c  *pOp;.    if( i<
9eb0: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  p->nOp ){.      
9ec0: 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69  /* The output li
9ed0: 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61  ne number is sma
9ee0: 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77  ll enough that w
9ef0: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74  e are still in t
9f00: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e  he.      ** main
9f10: 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20   program. */.   
9f20: 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70     pOp = &p->aOp
9f30: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
9f40: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
9f50: 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e  currently listin
9f60: 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  g subprograms.  
9f70: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
9f80: 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a   one and.      *
9f90: 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70  * pick up the ap
9fa0: 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65  propriate opcode
9fb0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  . */.      int j
9fc0: 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e  ;.      i -= p->
9fd0: 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nOp;.      for(j
9fe0: 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d  =0; i>=apSub[j]-
9ff0: 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nOp; j++){.    
a000: 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a      i -= apSub[j
a010: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a  ]->nOp;.      }.
a020: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53        pOp = &apS
a030: 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20  ub[j]->aOp[i];. 
a040: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
a050: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
a060: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
a070: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
a080: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20   pMem->u.i = i; 
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a0b0: 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  * Program counte
a0c0: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  r */.      pMem+
a0d0: 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d  +;.  .      pMem
a0e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
a0f0: 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  atic|MEM_Str|MEM
a100: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
a110: 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71  m->z = (char*)sq
a120: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
a130: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a  pOp->opcode); /*
a140: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   Opcode */.     
a150: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
a160: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
a170: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
a180: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
a190: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
a1a0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
a1b0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
a1c0: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20       /* When an 
a1d0: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
a1e0: 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28  e is encounter (
a1f0: 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20  the only opcode 
a200: 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a  that has.      *
a210: 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41  * a P4_SUBPROGRA
a220: 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70  M argument), exp
a230: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
a240: 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62  the array of sub
a250: 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a  programs.      *
a260: 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65  * kept in p->aMe
a270: 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74  m[9].z to hold t
a280: 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d  he new program -
a290: 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73   assuming this s
a2a0: 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20  ubprogram.      
a2b0: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  ** has not alrea
a2c0: 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20  dy been seen..  
a2d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
a2e0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
a2f0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
a300: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
a310: 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65   = (nSub+1)*size
a320: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
a330: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
a340: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
a350: 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20   j<nSub; j++){. 
a360: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53           if( apS
a370: 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70  ub[j]==pOp->p4.p
a380: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
a390: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a3a0: 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26     if( j==nSub &
a3b0: 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c  & SQLITE_OK==sql
a3c0: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
a3d0: 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75  pSub, nByte, nSu
a3e0: 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  b!=0) ){.       
a3f0: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
a400: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
a410: 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  z;.          apS
a420: 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70  ub[nSub++] = pOp
a430: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
a440: 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66           pSub->f
a450: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62  lags |= MEM_Blob
a460: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62  ;.          pSub
a470: 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f  ->n = nSub*sizeo
a480: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
a490: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a4a0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65  }.    }..    pMe
a4b0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
a4c0: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
a4d0: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4f0: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
a500: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
a510: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
a520: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
a530: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20  >u.i = pOp->p2; 
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a           /* P2 *
a560: 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  /.    pMem++;.. 
a570: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
a580: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
a590: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
a5a0: 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a5c0: 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  3 */.    pMem++;
a5d0: 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
a5e0: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
a5f0: 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20  m, 32, 0) ){    
a600: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f          /* P4 */
a610: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a620: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
a630: 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
a640: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
a650: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
a660: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
a670: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a  |MEM_Term;.    z
a680: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
a690: 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29  Op, pMem->z, 32)
a6a0: 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70  ;.    if( zP4!=p
a6b0: 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  Mem->z ){.      
a6c0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
a6d0: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20  tStr(pMem, zP4, 
a6e0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
a6f0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
a700: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
a710: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
a720: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
a730: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
a740: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
a750: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
a760: 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  TF8;.    }.    p
a770: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
a780: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
a790: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
a7a0: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
a7b0: 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20  em, 4, 0) ){.   
a7c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a7d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a7e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
a7f0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
a800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
a810: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a820: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
a830: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
a840: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
a850: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
a860: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
a870: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
a880: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  /.      pMem->en
a890: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
a8a0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
a8b0: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
a8c0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
a8d0: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66  OMMENTS.      if
a8e0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
a8f0: 47 72 6f 77 28 70 4d 65 6d 2c 20 35 30 30 2c 20  Grow(pMem, 500, 
a900: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  0) ){.        as
a910: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
a920: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
a930: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a940: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
a950: 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  }.      pMem->fl
a960: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
a970: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
a980: 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43  em->n = displayC
a990: 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c  omment(pOp, zP4,
a9a0: 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a   pMem->z, 500);.
a9b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
a9c0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
a9d0: 65 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d  else.      pMem-
a9e0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
a9f0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
aa00: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d           /* Comm
aa10: 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ent */.#endif.  
aa20: 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73    }..    p->nRes
aa30: 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28  Column = 8 - 4*(
aa40: 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20  p->explain-1);. 
aa50: 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74     p->pResultSet
aa60: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a   = &p->aMem[1];.
aa70: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
aa80: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
aa90: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
aaa0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
aab0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
aac0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
aad0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
aae0: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
aaf0: 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61   the SQL that wa
ab00: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
ab10: 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  te a VDBE progra
ab20: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
ab30: 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56  e3VdbePrintSql(V
ab40: 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74  dbe *p){.  const
ab50: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
ab60: 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20  if( p->zSql ){. 
ab70: 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a     z = p->zSql;.
ab80: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e    }else if( p->n
ab90: 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e  Op>=1 ){.    con
aba0: 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d  st VdbeOp *pOp =
abb0: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20   &p->aOp[0];.   
abc0: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
abd0: 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70  ==OP_Init && pOp
abe0: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
abf0: 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a     z = pOp->p4.z
ac00: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73  ;.      while( s
ac10: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a  qlite3Isspace(*z
ac20: 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) ) z++;.    }. 
ac30: 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69   }.  if( z ) pri
ac40: 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e  ntf("SQL: [%s]\n
ac50: 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ", z);.}.#endif.
ac60: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
ac70: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
ac80: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
ac90: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
aca0: 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  E)./*.** Print a
acb0: 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67  n IOTRACE messag
acc0: 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f  e showing SQL co
acd0: 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ntent..*/.void s
ace0: 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63  qlite3VdbeIOTrac
acf0: 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  eSql(Vdbe *p){. 
ad00: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
ad10: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
ad20: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  ;.  if( sqlite3I
ad30: 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75  oTrace==0 ) retu
ad40: 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  rn;.  if( nOp<1 
ad50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
ad60: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
ad70: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
ad80: 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d  =OP_Init && pOp-
ad90: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
ada0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68  int i, j;.    ch
adb0: 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20  ar z[1000];.    
adc0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
add0: 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
ade0: 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  %s", pOp->p4.z);
adf0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71  .    for(i=0; sq
ae00: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
ae10: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
ae20: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
ae30: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
ae40: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
ae50: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]) ){.        if
ae60: 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b  ( z[i-1]!=' ' ){
ae70: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
ae80: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
ae90: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
aea0: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
aeb0: 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   z[i];.      }. 
aec0: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
aed0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f  0;.    sqlite3Io
aee0: 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22  Trace("SQL %s\n"
aef0: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
af00: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
af10: 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49  IT_TRACE && SQLI
af20: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
af30: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  E */../*.** Allo
af40: 63 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20  cate space from 
af50: 61 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66  a fixed size buf
af60: 66 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61  fer and return a
af70: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74   pointer to.** t
af80: 68 61 74 20 73 70 61 63 65 2e 20 20 49 66 20 69  hat space.  If i
af90: 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63  nsufficient spac
afa0: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  e is available, 
afb0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
afc0: 2a 2a 20 54 68 65 20 70 42 75 66 20 70 61 72 61  ** The pBuf para
afd0: 6d 65 74 65 72 20 69 73 20 74 68 65 20 69 6e 69  meter is the ini
afe0: 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20  tial value of a 
aff0: 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77 69  pointer which wi
b000: 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68  ll.** receive th
b010: 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70  e new memory.  p
b020: 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  Buf is normally 
b030: 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69  NULL.  If pBuf i
b040: 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69  s not.** NULL, i
b050: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d  t means that mem
b060: 6f 72 79 20 73 70 61 63 65 20 68 61 73 20 61 6c  ory space has al
b070: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
b080: 61 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a  ated and that.**
b090: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   this routine sh
b0a0: 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  ould not allocat
b0b0: 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79  e any new memory
b0c0: 2e 20 20 57 68 65 6e 20 70 42 75 66 20 69 73 20  .  When pBuf is 
b0d0: 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70  not.** NULL simp
b0e0: 6c 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20  ly return pBuf. 
b0f0: 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e   Only allocate n
b100: 65 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  ew memory space 
b110: 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20  when pBuf.** is 
b120: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74  NULL..**.** nByt
b130: 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
b140: 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
b150: 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  e needed..**.** 
b160: 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74  *ppFrom points t
b170: 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63  o available spac
b180: 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74  e and pEnd point
b190: 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  s to the end of 
b1a0: 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  the.** available
b1b0: 20 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73 70   space.  When sp
b1c0: 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ace is allocated
b1d0: 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 76  , *ppFrom is adv
b1e0: 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 68  anced past.** th
b1f0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c  e end of the all
b200: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a  ocated space..**
b210: 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61  .** *pnByte is a
b220: 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20   counter of the 
b230: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
b240: 6f 66 20 73 70 61 63 65 20 74 68 61 74 20 68 61  of space that ha
b250: 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20  ve failed.** to 
b260: 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68  allocate.  If th
b270: 65 72 65 20 69 73 20 69 6e 73 75 66 66 69 63 69  ere is insuffici
b280: 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70  ent space in *pp
b290: 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20  From to satisfy 
b2a0: 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20  the.** request, 
b2b0: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a  then increment *
b2c0: 70 6e 42 79 74 65 20 62 79 20 74 68 65 20 61 6d  pnByte by the am
b2d0: 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75  ount of the requ
b2e0: 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  est..*/.static v
b2f0: 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28  oid *allocSpace(
b300: 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
b310: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
b320: 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20   return pointer 
b330: 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 2a  will be stored *
b340: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20  /.  int nByte,  
b350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b360: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61  er of bytes to a
b370: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20  llocate */.  u8 
b380: 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20  **ppFrom,       
b390: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c    /* IN/OUT: All
b3a0: 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72  ocate from *ppFr
b3b0: 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  om */.  u8 *pEnd
b3c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
b3d0: 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74  Pointer to 1 byt
b3e0: 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
b3f0: 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72  f *ppFrom buffer
b400: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74   */.  int *pnByt
b410: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e          /* If
b420: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e   allocation cann
b430: 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72  ot be made, incr
b440: 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f  ement *pnByte */
b450: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49  .){.  assert( EI
b460: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
b470: 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20  NT(*ppFrom) );. 
b480: 20 69 66 28 20 70 42 75 66 20 29 20 72 65 74 75   if( pBuf ) retu
b490: 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 65  rn pBuf;.  nByte
b4a0: 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29   = ROUND8(nByte)
b4b0: 3b 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f  ;.  if( &(*ppFro
b4c0: 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e  m)[nByte] <= pEn
b4d0: 64 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d 20  d ){.    pBuf = 
b4e0: 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a  (void*)*ppFrom;.
b4f0: 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e      *ppFrom += n
b500: 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Byte;.  }else{. 
b510: 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42     *pnByte += nB
b520: 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  yte;.  }.  retur
b530: 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pBuf;.}../*.**
b540: 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42 45   Rewind the VDBE
b550: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
b560: 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72  inning in prepar
b570: 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e  ation for.** run
b580: 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64  ning it..*/.void
b590: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
b5a0: 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66  nd(Vdbe *p){.#if
b5b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b5c0: 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
b5d0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a  d(VDBE_PROFILE).
b5e0: 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a    int i;.#endif.
b5f0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
b600: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
b610: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
b620: 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54  _INIT );..  /* T
b630: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
b640: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f  t least one opco
b650: 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
b660: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a  t( p->nOp>0 );..
b670: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67    /* Set the mag
b680: 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43  ic to VDBE_MAGIC
b690: 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68  _RUN sooner rath
b6a0: 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a  er than later. *
b6b0: 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  /.  p->magic = V
b6c0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a  DBE_MAGIC_RUN;..
b6d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
b6e0: 42 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  BUG.  for(i=1; i
b6f0: 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a  <p->nMem; i++){.
b700: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
b710: 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62  Mem[i].db==p->db
b720: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
b730: 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70   p->pc = -1;.  p
b740: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
b750: 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  ;.  p->errorActi
b760: 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
b770: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
b780: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d  _MAGIC_RUN;.  p-
b790: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
b7a0: 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b  p->cacheCtr = 1;
b7b0: 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69  .  p->minWriteFi
b7c0: 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a  leFormat = 255;.
b7d0: 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
b7e0: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e  = 0;.  p->nFkCon
b7f0: 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66  straint = 0;.#if
b800: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
b810: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
b820: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
b830: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20  p->aOp[i].cnt = 
b840: 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  0;.    p->aOp[i]
b850: 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d  .cycles = 0;.  }
b860: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
b870: 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75   Prepare a virtu
b880: 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65  al machine for e
b890: 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65  xecution for the
b8a0: 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74 65   first time afte
b8b0: 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68  r.** creating th
b8c0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
b8d0: 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65  e.  This involve
b8e0: 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a  s things such.**
b8f0: 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73   as allocating s
b900: 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69  tack space and i
b910: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
b920: 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e  program counter.
b930: 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44  .** After the VD
b940: 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65  BE has be preppe
b950: 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65  d, it can be exe
b960: 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20  cuted by one or 
b970: 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f  more.** calls to
b980: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
b990: 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ().  .**.** This
b9a0: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
b9b0: 20 63 61 6c 6c 65 64 20 65 78 61 63 74 20 6f 6e   called exact on
b9c0: 63 65 20 6f 6e 20 61 20 65 61 63 68 20 76 69 72  ce on a each vir
b9d0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
b9e0: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
b9f0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
ba00: 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70  e VM has been "p
ba10: 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20  ackaged" and is 
ba20: 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e  ready.** to run.
ba30: 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75    After this rou
ba40: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
ba50: 66 75 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20  futher calls to 
ba60: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41  .** sqlite3VdbeA
ba70: 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73  ddOp() functions
ba80: 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e   are prohibited.
ba90: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
baa0: 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68  isconnects.** th
bab0: 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
bac0: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61  Parse object tha
bad0: 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74  t helped generat
bae0: 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65  e it so that the
baf0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65 63  .** the Vdbe bec
bb00: 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64  omes an independ
bb10: 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74  ent entity and t
bb20: 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
bb30: 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f  can be.** destro
bb40: 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  yed..**.** Use t
bb50: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
bb60: 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65  wind() procedure
bb70: 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69   to restore a vi
bb80: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61  rtual machine ba
bb90: 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69  ck.** to its ini
bba0: 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65 72  tial state after
bbb0: 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e   it has been run
bbc0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
bbd0: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a  3VdbeMakeReady(.
bbe0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc00: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
bc10: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc30: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
bc40: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ext */.){.  sqli
bc50: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
bc60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
bc70: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
bc80: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ction */.  int n
bc90: 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Var;            
bca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
bcb0: 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72  ber of parameter
bcc0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b  s */.  int nMem;
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bce0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bcf0: 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67  of VM memory reg
bd00: 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  isters */.  int 
bd10: 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  nCursor;        
bd20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
bd30: 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
bd40: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
bd50: 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20  t nArg;         
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bd70: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
bd80: 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61  nts in subprogra
bd90: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63  ms */.  int nOnc
bda0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
bdb0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
bdc0: 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74   of OP_Once inst
bdd0: 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  ructions */.  in
bde0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
be00: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
be10: 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20 20 20    u8 *zCsr;     
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c   /* Memory avail
be40: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74  able for allocat
be50: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e  ion */.  u8 *zEn
be60: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
be70: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
be80: 20 62 79 74 65 20 70 61 73 74 20 61 6c 6c 6f 63   byte past alloc
be90: 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ated memory */. 
bea0: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78 74 72  /* How much extr
bed0: 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65 65 64  a memory is need
bee0: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
bef0: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
bf00: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
bf10: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
bf20: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
bf30: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
bf40: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
bf50: 73 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70  ssert( pParse==p
bf60: 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20 64 62  ->pParse );.  db
bf70: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
bf80: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
bf90: 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61  iled==0 );.  nVa
bfa0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  r = pParse->nVar
bfb0: 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73  ;.  nMem = pPars
bfc0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73  e->nMem;.  nCurs
bfd0: 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
bfe0: 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 61 72  b;.  nArg = pPar
bff0: 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 6e  se->nMaxArg;.  n
c000: 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Once = pParse->n
c010: 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f 6e 63  Once;.  if( nOnc
c020: 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d 20 31  e==0 ) nOnce = 1
c030: 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74 20 6c  ; /* Ensure at l
c040: 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20 69 6e  east one byte in
c050: 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b 5d 20   p->aOnceFlag[] 
c060: 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 20 65  */.  .  /* For e
c070: 61 63 68 20 63 75 72 73 6f 72 20 72 65 71 75 69  ach cursor requi
c080: 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61  red, also alloca
c090: 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  te a memory cell
c0a0: 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65  . Memory.  ** ce
c0b0: 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72  lls (nMem+1-nCur
c0c0: 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c  sor)..nMem, incl
c0d0: 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65  usive, will neve
c0e0: 72 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a  r be used by.  *
c0f0: 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  * the vdbe progr
c100: 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79  am. Instead they
c110: 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c   are used to all
c120: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a  ocate space for.
c130: 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2f    ** VdbeCursor/
c140: 42 74 43 75 72 73 6f 72 20 73 74 72 75 63 74 75  BtCursor structu
c150: 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66  res. The blob of
c160: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
c170: 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 63 75  ed with .  ** cu
c180: 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72 65 64  rsor 0 is stored
c190: 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
c1a0: 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c  nMem. Memory cel
c1b0: 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20  l (nMem-1).  ** 
c1c0: 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f 62 20  stores the blob 
c1d0: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
c1e0: 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
c1f0: 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20   1, etc..  **.  
c200: 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c  ** See also: all
c210: 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20  ocateCursor().. 
c220: 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43   */.  nMem += nC
c230: 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ursor;..  /* All
c240: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
c250: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73  memory registers
c260: 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 2c  , SQL variables,
c270: 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 61 6e   VDBE cursors an
c280: 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61 79  d .  ** an array
c290: 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c 20   to marshal SQL 
c2a0: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
c2b0: 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43  ts in..  */.  zC
c2c0: 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f  sr = (u8*)&p->aO
c2d0: 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20 20  p[p->nOp];      
c2e0: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
c2f0: 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c  avaliable for al
c300: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45  location */.  zE
c310: 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f  nd = (u8*)&p->aO
c320: 70 5b 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  p[pParse->nOpAll
c330: 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 62  oc];  /* First b
c340: 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
c350: 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73  zCsr[] */..  res
c360: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
c370: 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65  &nArg);.  p->use
c380: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28  sStmtJournal = (
c390: 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75  u8)(pParse->isMu
c3a0: 6c 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72  ltiWrite && pPar
c3b0: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20  se->mayAbort);. 
c3c0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
c3d0: 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20  lain && nMem<10 
c3e0: 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30  ){.    nMem = 10
c3f0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 7a  ;.  }.  memset(z
c400: 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73  Csr, 0, zEnd-zCs
c410: 72 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20 28 7a  r);.  zCsr += (z
c420: 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b  Csr - (u8*)0)&7;
c430: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
c440: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
c450: 7a 43 73 72 29 20 29 3b 0a 20 20 70 2d 3e 65 78  zCsr) );.  p->ex
c460: 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  pired = 0;..  /*
c470: 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69   Memory for regi
c480: 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72  sters, parameter
c490: 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20  s, cursor, etc, 
c4a0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  is allocated in 
c4b0: 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e  two.  ** passes.
c4c0: 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70    On the first p
c4d0: 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72  ass, we try to r
c4e0: 65 75 73 65 20 75 6e 75 73 65 64 20 73 70 61 63  euse unused spac
c4f0: 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65  e at the .  ** e
c500: 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
c510: 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61   array.  If we a
c520: 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74  re unable to sat
c530: 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a  isfy all memory.
c540: 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74    ** requirement
c550: 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65  s by reusing the
c560: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61   opcode array ta
c570: 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63  il, then the sec
c580: 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69  ond.  ** pass wi
c590: 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72  ll fill in the r
c5a0: 65 73 74 20 75 73 69 6e 67 20 61 20 66 72 65 73  est using a fres
c5b0: 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a  h allocation.  .
c5c0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74    **.  ** This t
c5d0: 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68  wo-pass approach
c5e0: 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20   that reuses as 
c5f0: 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
c600: 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a  ossible from.  *
c610: 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73  * the leftover s
c620: 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
c630: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
c640: 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63  ray can signific
c650: 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63  antly.  ** reduc
c660: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
c670: 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61  memory held by a
c680: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
c690: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b  ent..  */.  do {
c6a0: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a  .    nByte = 0;.
c6b0: 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c      p->aMem = al
c6c0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d  locSpace(p->aMem
c6d0: 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  , nMem*sizeof(Me
c6e0: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  m), &zCsr, zEnd,
c6f0: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
c700: 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  >aVar = allocSpa
c710: 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72  ce(p->aVar, nVar
c720: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a  *sizeof(Mem), &z
c730: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
c740: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67  e);.    p->apArg
c750: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
c760: 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a  >apArg, nArg*siz
c770: 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72  eof(Mem*), &zCsr
c780: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
c790: 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20  .    p->azVar = 
c7a0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a  allocSpace(p->az
c7b0: 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66  Var, nVar*sizeof
c7c0: 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20  (char*), &zCsr, 
c7d0: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
c7e0: 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c     p->apCsr = al
c7f0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73  locSpace(p->apCs
c800: 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  r, nCursor*sizeo
c810: 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a  f(VdbeCursor*),.
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 20 20 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c            &zCsr,
c840: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
c850: 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67      p->aOnceFlag
c860: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
c870: 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63  >aOnceFlag, nOnc
c880: 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  e, &zCsr, zEnd, 
c890: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  &nByte);.    if(
c8a0: 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
c8b0: 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74  p->pFree = sqlit
c8c0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
c8d0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  b, nByte);.    }
c8e0: 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70  .    zCsr = p->p
c8f0: 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  Free;.    zEnd =
c900: 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20   &zCsr[nByte];. 
c910: 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26   }while( nByte &
c920: 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
c930: 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75  led );..  p->nCu
c940: 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a  rsor = nCursor;.
c950: 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d    p->nOnceFlag =
c960: 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d   nOnce;.  if( p-
c970: 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >aVar ){.    p->
c980: 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56  nVar = (ynVar)nV
c990: 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b  ar;.    for(n=0;
c9a0: 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20   n<nVar; n++){. 
c9b0: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
c9c0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
c9d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b  ;.      p->aVar[
c9e0: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
c9f0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  }.  }.  if( p->a
ca00: 7a 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  zVar ){.    p->n
ca10: 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  zVar = pParse->n
ca20: 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79  zVar;.    memcpy
ca30: 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72 73  (p->azVar, pPars
ca40: 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56  e->azVar, p->nzV
ca50: 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56  ar*sizeof(p->azV
ca60: 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d  ar[0]));.    mem
ca70: 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56 61  set(pParse->azVa
ca80: 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a  r, 0, pParse->nz
ca90: 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  Var*sizeof(pPars
caa0: 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20  e->azVar[0]));. 
cab0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d   }.  if( p->aMem
cac0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d   ){.    p->aMem-
cad0: 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  -;              
cae0: 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b          /* aMem[
caf0: 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e  ] goes from 1..n
cb00: 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d  Mem */.    p->nM
cb10: 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20  em = nMem;      
cb20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
cb30: 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e      not from 0..
cb40: 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f  nMem-1 */.    fo
cb50: 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20  r(n=1; n<=nMem; 
cb60: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  n++){.      p->a
cb70: 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Mem[n].flags = M
cb80: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20  EM_Undefined;.  
cb90: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64      p->aMem[n].d
cba0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
cbb0: 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d  }.  p->explain =
cbc0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
cbd0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
cbe0: 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  ewind(p);.}../*.
cbf0: 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20  ** Close a VDBE 
cc00: 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
cc10: 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
cc20: 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
cc30: 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20   .** happens to 
cc40: 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hold..*/.void sq
cc50: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
cc60: 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  sor(Vdbe *p, Vdb
cc70: 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20  eCursor *pCx){. 
cc80: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
cc90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
cca0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
ccb0: 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70  erClose(p->db, p
ccc0: 43 78 29 3b 0a 20 20 69 66 28 20 70 43 78 2d 3e  Cx);.  if( pCx->
ccd0: 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
cce0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
ccf0: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54  ->pBt);.    /* T
cd00: 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  he pCx->pCursor 
cd10: 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75  will be close au
cd20: 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20  tomatically, if 
cd30: 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20  it exists, by.  
cd40: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62    ** the call ab
cd50: 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  ove. */.  }else 
cd60: 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  if( pCx->pCursor
cd70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
cd80: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
cd90: 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  pCx->pCursor);. 
cda0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
cdb0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
cdc0: 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70  BLE.  if( pCx->p
cdd0: 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20  VtabCursor ){.  
cde0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
cdf0: 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
ce00: 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43  or = pCx->pVtabC
ce10: 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74  ursor;.    const
ce20: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
ce30: 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62  *pModule = pVtab
ce40: 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 70  Cursor->pVtab->p
ce50: 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69  Module;.    p->i
ce60: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b  nVtabMethod = 1;
ce70: 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  .    pModule->xC
ce80: 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72  lose(pVtabCursor
ce90: 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  );.    p->inVtab
cea0: 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a  Method = 0;.  }.
ceb0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
cec0: 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20  Copy the values 
ced0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64  stored in the Vd
cee0: 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72  beFrame structur
cef0: 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54  e to its Vdbe. T
cf00: 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  his.** is used, 
cf10: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
cf20: 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d  n a trigger sub-
cf30: 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65  program is halte
cf40: 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20  d to restore.** 
cf50: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d  control to the m
cf60: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ain program..*/.
cf70: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
cf80: 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65  rameRestore(Vdbe
cf90: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a  Frame *pFrame){.
cfa0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61    Vdbe *v = pFra
cfb0: 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 6e 63  me->v;.  v->aOnc
cfc0: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
cfd0: 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  aOnceFlag;.  v->
cfe0: 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61  nOnceFlag = pFra
cff0: 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20  me->nOnceFlag;. 
d000: 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65   v->aOp = pFrame
d010: 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20  ->aOp;.  v->nOp 
d020: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20  = pFrame->nOp;. 
d030: 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d   v->aMem = pFram
d040: 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d  e->aMem;.  v->nM
d050: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65  em = pFrame->nMe
d060: 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20  m;.  v->apCsr = 
d070: 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20  pFrame->apCsr;. 
d080: 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46   v->nCursor = pF
d090: 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20  rame->nCursor;. 
d0a0: 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69   v->db->lastRowi
d0b0: 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  d = pFrame->last
d0c0: 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61  Rowid;.  v->nCha
d0d0: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  nge = pFrame->nC
d0e0: 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  hange;.  return 
d0f0: 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f  pFrame->pc;.}../
d100: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
d110: 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c  ursors..**.** Al
d120: 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64  so release any d
d130: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65  ynamic memory he
d140: 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20  ld by the VM in 
d150: 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65  the Vdbe.aMem me
d160: 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72  mory .** cell ar
d170: 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63  ray. This is nec
d180: 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65  essary as the me
d190: 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20  mory cell array 
d1a0: 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70  may contain.** p
d1b0: 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46  ointers to VdbeF
d1c0: 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68  rame objects, wh
d1d0: 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20  ich may in turn 
d1e0: 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
d1f0: 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73   to.** open curs
d200: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
d210: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
d220: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ors(Vdbe *p){.  
d230: 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b  if( p->pFrame ){
d240: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
d250: 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28  pFrame;.    for(
d260: 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
d270: 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
d280: 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
d290: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
d2a0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
d2b0: 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b  Restore(pFrame);
d2c0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65  .  }.  p->pFrame
d2d0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d   = 0;.  p->nFram
d2e0: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  e = 0;..  if( p-
d2f0: 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e  >apCsr ){.    in
d300: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
d310: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
d320: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65  i++){.      Vdbe
d330: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
d340: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20  apCsr[i];.      
d350: 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20  if( pC ){.      
d360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
d370: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
d380: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72          p->apCsr
d390: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
d3a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d3b0: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
d3c0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
d3d0: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e  &p->aMem[1], p->
d3e0: 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69  nMem);.  }.  whi
d3f0: 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  le( p->pDelFrame
d400: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
d410: 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65  e *pDel = p->pDe
d420: 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70  lFrame;.    p->p
d430: 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d  DelFrame = pDel-
d440: 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71  >pParent;.    sq
d450: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
d460: 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a  lete(pDel);.  }.
d470: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
d480: 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74   auxdata allocat
d490: 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65  ions made by the
d4a0: 20 56 4d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   VM */.  sqlite3
d4b0: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
d4c0: 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61  a(p, -1, 0);.  a
d4d0: 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61  ssert( p->pAuxDa
d4e0: 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ta==0 );.}../*.*
d4f0: 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56  * Clean up the V
d500: 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  M after executio
d510: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
d520: 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d  utine will autom
d530: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61  atically close a
d540: 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74  ny cursors, list
d550: 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72  s, and/or.** sor
d560: 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c  ters that were l
d570: 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c  eft open.  It al
d580: 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76  so deletes the v
d590: 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69  alues of.** vari
d5a0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61  ables in the aVa
d5b0: 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  r[] array..*/.st
d5c0: 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75  atic void Cleanu
d5d0: 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  p(Vdbe *p){.  sq
d5e0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
d5f0: 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b;..#ifdef SQLIT
d600: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65  E_DEBUG.  /* Exe
d610: 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74  cute assert() st
d620: 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
d630: 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65  re that the Vdbe
d640: 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20  .apCsr[] and .  
d650: 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61  ** Vdbe.aMem[] a
d660: 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61  rrays have alrea
d670: 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20  dy been cleaned 
d680: 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  up.  */.  int i;
d690: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20  .  if( p->apCsr 
d6a0: 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e  ) for(i=0; i<p->
d6b0: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73  nCursor; i++) as
d6c0: 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69  sert( p->apCsr[i
d6d0: 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  ]==0 );.  if( p-
d6e0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72  >aMem ){.    for
d6f0: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d  (i=1; i<=p->nMem
d700: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
d710: 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d  ->aMem[i].flags=
d720: 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29  =MEM_Undefined )
d730: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
d740: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d750: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
d760: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
d770: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
d780: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
d790: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
d7a0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
d7b0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
d7c0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
d7d0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
d7e0: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
d7f0: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
d800: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
d810: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
d820: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
d830: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
d840: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
d850: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
d860: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
d870: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
d880: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
d890: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
d8a0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
d8b0: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
d8c0: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
d8d0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
d8e0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
d8f0: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65  = p->db;..  rele
d900: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
d910: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
d920: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
d930: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
d940: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
d950: 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43  me);.  n = nResC
d960: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b  olumn*COLNAME_N;
d970: 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  .  p->nResColumn
d980: 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75   = (u16)nResColu
d990: 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d  mn;.  p->aColNam
d9a0: 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28  e = pColName = (
d9b0: 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
d9c0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
d9d0: 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
d9e0: 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
d9f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
da00: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
da10: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66  .    pColName->f
da20: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
da30: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64  .    pColName->d
da40: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70  b = p->db;.    p
da50: 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d  ColName++;.  }.}
da60: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
da70: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
da80: 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
da90: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
daa0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
dab0: 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
dac0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
dad0: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
dae0: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
daf0: 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
db00: 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
db10: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
db20: 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
db30: 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61  * The final para
db40: 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73  meter, xDel, mus
db50: 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49  t be one of SQLI
db60: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49  TE_DYNAMIC, SQLI
db70: 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20  TE_STATIC.** or 
db80: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
db90: 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54  . If it is SQLIT
dba0: 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  E_DYNAMIC, then 
dbb0: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
dbc0: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d  ed.** to by zNam
dbd0: 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  e will be freed 
dbe0: 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  by sqlite3DbFree
dbf0: 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
dc00: 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a   is destroyed..*
dc10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
dc20: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56  eSetColName(.  V
dc30: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f  /* Vdbe being co
dc60: 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e  nfigured */.  in
dc70: 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc90: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
dca0: 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20  n zName applies 
dcb0: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c  to */.  int var,
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
dce0: 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a  of the COLNAME_*
dcf0: 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20   constants */.  
dd00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
dd10: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
dd20: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
dd30: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
dd40: 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20   name */.  void 
dd50: 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20  (*xDel)(void*)  
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
dd70: 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
dd80: 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e   strategy for zN
dd90: 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ame */.){.  int 
dda0: 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  rc;.  Mem *pColN
ddb0: 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ame;.  assert( i
ddc0: 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  dx<p->nResColumn
ddd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61   );.  assert( va
dde0: 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20  r<COLNAME_N );. 
ddf0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
de00: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
de10: 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c  assert( !zName |
de20: 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44  | xDel!=SQLITE_D
de30: 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65  YNAMIC );.    re
de40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
de50: 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  M;.  }.  assert(
de60: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
de70: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
de80: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
de90: 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
dea0: 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
deb0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
dec0: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
ded0: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
dee0: 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
def0: 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
df00: 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
df10: 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
df20: 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
df30: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
df40: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
df50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
df60: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
df70: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
df80: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
df90: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
dfa0: 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
dfb0: 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
dfc0: 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
dfd0: 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
dfe0: 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
dff0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
e000: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
e010: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
e020: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e030: 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
e040: 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
e050: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
e060: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
e070: 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
e080: 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
e090: 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
e0a0: 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
e0b0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e-transaction */
e0c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e0d0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
e0e0: 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23  dXcommit = 0;..#
e0f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
e100: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
e110: 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70   /* With this op
e120: 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61  tion, sqlite3Vta
e130: 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e  bSync() is defin
e140: 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20  ed to be simply 
e150: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  .  ** SQLITE_OK 
e160: 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64  so p is not used
e170: 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  . .  */.  UNUSED
e180: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23  _PARAMETER(p);.#
e190: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f  endif..  /* Befo
e1a0: 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
e1b0: 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
e1c0: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
e1d0: 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
e1e0: 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
e1f0: 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
e200: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
e210: 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
e220: 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
e230: 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
e240: 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
e250: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
e260: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
e270: 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
e280: 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
e290: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
e2a0: 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
e2b0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
e2c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
e2d0: 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a  tabSync(db, p);.
e2e0: 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
e2f0: 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69  determines (a) i
e300: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  f the commit hoo
e310: 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  k should be invo
e320: 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29  ked and.  ** (b)
e330: 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61   how many databa
e340: 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70  se files have op
e350: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
e360: 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a  tions, not .  **
e370: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
e380: 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62  emp database. (b
e390: 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62  ) is important b
e3a0: 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74  ecause if more t
e3b0: 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61  han .  ** one da
e3c0: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
e3d0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
e3e0: 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73  ansaction, a mas
e3f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ter journal.  **
e400: 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
e410: 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20  d for an atomic 
e420: 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20  commit..  */ .  
e430: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
e440: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
e450: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
e460: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
e470: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
e480: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
e490: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
e4a0: 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f  ){.      needXco
e4b0: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
e4c0: 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e  if( i!=1 ) nTran
e4d0: 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s++;.      sqlit
e4e0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
e4f0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
e500: 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
e510: 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42  iveLock(sqlite3B
e520: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b  treePager(pBt));
e530: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
e540: 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20  reeLeave(pBt);. 
e550: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
e560: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e570: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e580: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e590: 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d  e are any write-
e5a0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20  transactions at 
e5b0: 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  all, invoke the 
e5c0: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20  commit hook */. 
e5d0: 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74   if( needXcommit
e5e0: 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43   && db->xCommitC
e5f0: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72  allback ){.    r
e600: 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
e610: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
e620: 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28  mitArg);.    if(
e630: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
e640: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
e650: 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b  RAINT_COMMITHOOK
e660: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
e670: 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73  * The simple cas
e680: 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  e - no more than
e690: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
e6a0: 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  le (not counting
e6b0: 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64   the.  ** TEMP d
e6c0: 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74  atabase) has a t
e6d0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
e6e0: 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  e.   There is no
e6f0: 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20   need for the.  
e700: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
e710: 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  l..  **.  ** If 
e720: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
e730: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
e740: 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73  GetFilename() is
e750: 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20   a zero length. 
e760: 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d   ** string, it m
e770: 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61  eans the main da
e780: 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72  tabase is :memor
e790: 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c  y: or a temp fil
e7a0: 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61  e.  In .  ** tha
e7b0: 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74  t case we do not
e7c0: 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20   support atomic 
e7d0: 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
e7e0: 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a  ts, so use the .
e7f0: 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65    ** simple case
e800: 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   then too..  */.
e810: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
e820: 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  Strlen30(sqlite3
e830: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
e840: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
e850: 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  ).   || nTrans<=
e860: 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  1.  ){.    for(i
e870: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
e880: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
e890: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
e8a0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
e8b0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
e8c0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
e8d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
e8e0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
e8f0: 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  e(pBt, 0);.     
e900: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
e910: 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f   Do the commit o
e920: 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62  nly if all datab
e930: 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  ases successfull
e940: 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65  y complete phase
e950: 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f   1. .    ** If o
e960: 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43  ne of the BtreeC
e970: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
e980: 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69  calls fails, thi
e990: 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20  s indicates an. 
e9a0: 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77     ** IO error w
e9b0: 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72  hile deleting or
e9c0: 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f   truncating a jo
e9d0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69  urnal file. It i
e9e0: 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20  s unlikely,.    
e9f0: 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70  ** but could hap
ea00: 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pen. In this cas
ea10: 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  e abandon proces
ea20: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
ea30: 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a  the error..    *
ea40: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
ea50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ea60: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
ea70: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
ea80: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
ea90: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
eaa0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
eab0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
eac0: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
ead0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
eae0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
eaf0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
eb00: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
eb10: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  mmit(db);.    }.
eb20: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
eb30: 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
eb40: 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
eb50: 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
eb60: 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
eb70: 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
eb80: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
eb90: 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
eba0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
ebb0: 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
ebc0: 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f  d atomicly..  */
ebd0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ebe0: 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c  OMIT_DISKIO.  el
ebf0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
ec00: 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e  vfs *pVfs = db->
ec10: 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65  pVfs;.    int ne
ec20: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
ec30: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
ec40: 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d  0;   /* File-nam
ec50: 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72  e for the master
ec60: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
ec70: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69  char const *zMai
ec80: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
ec90: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
eca0: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
ecb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
ecc0: 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a  e *pMaster = 0;.
ecd0: 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
ece0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b   0;.    int res;
ecf0: 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f  .    int retryCo
ed00: 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  unt = 0;.    int
ed10: 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20   nMainFile;..   
ed20: 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73   /* Select a mas
ed30: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
ed40: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61   name */.    nMa
ed50: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
ed60: 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69  Strlen30(zMainFi
ed70: 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  le);.    zMaster
ed80: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
ed90: 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58  f(db, "%s-mjXXXX
eda0: 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69  XX9XXz", zMainFi
edb0: 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61  le);.    if( zMa
edc0: 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  ster==0 ) return
edd0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ede0: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33     do {.      u3
edf0: 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20  2 iRandom;.     
ee00: 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20   if( retryCount 
ee10: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
ee20: 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b  etryCount>100 ){
ee30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ee40: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55  e3_log(SQLITE_FU
ee50: 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20  LL, "MJ delete: 
ee60: 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  %s", zMaster);. 
ee70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ee80: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
ee90: 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
eea0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
eeb0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
eec0: 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a  etryCount==1 ){.
eed0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
eee0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c  3_log(SQLITE_FUL
eef0: 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20  L, "MJ collide: 
ef00: 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  %s", zMaster);. 
ef10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ef20: 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e  .      retryCoun
ef30: 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t++;.      sqlit
ef40: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
ef50: 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26  zeof(iRandom), &
ef60: 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20  iRandom);.      
ef70: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
ef80: 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d  (13, &zMaster[nM
ef90: 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30  ainFile], "-mj%0
efa0: 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20  6X9%02X",.      
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efc0: 20 20 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f           (iRando
efd0: 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20  m>>8)&0xffffff, 
efe0: 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20  iRandom&0xff);. 
eff0: 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69       /* The anti
f000: 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72  penultimate char
f010: 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73  acter of the mas
f020: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
f030: 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62   must.      ** b
f040: 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e  e "9" to avoid n
f050: 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77  ame collisions w
f060: 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69  hen using 8+3 fi
f070: 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20  lenames. */.    
f080: 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65    assert( zMaste
f090: 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  r[sqlite3Strlen3
f0a0: 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27  0(zMaster)-3]=='
f0b0: 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  9' );.      sqli
f0c0: 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a  te3FileSuffix3(z
f0d0: 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65  MainFile, zMaste
f0e0: 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r);.      rc = s
f0f0: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
f100: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
f110: 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
f120: 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d  TS, &res);.    }
f130: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
f140: 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20  E_OK && res );. 
f150: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f160: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
f170: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
f180: 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20   journal. */.   
f190: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f1a0: 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73  sOpenMalloc(pVfs
f1b0: 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73  , zMaster, &pMas
f1c0: 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ter, .          
f1d0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
f1e0: 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
f1f0: 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
f200: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
f210: 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45  EXCLUSIVE|SQLITE
f220: 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
f230: 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b  RNAL, 0.      );
f240: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
f250: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
f270: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
f280: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
f290: 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  c;.    }. .    /
f2a0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65  * Write the name
f2b0: 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73   of each databas
f2c0: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72  e file in the tr
f2d0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74  ansaction into t
f2e0: 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61  he new.    ** ma
f2f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f300: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  e. If an error o
f310: 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
f320: 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  int close.    **
f330: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
f340: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
f350: 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64  ile. All the ind
f360: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
f370: 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69  files.    ** sti
f380: 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61  ll have 'null' a
f390: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
f3a0: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f  rnal pointer, so
f3b0: 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a   they will roll.
f3c0: 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65      ** back inde
f3d0: 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66  pendently if a f
f3e0: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20  ailure occurs.. 
f3f0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
f400: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
f410: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
f420: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
f430: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
f440: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
f450: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
f460: 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73         char cons
f470: 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74  t *zFile = sqlit
f480: 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61  e3BtreeGetJourna
f490: 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20  lname(pBt);.    
f4a0: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30      if( zFile==0
f4b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
f4c0: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f  ntinue;  /* Igno
f4d0: 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d  re TEMP and :mem
f4e0: 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a  ory: databases *
f4f0: 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
f500: 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c      assert( zFil
f510: 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  e[0]!=0 );.     
f520: 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63     if( !needSync
f530: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
f540: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42  eSyncDisabled(pB
f550: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
f560: 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
f570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f580: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
f590: 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69  ite(pMaster, zFi
f5a0: 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  le, sqlite3Strle
f5b0: 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66  n30(zFile)+1, of
f5c0: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f  fset);.        o
f5d0: 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33  ffset += sqlite3
f5e0: 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
f5f0: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  1;.        if( r
f600: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f610: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f620: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
f630: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
f640: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
f650: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
f660: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
f670: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f680: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
f690: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f6a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f6b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
f6c0: 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ync the master j
f6d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
f6e0: 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e  the IOCAP_SEQUEN
f6f0: 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20  TIAL device.    
f700: 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  ** flag is set t
f710: 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
f720: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
f730: 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20  if( needSync .  
f740: 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65     && 0==(sqlite
f750: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
f760: 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72  eristics(pMaster
f770: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
f780: 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20  EQUENTIAL).     
f790: 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
f7a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
f7b0: 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  c(pMaster, SQLIT
f7c0: 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a  E_SYNC_NORMAL)).
f7d0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
f7e0: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
f7f0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
f800: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
f810: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
f820: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f830: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
f840: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
f850: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
f860: 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65   /* Sync all the
f870: 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76   db files involv
f880: 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ed in the transa
f890: 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20  ction. The same 
f8a0: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73  call.    ** sets
f8b0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f8c0: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65  nal pointer in e
f8d0: 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  ach individual j
f8e0: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a  ournal. If.    *
f8f0: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
f900: 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64  s here, do not d
f910: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
f920: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
f930: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
f940: 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  the error occurs
f950: 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73   during the firs
f960: 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  t call to.    **
f970: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
f980: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74  mitPhaseOne(), t
f990: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63  hen there is a c
f9a0: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20  hance that the. 
f9b0: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
f9c0: 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62  rnal file will b
f9d0: 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20  e orphaned. But 
f9e0: 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65  we cannot delete
f9f0: 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63   it,.    ** in c
fa00: 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ase the master j
fa10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
fa20: 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
fa30: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
fa40: 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65    ** file before
fa50: 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63   the failure occ
fa60: 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  urred..    */.  
fa70: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
fa80: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
fa90: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
faa0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
fab0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
fac0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
fad0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
fae0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
faf0: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a  tPhaseOne(pBt, z
fb00: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Master);.      }
fb10: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
fb20: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
fb30: 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
fb40: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  rt( rc!=SQLITE_B
fb50: 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72  USY );.    if( r
fb60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
fb70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
fb80: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
fb90: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
fba0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
fbb0: 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   Delete the mast
fbc0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
fbd0: 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68   This commits th
fbe0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  e transaction. A
fbf0: 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fter.    ** doin
fc00: 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63  g this the direc
fc10: 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61  tory is synced a
fc20: 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20  gain before any 
fc30: 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a  individual.    *
fc40: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  * transaction fi
fc50: 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e  les are deleted.
fc60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
fc70: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
fc80: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
fc90: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  1);.    sqlite3D
fca0: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
fcb0: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
fcc0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20  = 0;.    if( rc 
fcd0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
fce0: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
fcf0: 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20  * All files and 
fd00: 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65  directories have
fd10: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
fd20: 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c  nced, so the fol
fd30: 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61  lowing.    ** ca
fd40: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
fd50: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
fd60: 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f  o() are only clo
fd70: 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20  sing files and. 
fd80: 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f     ** deleting o
fd90: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75  r truncating jou
fda0: 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68  rnals. If someth
fdb0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77  ing goes wrong w
fdc0: 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
fdd0: 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65   is happening we
fde0: 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61   don't really ca
fdf0: 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74  re. The integrit
fe00: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
fe10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
fe20: 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65  lready guarantee
fe30: 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61  d, but some stra
fe40: 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c  y 'cold' journal
fe50: 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20  s.    ** may be 
fe60: 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65  lying around. Re
fe70: 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
fe80: 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70   code won't help
fe90: 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f   matters..    */
fea0: 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
feb0: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
fec0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ();.    sqlite3B
fed0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
fee0: 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ();.    for(i=0;
fef0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
ff00: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
ff10: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
ff20: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
ff30: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
ff40: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
ff50: 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31  tPhaseTwo(pBt, 1
ff60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ff70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
ff80: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
ff90: 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
ffa0: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
ffb0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ..    sqlite3Vta
ffc0: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d  bCommit(db);.  }
ffd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
ffe0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
fff0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
10000 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
10010 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65  ite3.nVdbeActive
10020 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a   count variable.
10030 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e  ** matches the n
10040 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20  umber of vdbe's 
10050 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69  in the list sqli
10060 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61  te3.pVdbe that a
10070 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  re.** currently 
10080 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72  active. An asser
10090 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68  tion fails if th
100a0 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20  e two counts do 
100b0 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68  not match..** Th
100c0 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  is is an interna
100d0 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c  l self-check onl
100e0 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e  y - it is not an
100f0 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65   essential proce
10100 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a  ssing.** step..*
10110 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e  *.** This is a n
10120 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69  o-op if NDEBUG i
10130 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69  s defined..*/.#i
10140 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
10150 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63  tic void checkAc
10160 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69  tiveVdbeCnt(sqli
10170 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
10180 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d   *p;.  int cnt =
10190 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65   0;.  int nWrite
101a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61   = 0;.  int nRea
101b0 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d  d = 0;.  p = db-
101c0 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28  >pVdbe;.  while(
101d0 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71   p ){.    if( sq
101e0 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28  lite3_stmt_busy(
101f0 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70  (sqlite3_stmt*)p
10200 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  ) ){.      cnt++
10210 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
10220 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72  eadOnly==0 ) nWr
10230 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ite++;.      if(
10240 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
10250 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nRead++;.    }. 
10260 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
10270 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
10280 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74  nt==db->nVdbeAct
10290 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ive );.  assert(
102a0 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64   nWrite==db->nVd
102b0 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73  beWrite );.  ass
102c0 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e  ert( nRead==db->
102d0 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23  nVdbeRead );.}.#
102e0 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
102f0 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
10300 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
10310 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73   If the Vdbe pas
10320 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
10330 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64   argument opened
10340 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61   a statement-tra
10350 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f  nsaction,.** clo
10360 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d  se it now. Argum
10370 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20  ent eOp must be 
10380 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
10390 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20  _ROLLBACK or.** 
103a0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
103b0 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  E. If it is SAVE
103c0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
103d0 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65  then the stateme
103e0 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
103f0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
10400 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45  . If eOp is SAVE
10410 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
10420 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74  hen the .** stat
10430 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
10440 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
10450 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
10460 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
10470 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
10480 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
10490 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
104a0 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
104b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
104c0 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
104d0 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  nt(Vdbe *p, int 
104e0 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  eOp){.  sqlite3 
104f0 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64  *const db = p->d
10500 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  b;.  int rc = SQ
10510 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
10520 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20  f p->iStatement 
10530 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
10540 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
10550 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20  Vdbe opened a . 
10560 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72   ** statement tr
10570 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73  ansaction that s
10580 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
10590 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65  here. The only e
105a0 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  xception.  ** is
105b0 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f   that an IO erro
105c0 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72  r may have occur
105d0 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20  red, causing an 
105e0 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61  emergency rollba
105f0 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73  ck..  ** In this
10600 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74   case (db->nStat
10610 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74  ement==0), and t
10620 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
10630 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  to do..  */.  if
10640 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
10650 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   && p->iStatemen
10660 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
10670 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53      const int iS
10680 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53  avepoint = p->iS
10690 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20  tatement-1;..   
106a0 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41   assert( eOp==SA
106b0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
106c0 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49   || eOp==SAVEPOI
106d0 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20  NT_RELEASE);.   
106e0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74   assert( db->nSt
106f0 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20  atement>0 );.   
10700 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61   assert( p->iSta
10710 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74  tement==(db->nSt
10720 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76  atement+db->nSav
10730 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20  epoint) );..    
10740 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
10750 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
10760 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
10770 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65  E_OK;.      Btre
10780 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
10790 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
107a0 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
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 20 20 20 20 72 63 32 20 3d  .          rc2 =
107e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
107f0 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
10800 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
10810 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
10820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
10830 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  f( rc2==SQLITE_O
10840 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
10850 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
10860 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
10870 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
10880 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
10890 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
108a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
108b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
108c0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
108d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
108e0 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74   }.    db->nStat
108f0 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e  ement--;.    p->
10900 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
10910 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
10920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10930 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
10940 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
10950 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
10960 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
10970 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  (db, SAVEPOINT_R
10980 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f  OLLBACK, iSavepo
10990 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  int);.      }.  
109a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
109b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
109c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
109d0 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
109e0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
109f0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
10a00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
10a10 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
10a20 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
10a30 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  n is being rolle
10a40 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73  d back, also res
10a50 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  tore the .    **
10a60 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
10a70 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  s deferred const
10a80 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f  raint counter to
10a90 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61   the value it ha
10aa0 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d when .    ** t
10ab0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
10ac0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65  nsaction was ope
10ad0 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ned.  */.    if(
10ae0 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
10af0 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
10b00 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
10b10 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
10b20 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d  fCons;.      db-
10b30 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
10b40 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49  s = p->nStmtDefI
10b50 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  mmCons;.    }.  
10b60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
10b70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
10b80 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
10b90 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
10ba0 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  on opened by the
10bb0 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61   database .** ha
10bc0 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  ndle associated 
10bd0 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73  with the VM pass
10be0 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
10bf0 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  t is about to be
10c00 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20   .** committed. 
10c10 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
10c20 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65  standing deferre
10c30 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
10c40 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c  nstraint.** viol
10c50 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53  ations, return S
10c60 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68  QLITE_ERROR. Oth
10c70 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
10c80 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  K..**.** If ther
10c90 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
10ca0 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20  g FK violations 
10cb0 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
10cc0 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  n returns .** SQ
10cd0 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20  LITE_ERROR, set 
10ce0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
10cf0 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43  e VM to SQLITE_C
10d00 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
10d10 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74  NKEY.** and writ
10d20 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
10d30 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72  ge to it. Then r
10d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
10d50 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  OR..*/.#ifndef S
10d60 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
10d70 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74  GN_KEY.int sqlit
10d80 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64  e3VdbeCheckFk(Vd
10d90 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72  be *p, int defer
10da0 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  red){.  sqlite3 
10db0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
10dc0 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20  f( (deferred && 
10dd0 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f  (db->nDeferredCo
10de0 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  ns+db->nDeferred
10df0 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20  ImmCons)>0) .   
10e00 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26  || (!deferred &&
10e10 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
10e20 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  t>0) .  ){.    p
10e30 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ->rc = SQLITE_CO
10e40 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
10e50 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f  KEY;.    p->erro
10e60 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
10e70 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  rt;.    sqlite3S
10e80 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
10e90 72 4d 73 67 2c 20 64 62 2c 20 22 46 4f 52 45 49  rMsg, db, "FOREI
10ea0 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
10eb0 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20  t failed");.    
10ec0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
10ed0 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
10ee0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
10ef0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
10f00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
10f10 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56  led the when a V
10f20 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c  DBE tries to hal
10f30 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a  t.  If the VDBE.
10f40 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  ** has made chan
10f50 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75  ges and is in au
10f60 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74  tocommit mode, t
10f70 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65  hen commit those
10f80 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66  .** changes.  If
10f90 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e   a rollback is n
10fa0 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74  eeded, then do t
10fb0 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
10fc0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10fd0 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
10fe0 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74  to move the stat
10ff0 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a  e of a VM from.*
11000 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52  * SQLITE_MAGIC_R
11010 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  UN to SQLITE_MAG
11020 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20  IC_HALT.  It is 
11030 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63  harmless to.** c
11040 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d  all this on a VM
11050 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
11060 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
11070 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  T state..**.** R
11080 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
11090 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ode.  If the com
110a0 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f  mit could not co
110b0 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f  mplete because o
110c0 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  f.** lock conten
110d0 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c  tion, return SQL
110e0 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51  ITE_BUSY.  If SQ
110f0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
11100 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61  urned, it.** mea
11110 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64  ns the close did
11120 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20   not happen and 
11130 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65  needs to be repe
11140 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
11150 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62  ite3VdbeHalt(Vdb
11160 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11180 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
11190 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69   to store transi
111a0 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73  ent return codes
111b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
111c0 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
111d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
111e0 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69  ontains the logi
111f0 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  c that determine
11200 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  s if a statement
11210 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63   or.  ** transac
11220 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d  tion will be com
11230 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
11240 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
11250 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78  t of the.  ** ex
11260 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
11270 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
11280 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61   .  **.  ** If a
11290 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
112a0 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ing errors occur
112b0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
112c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a  SQLITE_NOMEM.  *
112d0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45  *     SQLITE_IOE
112e0 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  RR.  **     SQLI
112f0 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20  TE_FULL.  **    
11300 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
11310 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  T.  **.  ** Then
11320 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
11330 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  che might have b
11340 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69  een left in an i
11350 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a  nconsistent.  **
11360 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64   state.  We need
11370 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
11380 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
11390 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65  action, if there
113a0 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72   is.  ** one, or
113b0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72   the complete tr
113c0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
113d0 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65  re is no stateme
113e0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
113f0 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64    */..  if( p->d
11400 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11410 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
11420 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
11430 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46  .  if( p->aOnceF
11440 6c 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e  lag ) memset(p->
11450 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d  aOnceFlag, 0, p-
11460 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63  >nOnceFlag);.  c
11470 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
11480 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  );.  if( p->magi
11490 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
114a0 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
114b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
114c0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
114d0 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
114e0 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
114f0 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
11500 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
11510 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74   started or if t
11520 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  he.  ** SQL stat
11530 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72  ement does not r
11540 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64  ead or write a d
11550 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a  atabase file.  *
11560 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
11570 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72   && p->bIsReader
11580 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
11590 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
115a0 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
115b0 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  >rc */.    int e
115c0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b  StatementOp = 0;
115d0 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69  .    int isSpeci
115e0 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  alError;        
115f0 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
11600 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c  ue if a 'special
11610 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20  ' error */..    
11620 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
11630 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
11640 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
11650 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
11660 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
11670 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
11680 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
11690 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
116a0 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
116b0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
116c0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
116d0 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
116e0 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
11700 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
11710 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
11720 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
11730 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
11740 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  r ){.      /* If
11750 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
11760 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65  ead-only and the
11770 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
11780 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c  QLITE_INTERRUPT,
11790 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f   .      ** no ro
117a0 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73  llback is necess
117b0 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ary. Otherwise, 
117c0 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70  at least a savep
117d0 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
117e0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
117f0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  be rolled back t
11800 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
11810 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20  tabase to a .   
11820 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74     ** consistent
11830 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
11840 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69  .      ** Even i
11850 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
11860 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74  is read-only, it
11870 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
11880 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a   perform.      *
11890 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  * a statement or
118a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
118b0 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e  lback operation.
118c0 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20   If the error . 
118d0 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64       ** occurred
118e0 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
118f0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  o the journal, s
11900 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61  ub-journal or da
11910 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
11920 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  file as part of 
11930 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65  an effort to fre
11940 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65  e up cache space
11950 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20   (see function. 
11960 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72       ** pagerStr
11970 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63  ess() in pager.c
11980 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ), the rollback 
11990 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72  is required to r
119a0 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  estore .      **
119b0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20   the pager to a 
119c0 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
119d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
119e0 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
119f0 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
11a00 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
11a10 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d        if( (mrc==
11a20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
11a30 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
11a40 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  ) && p->usesStmt
11a50 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
11a60 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
11a70 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
11a80 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
11a90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
11aa0 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
11ab0 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
11ac0 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
11ad0 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
11ae0 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
11af0 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
11b00 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
11b10 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
11b20 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
11b30 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
11b40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11b50 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
11b60 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
11b70 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
11b80 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
11b90 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
11ba0 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
11bb0 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
11bc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11bd0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
11be0 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20  k for immediate 
11bf0 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c  foreign key viol
11c00 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69  ations. */.    i
11c10 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
11c20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
11c30 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
11c40 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  p, 0);.    }.  .
11c50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75      /* If the au
11c60 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
11c70 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69  s set and this i
11c80 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76  s the only activ
11c90 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a  e writer .    **
11ca0 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20   VM, then we do 
11cb0 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
11cc0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
11cd0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
11ce0 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
11cf0 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
11d00 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
11d10 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
11d20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
11d30 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
11d40 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65  bove has occurre
11d50 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
11d60 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49  f( !sqlite3VtabI
11d70 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20  nSync(db) .     
11d80 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  && db->autoCommi
11d90 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e  t .     && db->n
11da0 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72  VdbeWrite==(p->r
11db0 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20  eadOnly==0) .   
11dc0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
11dd0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
11de0 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  | (p->errorActio
11df0 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69  n==OE_Fail && !i
11e00 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29  sSpecialError) )
11e10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
11e20 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
11e30 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  k(p, 1);.       
11e40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11e50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
11e60 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61  if( NEVER(p->rea
11e70 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  dOnly) ){.      
11e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11e90 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
11ea0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
11eb0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
11ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11ed0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
11ee0 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
11ef0 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KEY;.        }el
11f00 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f  se{ .          /
11f10 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
11f20 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
11f30 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
11f40 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20   was successful 
11f50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
11f60 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
11f70 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  ' constraint and
11f80 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65   there are no de
11f90 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20  ferred foreign. 
11fa0 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20           ** key 
11fb0 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68  constraints to h
11fc0 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73  old up the trans
11fd0 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  action. This mea
11fe0 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20  ns a commit .   
11ff0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
12000 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
12010 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
12020 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  mit(db, p);.    
12030 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
12040 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
12050 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  Y && p->readOnly
12060 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
12070 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
12080 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
12090 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
120a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
120b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
120c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
120d0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
120e0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
120f0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
12100 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d  E_OK);.        }
12110 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
12120 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
12130 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
12140 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
12150 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  mCons = 0;.     
12160 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
12170 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46  = ~SQLITE_DeferF
12180 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Ks;.          sq
12190 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
121a0 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
121b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
121c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
121d0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
121e0 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
121f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12200 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d  db->nStatement =
12210 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
12220 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d  ( eStatementOp==
12230 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
12240 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12250 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  || p->errorActio
12260 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20  n==OE_Fail ){.  
12270 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
12280 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
12290 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65  ELEASE;.      }e
122a0 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72  lse if( p->error
122b0 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74  Action==OE_Abort
122c0 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
122d0 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
122e0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
122f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
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 65 53  .  .    /* If eS
12390 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f  tatementOp is no
123a0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73  n-zero, then a s
123b0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
123c0 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20  tion needs to.  
123d0 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65    ** be committe
123e0 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
123f0 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  . Call sqlite3Vd
12400 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
12410 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20  () to.    ** do 
12420 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72  so. If this oper
12430 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ation returns an
12440 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20   error, and the 
12450 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
12460 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63  t.    ** error c
12470 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b  ode is SQLITE_OK
12480 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   or SQLITE_CONST
12490 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d  RAINT, then prom
124a0 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ote the.    ** c
124b0 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
124c0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20   error code..   
124d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61   */.    if( eSta
124e0 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20  tementOp ){.    
124f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
12500 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
12510 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  (p, eStatementOp
12520 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
12530 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
12540 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12550 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d  || (p->rc&0xff)=
12560 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
12570 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NT ){.          
12580 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
12590 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
125a0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
125b0 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  sg);.          p
125c0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
125d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
125e0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
125f0 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
12600 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
12610 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
12620 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
12630 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
12640 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
12650 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12660 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
12670 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55  was an INSERT, U
12680 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
12690 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74  and no statement
126a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
126b0 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c   ** has been rol
126c0 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65  led back, update
126d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
126e0 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d  nnection change-
126f0 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
12700 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
12710 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20  geCntOn ){.     
12720 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
12730 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p!=SAVEPOINT_ROL
12740 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
12750 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
12760 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
12770 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65  hange);.      }e
12780 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
12790 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
127a0 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
127b0 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61   }.      p->nCha
127c0 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  nge = 0;.    }..
127d0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
127e0 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  he locks */.    
127f0 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
12800 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  (p);.  }..  /* W
12810 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
12820 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
12830 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
12840 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
12850 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
12860 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56  =0 ){.    db->nV
12870 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20  dbeActive--;.   
12880 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
12890 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  y ) db->nVdbeWri
128a0 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  te--;.    if( p-
128b0 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62 2d  >bIsReader ) db-
128c0 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20  >nVdbeRead--;.  
128d0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
128e0 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e  dbeActive>=db->n
128f0 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20  VdbeRead );.    
12900 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
12910 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65  eRead>=db->nVdbe
12920 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73  Write );.    ass
12930 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72  ert( db->nVdbeWr
12940 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  ite>=0 );.  }.  
12950 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
12960 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68  MAGIC_HALT;.  ch
12970 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
12980 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  (db);.  if( p->d
12990 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
129a0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
129b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
129c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75  ..  /* If the au
129d0 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
129e0 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74  s set to true, t
129f0 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68  hen any locks th
12a00 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a  at were held.  *
12a10 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * by connection 
12a20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  db have now been
12a30 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20   released. Call 
12a40 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
12a50 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a  nUnlocked() .  *
12a60 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20  * to invoke any 
12a70 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d  required unlock-
12a80 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
12a90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
12aa0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
12ab0 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
12ac0 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29  tionUnlocked(db)
12ad0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
12ae0 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
12af0 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  >0 || db->autoCo
12b00 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
12b10 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a  Statement==0 );.
12b20 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d    return (p->rc=
12b30 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53  =SQLITE_BUSY ? S
12b40 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c  QLITE_BUSY : SQL
12b50 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ITE_OK);.}.../*.
12b60 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
12b70 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
12b80 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
12b90 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
12ba0 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
12bb0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
12bc0 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
12bd0 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
12be0 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
12bf0 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
12c00 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
12c10 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
12c20 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
12c30 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f  opy the error co
12c40 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
12c50 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  sage belonging t
12c60 6f 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65  o the VDBE passe
12c70 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
12c80 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74  t argument to it
12c90 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  s database handl
12ca0 65 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20  e (so that they 
12cb0 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75  will be .** retu
12cc0 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  rned by calls to
12cd0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
12ce0 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65  () and sqlite3_e
12cf0 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  rrmsg())..**.** 
12d00 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
12d10 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65  es not clear the
12d20 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65   VDBE error code
12d30 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73   or message, jus
12d40 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d  t.** copies them
12d50 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
12d60 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
12d70 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73  sqlite3VdbeTrans
12d80 66 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70  ferError(Vdbe *p
12d90 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
12da0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
12db0 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66  rc = p->rc;.  if
12dc0 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
12dd0 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69      u8 mallocFai
12de0 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63  led = db->malloc
12df0 46 61 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69  Failed;.    sqli
12e00 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
12e10 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20  lloc();.    if( 
12e20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62  db->pErr==0 ) db
12e30 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33  ->pErr = sqlite3
12e40 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20  ValueNew(db);.  
12e50 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
12e60 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
12e70 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53  1, p->zErrMsg, S
12e80 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
12e90 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
12ea0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
12eb0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
12ec0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12ed0 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  d = mallocFailed
12ee0 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64  ;.    db->errCod
12ef0 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b  e = rc;.  }else{
12f00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12f10 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  r(db, rc);.  }. 
12f20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
12f30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
12f40 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a  BLE_SQLLOG./*.**
12f50 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f   If an SQLITE_CO
12f60 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b  NFIG_SQLLOG hook
12f70 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61   is registered a
12f80 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65  nd the VM has be
12f90 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f  en run, .** invo
12fa0 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ke it..*/.static
12fb0 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65   void vdbeInvoke
12fc0 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b  Sqllog(Vdbe *v){
12fd0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
12fe0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
12ff0 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c  og && v->rc==SQL
13000 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71  ITE_OK && v->zSq
13010 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b  l && v->pc>=0 ){
13020 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61  .    char *zExpa
13030 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64  nded = sqlite3Vd
13040 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76  beExpandSql(v, v
13050 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73  ->zSql);.    ass
13060 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74  ert( v->db->init
13070 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20  .busy==0 );.    
13080 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b  if( zExpanded ){
13090 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
130a0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
130b0 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20 73 71  og(.          sq
130c0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
130d0 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d  g.pSqllogArg, v-
130e0 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20  >db, zExpanded, 
130f0 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  1.      );.     
13100 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
13110 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29  ->db, zExpanded)
13120 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
13130 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62  lse.# define vdb
13140 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29  eInvokeSqllog(x)
13150 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
13160 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
13170 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
13180 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
13190 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
131a0 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
131b0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
131c0 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
131d0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
131e0 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
131f0 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
13200 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
13210 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
13220 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
13230 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
13240 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
13250 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
13260 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
13270 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
13280 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
13290 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
132a0 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
132b0 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
132c0 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
132d0 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
132e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
132f0 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
13300 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
13310 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
13320 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
13330 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
13340 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
13350 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
13360 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
13370 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
13380 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
13390 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
133a0 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73  it now..  */.  s
133b0 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
133c0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
133d0 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20  VDBE has be run 
133e0 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20  even partially, 
133f0 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
13400 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  e error code.  *
13410 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  * and error mess
13420 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42  age from the VDB
13430 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  E into the main 
13440 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
13450 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66  re.  But.  ** if
13460 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75   the VDBE has ju
13470 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72  st been set to r
13480 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61  un but has not a
13490 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64  ctually executed
134a0 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75   any.  ** instru
134b0 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76  ctions yet, leav
134c0 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
134d0 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  ase error inform
134e0 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
134f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
13500 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65  c>=0 ){.    vdbe
13510 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b  InvokeSqllog(p);
13520 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13530 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29  TransferError(p)
13540 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
13550 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
13560 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
13570 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Msg = 0;.    if(
13580 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
13590 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31  ) p->expired = 1
135a0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
135b0 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65  >rc && p->expire
135c0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
135d0 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73  expired flag was
135e0 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45   set on the VDBE
135f0 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
13600 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
13610 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
13620 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79   For consistency
13630 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f   (since sqlite3_
13640 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a  step() was.    *
13650 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74  * called), set t
13660 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  he database erro
13670 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  r in this case a
13680 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  s well..    */. 
13690 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
136a0 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63  ithMsg(db, p->rc
136b0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22  , p->zErrMsg ? "
136c0 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72  %s" : 0, p->zErr
136d0 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
136e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
136f0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
13700 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
13710 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61  ..  /* Reclaim a
13720 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ll memory used b
13730 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a  y the VDBE.  */.
13740 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20    Cleanup(p);.. 
13750 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69   /* Save profili
13760 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
13770 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75  rom this VDBE ru
13780 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56  n..  */.#ifdef V
13790 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
137a0 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
137b0 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
137c0 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
137d0 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
137e0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
137f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
13800 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
13810 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
13820 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13830 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
13840 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
13850 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
13860 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
13870 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
13880 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20  if( p->zSql ){. 
13890 20 20 20 20 20 20 20 63 68 61 72 20 63 2c 20 70         char c, p
138a0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  c = 0;.        f
138b0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
138c0 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ");.        for(
138d0 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71  i=0; (c = p->zSq
138e0 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  l[i])!=0; i++){.
138f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63            if( pc
13900 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66  =='\n' ) fprintf
13910 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20  (out, "-- ");.  
13920 20 20 20 20 20 20 20 20 70 75 74 63 28 63 2c 20          putc(c, 
13930 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
13940 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  pc = c;.        
13950 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  }.        if( pc
13960 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66  !='\n' ) fprintf
13970 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
13980 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
13990 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
139a0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
139b0 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20   zHdr[100];.    
139c0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
139d0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72  intf(sizeof(zHdr
139e0 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31  ), zHdr, "%6u %1
139f0 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20  2llu %8llu ",.  
13a00 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
13a10 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20  i].cnt,.        
13a20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
13a30 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  les,.           
13a40 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20  p->aOp[i].cnt>0 
13a50 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c  ? p->aOp[i].cycl
13a60 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74  es/p->aOp[i].cnt
13a70 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a   : 0.        );.
13a80 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
13a90 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29  out, "%s", zHdr)
13aa0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13ab0 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74  3VdbePrintOp(out
13ac0 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
13ad0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13ae0 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20  fclose(out);.   
13af0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
13b00 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20  p->iCurrentTime 
13b10 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  = 0;.  p->magic 
13b20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  = VDBE_MAGIC_INI
13b30 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72  T;.  return p->r
13b40 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  c & db->errMask;
13b50 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  .}. ./*.** Clean
13b60 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61   up and delete a
13b70 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
13b80 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61  ution.  Return a
13b90 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
13ba0 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  is.** the result
13bb0 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e   code.  Write an
13bc0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  y error message 
13bd0 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72  text into *pzErr
13be0 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
13bf0 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  te3VdbeFinalize(
13c00 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
13c10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13c20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
13c30 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c  VDBE_MAGIC_RUN |
13c40 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
13c50 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20  _MAGIC_HALT ){. 
13c60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
13c70 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20  dbeReset(p);.   
13c80 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70   assert( (rc & p
13c90 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d  ->db->errMask)==
13ca0 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rc );.  }.  sqli
13cb0 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29  te3VdbeDelete(p)
13cc0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13cd0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ../*.** If param
13ce0 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73  eter iOp is less
13cf0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
13d00 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74   invoke the dest
13d10 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c  ructor for.** al
13d20 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  l auxiliary data
13d30 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e   pointers curren
13d40 74 6c 79 20 63 61 63 68 65 64 20 62 79 20 74 68  tly cached by th
13d50 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a  e VM passed as.*
13d60 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  * the first argu
13d70 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ment..**.** Or, 
13d80 69 66 20 69 4f 70 20 69 73 20 67 72 65 61 74 65  if iOp is greate
13d90 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
13da0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
13db0 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a  e destructor is.
13dc0 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20  ** only invoked 
13dd0 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69  for those auxili
13de0 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72  ary data pointer
13df0 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  s created by the
13e00 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69   user .** functi
13e10 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  on invoked by th
13e20 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70  e OP_Function op
13e30 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63 74  code at instruct
13e40 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56  ion iOp of .** V
13e50 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c  M pVdbe, and onl
13e60 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a  y then if:.**.**
13e70 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69      * the associ
13e80 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61  ated function pa
13e90 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 33  rameter is the 3
13ea0 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f  2nd or later (co
13eb0 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66  unting.**      f
13ec0 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
13ed0 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20  t), or.**.**    
13ee0 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  * the correspond
13ef0 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d  ing bit in argum
13f00 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61  ent mask is clea
13f10 72 20 28 77 68 65 72 65 20 74 68 65 20 66 69 72  r (where the fir
13f20 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74  st.**      funct
13f30 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f  ion parameter co
13f40 72 72 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20  rrsponds to bit 
13f50 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64  0 etc.)..*/.void
13f60 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
13f70 74 65 41 75 78 44 61 74 61 28 56 64 62 65 20 2a  teAuxData(Vdbe *
13f80 70 56 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20  pVdbe, int iOp, 
13f90 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78  int mask){.  Aux
13fa0 44 61 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64  Data **pp = &pVd
13fb0 62 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20  be->pAuxData;.  
13fc0 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20  while( *pp ){.  
13fd0 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20    AuxData *pAux 
13fe0 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28  = *pp;.    if( (
13ff0 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28  iOp<0).     || (
14000 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26  pAux->iOp==iOp &
14010 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31  & (pAux->iArg>31
14020 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53   || !(mask & MAS
14030 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72  KBIT32(pAux->iAr
14040 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  g)))).    ){.   
14050 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75     testcase( pAu
14060 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20  x->iArg==31 );. 
14070 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78       if( pAux->x
14080 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
14090 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28    pAux->xDelete(
140a0 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
140b0 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d     }.      *pp =
140c0 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20   pAux->pNext;.  
140d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
140e0 65 28 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75  e(pVdbe->db, pAu
140f0 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
14100 20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e       pp= &pAux->
14110 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
14120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
14130 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
14140 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
14150 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
14160 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
14170 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20  ,.** except for 
14180 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77  object itself, w
14190 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65  hich is preserve
141a0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  d..**.** The dif
141b0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
141c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
141d0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
141e0 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a  ete() is that.**
141f0 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c   VdbeDelete() al
14200 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56  so unlinks the V
14210 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  dbe from the lis
14220 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61  t of VMs associa
14230 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
14240 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
14250 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68  ion and frees th
14260 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e  e object itself.
14270 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14280 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
14290 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
142a0 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67  e *p){.  SubProg
142b0 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78  ram *pSub, *pNex
142c0 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  t;.  int i;.  as
142d0 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c  sert( p->db==0 |
142e0 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20  | p->db==db );. 
142f0 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
14300 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61  (p->aVar, p->nVa
14310 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  r);.  releaseMem
14320 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
14330 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
14340 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66  *COLNAME_N);.  f
14350 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67  or(pSub=p->pProg
14360 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ram; pSub; pSub=
14370 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
14380 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b  t = pSub->pNext;
14390 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41  .    vdbeFreeOpA
143a0 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61  rray(db, pSub->a
143b0 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a  Op, pSub->nOp);.
143c0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
143d0 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d  e(db, pSub);.  }
143e0 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61  .  for(i=p->nzVa
143f0 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20  r-1; i>=0; i--) 
14400 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14410 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a  , p->azVar[i]);.
14420 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
14430 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d  y(db, p->aOp, p-
14440 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  >nOp);.  sqlite3
14450 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
14460 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  olName);.  sqlit
14470 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
14480 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
14490 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46  DbFree(db, p->pF
144a0 72 65 65 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  ree);.#if define
144b0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
144c0 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20  TREE_EXPLAIN).  
144d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
144e0 2c 20 70 2d 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a  , p->zExplain);.
144f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
14500 64 62 2c 20 70 2d 3e 70 45 78 70 6c 61 69 6e 29  db, p->pExplain)
14510 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
14520 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
14530 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64  re VDBE..*/.void
14540 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
14550 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  te(Vdbe *p){.  s
14560 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
14570 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
14580 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
14590 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
145a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
145b0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
145c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
145d0 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70  learObject(db, p
145e0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
145f0 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
14600 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
14610 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
14620 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56    assert( db->pV
14630 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62  dbe==p );.    db
14640 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65  ->pVdbe = p->pNe
14650 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
14660 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
14670 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
14680 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
14690 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
146a0 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d  MAGIC_DEAD;.  p-
146b0 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >db = 0;.  sqlit
146c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
146d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75  .}../*.** The cu
146e0 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20 70  rsor "p" has a p
146f0 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72  ending seek oper
14700 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e  ation that has n
14710 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63  ot yet been.** c
14720 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65  arried out.  See
14730 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77  k the cursor now
14740 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  .  If an error o
14750 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a  ccurs, return.**
14760 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
14770 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
14780 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
14790 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c  E_NOINLINE handl
147a0 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28  eDeferredMoveto(
147b0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
147c0 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23    int res, rc;.#
147d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
147e0 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  T.  extern int s
147f0 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
14800 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  unt;.#endif.  as
14810 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65  sert( p->deferre
14820 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73  dMoveto );.  ass
14830 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20  ert( p->isTable 
14840 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
14850 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
14860 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  cked(p->pCursor,
14870 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72   0, p->movetoTar
14880 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  get, 0, &res);. 
14890 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
148a0 20 72 63 3b 0a 20 20 70 2d 3e 6c 61 73 74 52 6f   rc;.  p->lastRo
148b0 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54  wid = p->movetoT
148c0 61 72 67 65 74 3b 0a 20 20 69 66 28 20 72 65 73  arget;.  if( res
148d0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=0 ) return SQL
148e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
148f0 3b 0a 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61  ;.  p->rowidIsVa
14900 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  lid = 1;.#ifdef 
14910 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
14920 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
14930 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  nt++;.#endif.  p
14940 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
14950 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
14960 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
14970 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53  TALE;.  return S
14980 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
14990 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73  ** Something has
149a0 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70   moved cursor "p
149b0 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20  " out of place. 
149c0 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20 69   Maybe the row i
149d0 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64  t was.** pointed
149e0 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20   to was deleted 
149f0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69  out from under i
14a00 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65  t.  Or maybe the
14a10 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65   btree was.** re
14a20 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65  balanced.  Whate
14a30 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20 74  ver the cause, t
14a40 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70  ry to restore "p
14a50 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69  " to the place i
14a60 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 20  t.** is suppose 
14a70 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20  to be pointing. 
14a80 20 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20   If the row was 
14a90 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
14aa0 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75   under the.** cu
14ab0 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75  rsor, set the cu
14ac0 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
14ad0 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a   a NULL row..*/.
14ae0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
14af0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c  E_NOINLINE handl
14b00 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62  eMovedCursor(Vdb
14b10 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
14b20 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f  nt isDifferentRo
14b30 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  w, rc;.  assert(
14b40 20 70 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29   p->pCursor!=0 )
14b50 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
14b60 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
14b70 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f  sMoved(p->pCurso
14b80 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r) );.  rc = sql
14b90 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52  ite3BtreeCursorR
14ba0 65 73 74 6f 72 65 28 70 2d 3e 70 43 75 72 73 6f  estore(p->pCurso
14bb0 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52  r, &isDifferentR
14bc0 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53  ow);.  p->cacheS
14bd0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
14be0 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66  ALE;.  if( isDif
14bf0 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e  ferentRow ) p->n
14c00 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65  ullRow = 1;.  re
14c10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14c20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
14c30 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64  cursor p is read
14c40 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  y to read or wri
14c50 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68  te the row to wh
14c60 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61  ich it.** was la
14c70 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20  st positioned.  
14c80 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
14c90 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66  code if an OOM f
14ca0 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f  ault or I/O erro
14cb0 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73  r.** prevents us
14cc0 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e   from positionin
14cd0 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
14ce0 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69  its correct posi
14cf0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
14d00 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f   MoveTo operatio
14d10 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20  n is pending on 
14d20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
14d30 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a  , then do that.*
14d40 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49  * MoveTo now.  I
14d50 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e  f no move is pen
14d60 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73  ding, check to s
14d70 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61  ee if the row ha
14d80 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65  s been.** delete
14d90 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
14da0 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20   the cursor and 
14db0 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20  if it has, mark 
14dc0 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20  the row as.** a 
14dd0 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20  NULL row..**.** 
14de0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
14df0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
14e00 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  g to the correct
14e10 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f   row and that ro
14e20 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65  w has.** not bee
14e30 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
14e40 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
14e50 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72  sor, then this r
14e60 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
14e70 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
14e80 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
14e90 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  o(VdbeCursor *p)
14ea0 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72  {.  if( p->defer
14eb0 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20  redMoveto ){.   
14ec0 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65   return handleDe
14ed0 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b  ferredMoveto(p);
14ee0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
14ef0 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
14f00 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  Moved(p->pCursor
14f10 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
14f20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
14f30 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  r(p);.  }.  retu
14f40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14f50 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
14f60 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  wing functions:.
14f70 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  **.** sqlite3Vdb
14f80 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a  eSerialType().**
14f90 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
14fa0 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73  alTypeLen().** s
14fb0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14fc0 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
14fd0 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a  VdbeSerialPut().
14fe0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
14ff0 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20  rialGet().**.** 
15000 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20  encapsulate the 
15010 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c  code that serial
15020 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20  izes values for 
15030 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74  storage in SQLit
15040 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e  e.** data and in
15050 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63  dex records. Eac
15060 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c  h serialized val
15070 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ue consists of a
15080 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65  .** 'serial-type
15090 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20  ' and a blob of 
150a0 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c  data. The serial
150b0 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79   type is an 8-by
150c0 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69  te unsigned.** i
150d0 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61  nteger, stored a
150e0 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a  s a varint..**.*
150f0 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69  * In an SQLite i
15100 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65  ndex record, the
15110 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
15120 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20  stored directly 
15130 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c  before.** the bl
15140 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ob of data that 
15150 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  it corresponds t
15160 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65  o. In a table re
15170 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c  cord, all serial
15180 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74  .** types are st
15190 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72  ored at the star
151a0 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c  t of the record,
151b0 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f   and the blobs o
151c0 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65  f data at.** the
151d0 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73   end. Hence thes
151e0 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f  e functions allo
151f0 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  w the caller to 
15200 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65  handle the.** se
15210 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61  rial-type and da
15220 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65  ta blob separate
15230 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ly..**.** The fo
15240 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
15250 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69  scribes the vari
15260 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73  ous storage clas
15270 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a  ses for data:.**
15280 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70  .**   serial typ
15290 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f  e        bytes o
152a0 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65  f data      type
152b0 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
152c0 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
152d0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
152e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
152f0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
15300 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
15310 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20         NULL.**  
15320 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
15330 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
15340 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
15350 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20  teger.**      2 
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15370 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
15380 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
15390 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20  **      3       
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20                3 
153b0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
153c0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
153d0 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20    4             
153e0 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20          4       
153f0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
15400 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20  ger.**      5   
15410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15420 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73    6            s
15430 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
15440 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
15450 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
15460 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
15470 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
15480 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
15490 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
154a0 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a     IEEE float.**
154b0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
154c0 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
154d0 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
154e0 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20   constant 0.**  
154f0 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20      9           
15500 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
15510 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
15520 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20  onstant 1.**    
15530 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20   10,11          
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15550 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f       reserved fo
15560 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20  r expansion.**  
15570 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e    N>=12 and even
15580 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20         (N-12)/2 
15590 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20         BLOB.**  
155a0 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20    N>=13 and odd 
155b0 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20         (N-13)/2 
155c0 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a         text.**.*
155d0 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79  * The 8 and 9 ty
155e0 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69  pes were added i
155f0 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f  n 3.3.0, file fo
15600 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76  rmat 4.  Prior v
15610 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  ersions.** of SQ
15620 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e  Lite will not un
15630 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73  derstand those s
15640 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a  erial types..*/.
15650 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
15660 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f  e serial-type fo
15670 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
15680 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75  ed in pMem..*/.u
15690 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
156a0 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d  rialType(Mem *pM
156b0 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  em, int file_for
156c0 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67  mat){.  int flag
156d0 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b  s = pMem->flags;
156e0 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 69 66 28  .  u32 n;..  if(
156f0 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20   flags&MEM_Null 
15700 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
15710 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
15720 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20  &MEM_Int ){.    
15730 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
15740 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20  ether to use 1, 
15750 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74  2, 4, 6 or 8 byt
15760 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e  es. */.#   defin
15770 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28  e MAX_6BYTE ((((
15780 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c  i64)0x00008000)<
15790 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20  <32)-1).    i64 
157a0 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  i = pMem->u.i;. 
157b0 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66     u64 u;.    if
157c0 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  ( i<0 ){.      i
157d0 66 28 20 69 3c 28 2d 4d 41 58 5f 36 42 59 54 45  f( i<(-MAX_6BYTE
157e0 29 20 29 20 72 65 74 75 72 6e 20 36 3b 0a 20 20  ) ) return 6;.  
157f0 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
15800 74 65 73 74 20 70 72 65 76 65 6e 74 73 3a 20 20  test prevents:  
15810 75 20 3d 20 2d 28 2d 39 32 32 33 33 37 32 30 33  u = -(-922337203
15820 36 38 35 34 37 37 35 38 30 38 29 20 2a 2f 0a 20  6854775808) */. 
15830 20 20 20 20 20 75 20 3d 20 2d 69 3b 0a 20 20 20       u = -i;.   
15840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20   }else{.      u 
15850 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = i;.    }.    i
15860 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20  f( u<=127 ){.   
15870 20 20 20 72 65 74 75 72 6e 20 28 28 69 26 31 29     return ((i&1)
15880 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d  ==i && file_form
15890 61 74 3e 3d 34 29 20 3f 20 38 2b 28 75 33 32 29  at>=4) ? 8+(u32)
158a0 75 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  u : 1;.    }.   
158b0 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20   if( u<=32767 ) 
158c0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
158d0 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72  ( u<=8388607 ) r
158e0 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28  eturn 3;.    if(
158f0 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   u<=2147483647 )
15900 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69   return 4;.    i
15910 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20  f( u<=MAX_6BYTE 
15920 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20  ) return 5;.    
15930 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20  return 6;.  }.  
15940 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65  if( flags&MEM_Re
15950 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  al ){.    return
15960 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   7;.  }.  assert
15970 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c  ( pMem->db->mall
15980 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67  ocFailed || flag
15990 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  s&(MEM_Str|MEM_B
159a0 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74  lob) );.  assert
159b0 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a  ( pMem->n>=0 );.
159c0 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d    n = (u32)pMem-
159d0 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  >n;.  if( flags 
159e0 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
159f0 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e    n += pMem->u.n
15a00 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Zero;.  }.  retu
15a10 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b  rn ((n*2) + 12 +
15a20 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72   ((flags&MEM_Str
15a30 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )!=0));.}../*.**
15a40 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
15a50 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63  th of the data c
15a60 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
15a70 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72  the supplied ser
15a80 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32  ial-type..*/.u32
15a90 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
15aa0 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65  alTypeLen(u32 se
15ab0 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66  rial_type){.  if
15ac0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
15ad0 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
15ae0 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
15af0 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /2;.  }else{.   
15b00 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
15b10 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20   aSize[] = { 0, 
15b20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38  1, 2, 3, 4, 6, 8
15b30 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 8, 0, 0, 0, 0 
15b40 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53  };.    return aS
15b50 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  ize[serial_type]
15b60 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
15b70 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
15b80 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
15b90 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
15ba0 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
15bb0 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
15bc0 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
15bd0 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
15be0 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
15bf0 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
15c00 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
15c10 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
15c20 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
15c30 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
15c40 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
15c50 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
15c60 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
15c70 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
15c80 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
15c90 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
15ca0 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
15cb0 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
15cc0 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
15cd0 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
15ce0 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
15cf0 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
15d00 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
15d10 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
15d20 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
15d30 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
15d40 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
15d50 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
15d60 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
15d70 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
15d80 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
15d90 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
15da0 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
15db0 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
15dc0 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
15dd0 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
15de0 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
15df0 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
15e00 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
15e10 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
15e20 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
15e30 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
15e40 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
15e50 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
15e60 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
15e70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
15e80 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
15e90 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
15ea0 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
15eb0 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
15ec0 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
15ed0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
15ee0 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
15ef0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
15f00 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
15f10 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30  t..**.** (2007-0
15f20 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e  8-30)  Frank van
15f30 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65   Vugt has studie
15f40 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63  d this problem c
15f50 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61  losely.** and ha
15f60 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69  s send his findi
15f70 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ngs to the SQLit
15f80 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46  e developers.  F
15f90 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74  rank.** writes t
15fa0 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b  hat some Linux k
15fb0 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f  ernels offer flo
15fc0 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64  ating point hard
15fd0 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f  ware.** emulatio
15fe0 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
15ff0 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61   32-bit mantissa
16000 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  s instead of a f
16010 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20  ull .** 48-bits 
16020 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
16030 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64  he IEEE standard
16040 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a  .  (This is the.
16050 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41  ** CONFIG_FPE_FA
16060 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20  STFPE option.)  
16070 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c  On such systems,
16080 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
16090 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ** byte swapping
160a0 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f   becomes very co
160b0 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61  mplicated.  To a
160c0 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a  void problems,.*
160d0 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  * the necessary 
160e0 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73  byte swapping is
160f0 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69   carried out usi
16100 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ng a 64-bit inte
16110 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ger.** rather th
16120 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  an a 64-bit floa
16130 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65  t.  Frank assure
16140 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f  s us that the co
16150 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73  de here.** works
16160 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74   for him.  We, t
16170 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68  he developers, h
16180 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e  ave no way to in
16190 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76  dependently.** v
161a0 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20  erify this, but 
161b0 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b  Frank seems to k
161c0 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74  now what he is t
161d0 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20  alking about.** 
161e0 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e  so we trust him.
161f0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
16200 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
16210 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
16220 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28  c u64 floatSwap(
16230 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  u64 in){.  union
16240 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20   {.    u64 r;.  
16250 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
16260 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
16270 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
16280 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
16290 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
162a0 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
162b0 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
162c0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
162d0 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
162e0 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
162f0 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
16300 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
16310 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
16320 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
16330 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
16340 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
16350 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
16360 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
16370 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
16380 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
16390 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
163a0 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
163b0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
163c0 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
163d0 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
163e0 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
163f0 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
16400 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
16410 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f  esponsible.** fo
16420 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f  r allocating eno
16430 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 66  ugh space to buf
16440 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  [] to hold the e
16450 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63  ntire field, exc
16460 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65  lusive.** of the
16470 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62   pMem->u.nZero b
16480 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a  ytes for a MEM_Z
16490 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
164a0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
164b0 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
164c0 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
164d0 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
164e0 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
164f0 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
16500 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
16510 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
16520 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
16530 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
16540 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
16550 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  uf[]..*/ .u32 sq
16560 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
16570 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20  ut(u8 *buf, Mem 
16580 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61  *pMem, u32 seria
16590 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c  l_type){.  u32 l
165a0 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
165b0 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
165c0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
165d0 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
165e0 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
165f0 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
16600 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
16610 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
16620 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
16630 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20  sizeof(pMem->r) 
16640 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
16650 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69  &v, &pMem->r, si
16660 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20  zeof(v));.      
16670 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
16680 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c  loat(v);.    }el
16690 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d  se{.      v = pM
166a0 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20  em->u.i;.    }. 
166b0 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c     len = i = sql
166c0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
166d0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
166e0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
166f0 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20  i>0 );.    do{. 
16700 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20       buf[--i] = 
16710 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20  (u8)(v&0xFF);.  
16720 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20      v >>= 8;.   
16730 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20   }while( i );.  
16740 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
16750 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f  }..  /* String o
16760 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20  r blob */.  if( 
16770 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
16780 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16790 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d  Mem->n + ((pMem-
167a0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
167b0 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  o)?pMem->u.nZero
167c0 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0).            
167d0 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33   == (int)sqlite3
167e0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
167f0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29  n(serial_type) )
16800 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d  ;.    len = pMem
16810 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ->n;.    memcpy(
16820 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65  buf, pMem->z, le
16830 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c  n);.    return l
16840 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55  en;.  }..  /* NU
16850 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  LL or constants 
16860 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75  0 or 1 */.  retu
16870 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75  rn 0;.}../* Inpu
16880 74 20 22 78 22 20 69 73 20 61 20 73 65 71 75 65  t "x" is a seque
16890 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20  nce of unsigned 
168a0 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
168b0 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62  represent a.** b
168c0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
168d0 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 65  r.  Return the e
168e0 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65  quivalent native
168f0 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66   integer.*/.#def
16900 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  ine ONE_BYTE_INT
16910 28 78 29 20 20 20 20 28 28 69 38 29 28 78 29 5b  (x)    ((i8)(x)[
16920 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f  0]).#define TWO_
16930 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28  BYTE_INT(x)    (
16940 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  256*(i8)((x)[0])
16950 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65  |(x)[1]).#define
16960 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
16970 78 29 20 20 28 36 35 35 33 36 2a 28 69 38 29 28  x)  (65536*(i8)(
16980 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
16990 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66  <8)|(x)[2]).#def
169a0 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ine FOUR_BYTE_UI
169b0 4e 54 28 78 29 20 20 28 28 28 75 33 32 29 28 78  NT(x)  (((u32)(x
169c0 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31  )[0]<<24)|((x)[1
169d0 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c  ]<<16)|((x)[2]<<
169e0 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69  8)|(x)[3]).#defi
169f0 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54  ne FOUR_BYTE_INT
16a00 28 78 29 20 28 31 36 37 37 37 32 31 36 2a 28 69  (x) (16777216*(i
16a10 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b  8)((x)[0])|((x)[
16a20 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c  1]<<16)|((x)[2]<
16a30 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a  <8)|(x)[3])../*.
16a40 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
16a50 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
16a60 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
16a70 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
16a80 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
16a90 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
16aa0 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
16ab0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
16ac0 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a   bytes read..**.
16ad0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
16ae0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
16af0 61 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 20  as two separate 
16b00 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72  routines for per
16b10 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
16b20 20 66 65 77 20 63 61 73 65 73 20 74 68 61 74 20   few cases that 
16b30 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61  require local va
16b40 72 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b  riables are brok
16b50 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65  en out into a se
16b60 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e  parate.** routin
16b70 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73  e so that in mos
16b80 74 20 63 61 73 65 73 20 74 68 65 20 6f 76 65 72  t cases the over
16b90 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74  head of moving t
16ba0 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  he stack pointer
16bb0 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a  .** is avoided..
16bc0 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20 53  */ .static u32 S
16bd0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
16be0 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
16bf0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
16c00 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
16c10 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
16c20 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
16c30 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
16c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
16c50 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
16c60 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
16c70 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
16c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
16c90 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
16ca0 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
16cb0 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46  /.){.  u64 x = F
16cc0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
16cd0 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f  f);.  u32 y = FO
16ce0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
16cf0 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33  +4);.  x = (x<<3
16d00 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65  2) + y;.  if( se
16d10 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a  rial_type==6 ){.
16d20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
16d30 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70  *(i64*)&x;.    p
16d40 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
16d50 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61  _Int;.    testca
16d60 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
16d70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20  );.  }else{.#if 
16d80 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
16d90 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
16da0 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
16db0 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20  G_POINT).    /* 
16dc0 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65  Verify that inte
16dd0 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e  gers and floatin
16de0 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75  g point values u
16df0 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  se the same.    
16e00 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20  ** byte order.  
16e10 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49  Or, that if SQLI
16e20 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
16e30 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20  64BIT_FLOAT is. 
16e40 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68     ** defined th
16e50 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69  at 64-bit floati
16e60 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
16e70 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64  really are mixed
16e80 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a  .    ** endian..
16e90 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69      */.    stati
16ea0 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d  c const u64 t1 =
16eb0 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30   ((u64)0x3ff0000
16ec0 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74  0)<<32;.    stat
16ed0 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20  ic const double 
16ee0 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36  r1 = 1.0;.    u6
16ef0 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73  4 t2 = t1;.    s
16f00 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
16f10 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73  oat(t2);.    ass
16f20 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d  ert( sizeof(r1)=
16f30 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d  =sizeof(t2) && m
16f40 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20  emcmp(&r1, &t2, 
16f50 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29  sizeof(r1))==0 )
16f60 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
16f70 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d  ert( sizeof(x)==
16f80 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d  8 && sizeof(pMem
16f90 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73  ->r)==8 );.    s
16fa0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
16fb0 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63  oat(x);.    memc
16fc0 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c  py(&pMem->r, &x,
16fd0 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
16fe0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73   pMem->flags = s
16ff0 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d  qlite3IsNaN(pMem
17000 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20  ->r) ? MEM_Null 
17010 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a  : MEM_Real;.  }.
17020 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33    return 8;.}.u3
17030 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
17040 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20  ialGet(.  const 
17050 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
17060 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65  uf,     /* Buffe
17070 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  r to deserialize
17080 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73   from */.  u32 s
17090 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20  erial_type,     
170a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69           /* Seri
170b0 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72  al type to deser
170c0 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20  ialize */.  Mem 
170d0 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20  *pMem           
170e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
170f0 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74  ory cell to writ
17100 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a  e value into */.
17110 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  ){.  switch( ser
17120 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
17130 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65  case 10:   /* Re
17140 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
17150 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
17160 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 11:   /* Reser
17170 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
17180 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30  se */.    case 0
17190 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a  : {  /* NULL */.
171a0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
171b0 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
171c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
171d0 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
171e0 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
171f0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
17200 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45   pMem->u.i = ONE
17210 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
17220 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
17230 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
17240 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
17250 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
17260 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
17270 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
17280 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
17290 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
172a0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57    pMem->u.i = TW
172b0 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  O_BYTE_INT(buf);
172c0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
172d0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
172e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
172f0 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
17300 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
17310 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
17320 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
17330 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
17340 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54     pMem->u.i = T
17350 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75  HREE_BYTE_INT(bu
17360 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
17370 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
17380 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17390 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
173a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
173b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
173c0 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
173d0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
173e0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
173f0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28  = FOUR_BYTE_INT(
17400 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
17410 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
17420 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
17430 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
17440 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34  ;.      return 4
17450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17460 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
17470 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
17480 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
17490 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  i = FOUR_BYTE_UI
174a0 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69  NT(buf+2) + (((i
174b0 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
174c0 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
174d0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
174e0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
174f0 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
17500 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
17510 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a  return 6;.    }.
17520 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a      case 6:   /*
17530 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
17540 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61  nteger */.    ca
17550 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20  se 7: { /* IEEE 
17560 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a  floating point *
17570 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65  /.      /* These
17580 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61   use local varia
17590 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d  bles, so do them
175a0 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 72   in a separate r
175b0 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
175c0 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20  to avoid having 
175d0 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d  to move the fram
175e0 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  e pointer in the
175f0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
17600 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 72        return ser
17610 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61  ialGet(buf,seria
17620 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20  l_type,pMem);.  
17630 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
17640 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
17650 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
17660 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
17670 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
17680 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
17690 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
176a0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
176b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
176c0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
176d0 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69  t: {.      stati
176e0 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61  c const u16 aFla
176f0 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62  g[] = { MEM_Blob
17700 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f  |MEM_Ephem, MEM_
17710 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b  Str|MEM_Ephem };
17720 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
17730 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20   (char *)buf;.  
17740 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73      pMem->n = (s
17750 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
17760 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44  ;.      pMem->xD
17770 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d  el = 0;.      pM
17780 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61  em->flags = aFla
17790 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d  g[serial_type&1]
177a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
177b0 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20  Mem->n;.    }.  
177c0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
177d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
177e0 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  ne is used to al
177f0 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e  locate sufficien
17800 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55  t space for an U
17810 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a  npackedRecord.**
17820 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65   structure large
17830 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73   enough to be us
17840 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56  ed with sqlite3V
17850 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
17860 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  ) if.** the firs
17870 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
17880 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e  pointer to KeyIn
17890 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65  fo structure pKe
178a0 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  yInfo..**.** The
178b0 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72   space is either
178c0 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
178d0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
178e0 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69  Raw() or from wi
178f0 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c  thin.** the unal
17900 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73  igned buffer pas
17910 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f  sed via the seco
17920 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67  nd and third arg
17930 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62  uments (presumab
17940 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63  ly.** stack spac
17950 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65  e). If the forme
17960 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20  r, then *ppFree 
17970 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e  is set to a poin
17980 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  ter that should.
17990 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  ** be eventually
179a0 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
179b0 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
179c0 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20  e3DbFree(). Or, 
179d0 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63  if the .** alloc
179e0 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d  ation comes from
179f0 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70   the pSpace/szSp
17a00 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46  ace buffer, *ppF
17a10 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ree is set to NU
17a20 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74  LL.** before ret
17a30 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
17a40 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
17a50 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
17a60 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63  turned..*/.Unpac
17a70 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
17a80 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
17a90 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79  kedRecord(.  Key
17aa0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17ac0 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
17ad0 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  he record */.  c
17ae0 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20  har *pSpace,    
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17b00 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63  * Unaligned spac
17b10 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  e available */. 
17b20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 20   int szSpace,   
17b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b40 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61   /* Size of pSpa
17b50 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f  ce[] in bytes */
17b60 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65 65  .  char **ppFree
17b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b80 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65     /* OUT: Calle
17b90 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68  r should free th
17ba0 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b  is pointer */.){
17bb0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
17bc0 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  d *p;           
17bd0 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72     /* Unpacked r
17be0 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20  ecord to return 
17bf0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20  */.  int nOff;  
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c10 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e       /* Incremen
17c20 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66 66  t pSpace by nOff
17c30 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a   to align it */.
17c40 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
17c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
17c70 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f  ytes required fo
17c80 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65  r *p */..  /* We
17c90 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74   want to shift t
17ca0 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63  he pointer pSpac
17cb0 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20 69  e up such that i
17cc0 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67  t is 8-byte alig
17cd0 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20  ned..  ** Thus, 
17ce0 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75  we need to calcu
17cf0 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f  late a value, nO
17d00 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ff, between 0 an
17d10 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20  d 7, to shift . 
17d20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70   ** it by.  If p
17d30 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 79  Space is already
17d40 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c   8-byte aligned,
17d50 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20   nOff should be 
17d60 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66  zero..  */.  nOf
17d70 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45  f = (8 - (SQLITE
17d80 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61  _PTR_TO_INT(pSpa
17d90 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20  ce) & 7)) & 7;. 
17da0 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
17db0 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
17dc0 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66  ecord)) + sizeof
17dd0 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d  (Mem)*(pKeyInfo-
17de0 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66  >nField+1);.  if
17df0 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 2b  ( nByte>szSpace+
17e00 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d 20  nOff ){.    p = 
17e10 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
17e20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
17e30 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64  cRaw(pKeyInfo->d
17e40 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a  b, nByte);.    *
17e50 70 70 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a  ppFree = (char *
17e60 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29  )p;.    if( !p )
17e70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
17e80 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70  se{.    p = (Unp
17e90 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 53  ackedRecord*)&pS
17ea0 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20  pace[nOff];.    
17eb0 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  *ppFree = 0;.  }
17ec0 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d  ..  p->aMem = (M
17ed0 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b  em*)&((char*)p)[
17ee0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
17ef0 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b  packedRecord))];
17f00 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
17f10 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
17f20 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49  =0 );.  p->pKeyI
17f30 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
17f40 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b    p->nField = pK
17f50 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
17f60 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   1;.  return p;.
17f70 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
17f80 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
17f90 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
17fa0 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70  d in pKey[], pop
17fb0 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e  ulate the .** Un
17fc0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
17fd0 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
17fe0 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61   by the fourth a
17ff0 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65  rgument with the
18000 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
18010 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f  the decoded reco
18020 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  rd..*/ .void sql
18030 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
18040 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
18050 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
18060 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
18070 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
18080 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
18090 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
180a0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
180b0 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
180c0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
180d0 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
180e0 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
180f0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
18100 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50  ord *p      /* P
18110 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72  opulate this str
18120 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65  ucture before re
18130 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20  turning. */.){. 
18140 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
18150 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
18160 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
18170 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20  r *)pKey;.  int 
18180 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20  d; .  u32 idx;  
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181a0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
181b0 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61  in aKey[] to rea
181c0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20  d from */.  u16 
181d0 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
181e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
181f0 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
18200 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a  nter */.  u32 sz
18210 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  Hdr;.  Mem *pMem
18220 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70   = p->aMem;..  p
18230 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30  ->default_rc = 0
18240 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
18250 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
18260 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20  (pMem) );.  idx 
18270 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
18280 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20  ey, szHdr);.  d 
18290 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30  = szHdr;.  u = 0
182a0 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
182b0 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69  zHdr && u<p->nFi
182c0 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29  eld && d<=nKey )
182d0 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
182e0 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20  _type;..    idx 
182f0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
18300 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61  aKey[idx], seria
18310 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65  l_type);.    pMe
18320 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m->enc = pKeyInf
18330 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d  o->enc;.    pMem
18340 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ->db = pKeyInfo-
18350 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d  >db;.    /* pMem
18360 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20  ->flags = 0; // 
18370 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
18380 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20  lGet() will set 
18390 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20  this for us */. 
183a0 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63     pMem->zMalloc
183b0 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73   = 0;.    d += s
183c0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
183d0 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65  Get(&aKey[d], se
183e0 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29  rial_type, pMem)
183f0 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20  ;.    pMem++;.  
18400 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73    u++;.  }.  ass
18410 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f  ert( u<=pKeyInfo
18420 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a  ->nField + 1 );.
18430 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b    p->nField = u;
18440 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .}..#if SQLITE_D
18450 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EBUG./*.** This 
18460 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
18470 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74  s two index or t
18480 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73  able record keys
18490 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79   in the same way
184a0 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74  .** as the sqlit
184b0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
184c0 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55  are() routine. U
184d0 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64  nlike VdbeRecord
184e0 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68  Compare(),.** th
184f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65  is function dese
18500 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d  rializes and com
18510 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69  pares values usi
18520 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ng the.** sqlite
18530 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
18540 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43   and sqlite3MemC
18550 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f  ompare() functio
18560 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a  ns. It is used.*
18570 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  * in assert() st
18580 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
18590 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69  re that the opti
185a0 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a  mized code in.**
185b0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
185c0 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75  rdCompare() retu
185d0 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68  rns results with
185e0 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69   these two primi
185f0 74 69 76 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tives..*/.static
18600 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
18610 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20 69  ompareDebug(.  i
18620 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
18630 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
18640 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f  Left key */.  co
18650 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  nst UnpackedReco
18660 72 64 20 2a 70 50 4b 65 79 32 20 20 2f 2a 20 52  rd *pPKey2  /* R
18670 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
18680 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
18690 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
186a0 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
186b0 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
186c0 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
186d0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
186e0 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
186f0 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
18700 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
18710 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  dr1;        /* N
18720 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
18730 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
18740 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  t i = 0;.  int r
18750 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75  c = 0;.  const u
18760 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
18770 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  ey1 = (const uns
18780 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
18790 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  y1;.  KeyInfo *p
187a0 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d  KeyInfo;.  Mem m
187b0 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f  em1;..  pKeyInfo
187c0 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
187d0 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20  nfo;.  mem1.enc 
187e0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
187f0 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65  .  mem1.db = pKe
18800 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20  yInfo->db;.  /* 
18810 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20  mem1.flags = 0; 
18820 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74   // Will be init
18830 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74  ialized by sqlit
18840 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
18850 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) */.  VVA_ONLY(
18860 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20   mem1.zMalloc = 
18870 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  0; ) /* Only nee
18880 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20  ded by assert() 
18890 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20  statements */.. 
188a0 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61   /* Compilers ma
188b0 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20  y complain that 
188c0 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65  mem1.u.i is pote
188d0 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61  ntially uninitia
188e0 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63  lized..  ** We c
188f0 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20  ould initialize 
18900 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72  it, as shown her
18910 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68  e, to silence th
18920 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a  ose complaints..
18930 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74    ** But in fact
18940 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20  , mem1.u.i will 
18950 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62  never actually b
18960 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c  e used uninitial
18970 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20  ized, and doing 
18980 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65  .  ** the unnece
18990 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61  ssary initializa
189a0 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75  tion has a measu
189b0 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70  rable negative p
189c0 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20  erformance.  ** 
189d0 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68  impact, since th
189e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
189f0 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72  very high runner
18a00 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68  .  And so, we ch
18a10 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e  oose.  ** to ign
18a20 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ore the compiler
18a30 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65   warnings and le
18a40 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c  ave this variabl
18a50 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  e uninitialized.
18a60 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31  .  */.  /*  mem1
18a70 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f  .u.i = 0;  // no
18a80 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74  t needed, here t
18a90 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c  o silence compil
18aa0 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20  er warning */.  
18ab0 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72  .  idx1 = getVar
18ac0 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
18ad0 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48  dr1);.  d1 = szH
18ae0 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dr1;.  assert( p
18af0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
18b00 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
18b10 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
18b20 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  d || CORRUPT_DB 
18b30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
18b40 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
18b50 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
18b60 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ( pKeyInfo->nFie
18b70 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
18b80 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c  ( idx1<=szHdr1 |
18b90 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
18ba0 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65    do{.    u32 se
18bb0 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20  rial_type1;..   
18bc0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72   /* Read the ser
18bd0 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68  ial types for th
18be0 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69  e next element i
18bf0 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20  n each key. */. 
18c00 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61     idx1 += getVa
18c10 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64  rint32( aKey1+id
18c20 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  x1, serial_type1
18c30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69   );..    /* Veri
18c40 66 79 20 74 68 61 74 20 74 68 65 72 65 20 69 73  fy that there is
18c50 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63   enough key spac
18c60 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61  e remaining to a
18c70 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75  void.    ** a bu
18c80 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20  ffer overread.  
18c90 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74  The "d1+serial_t
18ca0 79 70 65 31 2b 32 22 20 73 75 62 65 78 70 72 65  ype1+2" subexpre
18cb0 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a  ssion will.    *
18cc0 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72 65 61  * always be grea
18cd0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
18ce0 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20  l to the amount 
18cf0 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65 79 20  of required key 
18d00 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73  space..    ** Us
18d10 65 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61  e that approxima
18d20 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68  tion to avoid th
18d30 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65  e more expensive
18d40 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
18d50 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
18d60 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68  lTypeLen() in th
18d70 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20  e common case.. 
18d80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31     */.    if( d1
18d90 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e  +serial_type1+2>
18da0 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20  (u32)nKey1.     
18db0 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62  && d1+sqlite3Vdb
18dc0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
18dd0 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33  erial_type1)>(u3
18de0 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a  2)nKey1 .    ){.
18df0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18e00 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61   }..    /* Extra
18e10 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f  ct the values to
18e20 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20   be compared..  
18e30 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73    */.    d1 += s
18e40 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18e50 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
18e60 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d  serial_type1, &m
18e70 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  em1);..    /* Do
18e80 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
18e90 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
18ea0 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
18eb0 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32  e(&mem1, &pPKey2
18ec0 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49  ->aMem[i], pKeyI
18ed0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a  nfo->aColl[i]);.
18ee0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
18ef0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
18f00 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  em1.zMalloc==0 )
18f10 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  ;  /* See commen
18f20 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  t below */.     
18f30 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
18f40 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a  SortOrder[i] ){.
18f50 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63          rc = -rc
18f60 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65  ;  /* Invert the
18f70 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43   result for DESC
18f80 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a   sort order. */.
18f90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
18fa0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18fb0 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65     i++;.  }while
18fc0 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26  ( idx1<szHdr1 &&
18fd0 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c   i<pPKey2->nFiel
18fe0 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  d );..  /* No me
18ff0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
19000 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
19010 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
19020 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
19030 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
19040 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
19050 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
19060 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
19070 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
19080 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
19090 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
190a0 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20  lease(&mem1)..  
190b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
190c0 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  1.zMalloc==0 );.
190d0 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
190e0 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
190f0 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
19100 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
19110 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
19120 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
19130 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
19140 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 74 68  l. Return the th
19150 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a  e default_rc.  *
19160 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72  * value.  */.  r
19170 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65  eturn pPKey2->de
19180 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 23 65 6e 64  fault_rc;.}.#end
19190 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a  if../*.** Both *
191a0 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32  pMem1 and *pMem2
191b0 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20   contain string 
191c0 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20  values. Compare 
191d0 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  the two values.*
191e0 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  * using the coll
191f0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70  ation sequence p
19200 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20  Coll. As usual, 
19210 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  return a negativ
19220 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  e , zero.** or p
19230 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
19240 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20   *pMem1 is less 
19250 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
19260 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a  r greater than .
19270 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65  ** *pMem2, respe
19280 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72  ctively. Similar
19290 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72   in spirit to "r
192a0 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28  c = (*pMem1) - (
192b0 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74  *pMem2);"..*/.st
192c0 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
192d0 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
192e0 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
192f0 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  1,.  const Mem *
19300 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43  pMem2,.  const C
19310 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 0a 29 7b  ollSeq *pColl.){
19320 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e  .  if( pMem1->en
19330 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
19340 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69  .    /* The stri
19350 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ngs are already 
19360 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 65  in the correct e
19370 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74  ncoding.  Call t
19380 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61  he.     ** compa
19390 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64  rison function d
193a0 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72  irectly */.    r
193b0 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d  eturn pColl->xCm
193c0 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70  p(pColl->pUser,p
193d0 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a  Mem1->n,pMem1->z
193e0 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d  ,pMem2->n,pMem2-
193f0 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >z);.  }else{.  
19400 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f    int rc;.    co
19410 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76  nst void *v1, *v
19420 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e  2;.    int n1, n
19430 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20  2;.    Mem c1;. 
19440 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 6d     Mem c2;.    m
19450 65 6d 73 65 74 28 26 63 31 2c 20 30 2c 20 73 69  emset(&c1, 0, si
19460 7a 65 6f 66 28 63 31 29 29 3b 0a 20 20 20 20 6d  zeof(c1));.    m
19470 65 6d 73 65 74 28 26 63 32 2c 20 30 2c 20 73 69  emset(&c2, 0, si
19480 7a 65 6f 66 28 63 32 29 29 3b 0a 20 20 20 20 73  zeof(c2));.    s
19490 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
194a0 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d  llowCopy(&c1, pM
194b0 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  em1, MEM_Ephem);
194c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
194d0 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26  MemShallowCopy(&
194e0 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45  c2, pMem2, MEM_E
194f0 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20  phem);.    v1 = 
19500 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
19510 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
19520 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c1, pColl->enc
19530 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d  );.    n1 = v1==
19540 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20  0 ? 0 : c1.n;.  
19550 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61    v2 = sqlite3Va
19560 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
19570 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f  _value*)&c2, pCo
19580 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 32  ll->enc);.    n2
19590 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20 63   = v2==0 ? 0 : c
195a0 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70 43  2.n;.    rc = pC
195b0 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
195c0 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20  >pUser, n1, v1, 
195d0 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 73 71 6c  n2, v2);.    sql
195e0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
195f0 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71 6c  se(&c1);.    sql
19600 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
19610 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72 65 74  se(&c2);.    ret
19620 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  urn rc;.  }.}../
19630 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
19640 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65   values containe
19650 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d  d by the two mem
19660 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72  ory cells, retur
19670 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65  ning.** negative
19680 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69  , zero or positi
19690 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c  ve if pMem1 is l
196a0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
196b0 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a  to, or greater.*
196c0 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f  * than pMem2. So
196d0 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e  rting order is N
196e0 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c  ULL's first, fol
196f0 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73  lowed by numbers
19700 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e   (integers.** an
19710 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20  d reals) sorted 
19720 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c  numerically, fol
19730 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f 72  lowed by text or
19740 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c  dered by the col
19750 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
19760 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e  ce pColl and fin
19770 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65  ally blob's orde
19780 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e  red by memcmp().
19790 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
197a0 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69  values are consi
197b0 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20 74  dered equal by t
197c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
197d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43  .int sqlite3MemC
197e0 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d  ompare(const Mem
197f0 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d   *pMem1, const M
19800 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74  em *pMem2, const
19810 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
19820 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
19830 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20  t f1, f2;.  int 
19840 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a  combined_flags;.
19850 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66  .  f1 = pMem1->f
19860 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65  lags;.  f2 = pMe
19870 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d  m2->flags;.  com
19880 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31  bined_flags = f1
19890 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28  |f2;.  assert( (
198a0 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26  combined_flags &
198b0 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20   MEM_RowSet)==0 
198c0 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65  );. .  /* If one
198d0 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20   value is NULL, 
198e0 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
198f0 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f  the other. If bo
19900 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61  th values.  ** a
19910 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  re NULL, return 
19920 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  0..  */.  if( co
19930 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d  mbined_flags&MEM
19940 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
19950 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c  urn (f2&MEM_Null
19960 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c  ) - (f1&MEM_Null
19970 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
19980 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e  one value is a n
19990 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 6f 74  umber and the ot
199a0 68 65 72 20 69 73 20 6e 6f 74 2c 20 74 68 65 20  her is not, the 
199b0 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 2e 0a  number is less..
199c0 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65    ** If both are
199d0 20 6e 75 6d 62 65 72 73 2c 20 63 6f 6d 70 61 72   numbers, compar
199e0 65 20 61 73 20 72 65 61 6c 73 20 69 66 20 6f 6e  e as reals if on
199f0 65 20 69 73 20 61 20 72 65 61 6c 2c 20 6f 72 20  e is a real, or 
19a00 61 73 20 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a  as integers.  **
19a10 20 69 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20   if both values 
19a20 61 72 65 20 69 6e 74 65 67 65 72 73 2e 0a 20 20  are integers..  
19a30 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
19a40 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74  d_flags&(MEM_Int
19a50 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20  |MEM_Real) ){.  
19a60 20 20 64 6f 75 62 6c 65 20 72 31 2c 20 72 32 3b    double r1, r2;
19a70 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66  .    if( (f1 & f
19a80 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  2 & MEM_Int)!=0 
19a90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ){.      if( pMe
19aa0 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d  m1->u.i < pMem2-
19ab0 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31  >u.i ) return -1
19ac0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
19ad0 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e  1->u.i > pMem2->
19ae0 75 2e 69 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  u.i ) return 1;.
19af0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
19b00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
19b10 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29  1&MEM_Real)!=0 )
19b20 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 70 4d 65  {.      r1 = pMe
19b30 6d 31 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c 73 65  m1->r;.    }else
19b40 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74   if( (f1&MEM_Int
19b50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31  )!=0 ){.      r1
19b60 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 31   = (double)pMem1
19b70 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65  ->u.i;.    }else
19b80 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
19b90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19ba0 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  (f2&MEM_Real)!=0
19bb0 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 70   ){.      r2 = p
19bc0 4d 65 6d 32 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c  Mem2->r;.    }el
19bd0 73 65 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49  se if( (f2&MEM_I
19be0 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
19bf0 72 32 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65  r2 = (double)pMe
19c00 6d 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c  m2->u.i;.    }el
19c10 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
19c20 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   -1;.    }.    i
19c30 66 28 20 72 31 3c 72 32 20 29 20 72 65 74 75 72  f( r1<r2 ) retur
19c40 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 72 31  n -1;.    if( r1
19c50 3e 72 32 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  >r2 ) return 1;.
19c60 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
19c70 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  }..  /* If one v
19c80 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
19c90 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69   and the other i
19ca0 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74  s a blob, the st
19cb0 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20  ring is less..  
19cc0 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 73  ** If both are s
19cd0 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20  trings, compare 
19ce0 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74  using the collat
19cf0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  ing functions.. 
19d00 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
19d10 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72  ed_flags&MEM_Str
19d20 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20   ){.    if( (f1 
19d30 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b  & MEM_Str)==0 ){
19d40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
19d50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
19d60 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30  f2 & MEM_Str)==0
19d70 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
19d80 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
19d90 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
19da0 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 29  nc==pMem2->enc )
19db0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
19dc0 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
19dd0 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20  _UTF8 || .      
19de0 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63        pMem1->enc
19df0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
19e00 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d   || pMem1->enc==
19e10 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
19e20 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
19e30 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
19e40 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64   must be defined
19e50 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
19e60 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74  even if.    ** t
19e70 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 73 20  he user deletes 
19e80 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
19e90 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 68 65  quence after the
19ea0 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73   vdbe program is
19eb0 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64  .    ** compiled
19ec0 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61   (this was not a
19ed0 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 29 2e  lways the case).
19ee0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
19ef0 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43  rt( !pColl || pC
19f00 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20  oll->xCmp );..  
19f10 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
19f20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
19f30 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
19f40 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70  (pMem1, pMem2, p
19f50 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
19f60 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f   /* If a NULL po
19f70 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65 64  inter was passed
19f80 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20   as the collate 
19f90 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74  function, fall t
19fa0 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f  hrough.    ** to
19fb0 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61   the blob case a
19fc0 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e  nd use memcmp().
19fd0 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20    */.  }. .  /* 
19fe0 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74  Both values must
19ff0 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70   be blobs.  Comp
1a000 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70  are using memcmp
1a010 28 29 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 6d  ().  */.  rc = m
1a020 65 6d 63 6d 70 28 70 4d 65 6d 31 2d 3e 7a 2c 20  emcmp(pMem1->z, 
1a030 70 4d 65 6d 32 2d 3e 7a 2c 20 28 70 4d 65 6d 31  pMem2->z, (pMem1
1a040 2d 3e 6e 3e 70 4d 65 6d 32 2d 3e 6e 29 3f 70 4d  ->n>pMem2->n)?pM
1a050 65 6d 32 2d 3e 6e 3a 70 4d 65 6d 31 2d 3e 6e 29  em2->n:pMem1->n)
1a060 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
1a070 0a 20 20 20 20 72 63 20 3d 20 70 4d 65 6d 31 2d  .    rc = pMem1-
1a080 3e 6e 20 2d 20 70 4d 65 6d 32 2d 3e 6e 3b 0a 20  >n - pMem2->n;. 
1a090 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a0a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  }.../*.** The fi
1a0b0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
1a0c0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1a0d0 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c  tion is a serial
1a0e0 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f  -type that.** co
1a0f0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
1a100 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61  integer - all va
1a110 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61  lues between 1 a
1a120 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a  nd 9 inclusive .
1a130 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65  ** except 7. The
1a140 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74   second points t
1a150 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1a160 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72  ining an integer
1a170 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c   value.** serial
1a180 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  ized according t
1a190 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54  o serial_type. T
1a1a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
1a1b0 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64  erializes.** and
1a1c0 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
1a1d0 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ue..*/.static i6
1a1e0 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  4 vdbeRecordDeco
1a1f0 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c  deInt(u32 serial
1a200 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20  _type, const u8 
1a210 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b  *aKey){.  u32 y;
1a220 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
1a230 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c  PT_DB || (serial
1a240 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69  _type>=1 && seri
1a250 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65  al_type<=9 && se
1a260 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b  rial_type!=7) );
1a270 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1a280 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1a290 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31  se 0:.    case 1
1a2a0 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1a2b0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1a2c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f  ;.      return O
1a2d0 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  NE_BYTE_INT(aKey
1a2e0 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20  );.    case 2:. 
1a2f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1a300 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1a310 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f       return TWO_
1a320 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1a330 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20      case 3:.    
1a340 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1a350 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1a360 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42    return THREE_B
1a370 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1a380 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20     case 4: {.   
1a390 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1a3a0 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1a3b0 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
1a3c0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1a3d0 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
1a3e0 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a  (int*)&y;.    }.
1a3f0 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20      case 5: {.  
1a400 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1a410 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1a420 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f      return FOUR_
1a430 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
1a440 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1a450 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1a460 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aKey);.    }.   
1a470 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20   case 6: {.     
1a480 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
1a490 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1a4a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1a4b0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1a4c0 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
1a4d0 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
1a4e0 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
1a4f0 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1a500 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20  64*)&x;.    }.  
1a510 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72  }..  return (ser
1a520 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d  ial_type - 8);.}
1a530 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1a540 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
1a550 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
1a560 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
1a570 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
1a580 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
1a590 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
1a5a0 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
1a5b0 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
1a5c0 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
1a5d0 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
1a5e0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1a5f0 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
1a600 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
1a610 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
1a620 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
1a630 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
1a640 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  th OP_MakeRecord
1a650 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56   opcode of the V
1a660 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32  DBE.  The pPKey2
1a670 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20  .** key must be 
1a680 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63  a parsed key suc
1a690 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72  h as obtained fr
1a6a0 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
1a6b0 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a  eParseRecord..**
1a6c0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1a6d0 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  bSkip is non-zer
1a6e0 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  o, it is assumed
1a6f0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
1a700 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
1a710 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
1a720 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  the first fields
1a730 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65   of the keys are
1a740 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65   equal..**.** Ke
1a750 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e  y1 and Key2 do n
1a760 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61  ot have to conta
1a770 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  in the same numb
1a780 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66  er of fields. If
1a790 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20   all .** fields 
1a7a0 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62  that appear in b
1a7b0 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75  oth keys are equ
1a7c0 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d  al, then pPKey2-
1a7d0 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a  >default_rc is .
1a7e0 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  ** returned..**.
1a7f0 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20 63  ** If database c
1a800 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73  orruption is dis
1a810 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b  covered, set pPK
1a820 65 79 32 2d 3e 69 73 43 6f 72 72 75 70 74 20 74  ey2->isCorrupt t
1a830 6f 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 61 6e  o non-zero.** an
1a840 64 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 69  d return 0..*/.i
1a850 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
1a860 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69  cordCompare(.  i
1a870 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1a880 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f  void *pKey1,   /
1a890 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1a8a0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1a8b0 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20  pPKey2,         
1a8c0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1a8d0 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20    int bSkip     
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8f0 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b    /* If true, sk
1a900 69 70 20 74 68 65 20 66 69 72 73 74 20 66 69 65  ip the first fie
1a910 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  ld */.){.  u32 d
1a920 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1a930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1a940 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1a950 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
1a960 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
1a970 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1a990 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c  dex of next fiel
1a9a0 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  d to compare */.
1a9b0 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63    /* Size of rec
1a9e0 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62 79  ord header in by
1a9f0 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  tes */.  u32 idx
1aa00 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1aa10 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1aa20 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 70 65  et of first type
1aa30 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
1aa40 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
1aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa60 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
1aa70 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d  */.  Mem *pRhs =
1aa80 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20   pPKey2->aMem;  
1aa90 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65       /* Next fie
1aaa0 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20  ld of pPKey2 to 
1aab0 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79  compare */.  Key
1aac0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
1aad0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1aae0 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  o;.  const unsig
1aaf0 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
1ab00 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1ab10 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
1ab20 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f    Mem mem1;..  /
1ab30 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72  * If bSkip is tr
1ab40 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ue, then the cal
1ab50 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
1ab60 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
1ab70 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
1ab80 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
1ab90 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  he keys are equa
1aba0 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f  l. Fix the vario
1abb0 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  us stack variabl
1abc0 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  es so.  ** that 
1abd0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67  this routine beg
1abe0 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74  ins comparing at
1abf0 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c   the second fiel
1ac00 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69  d. */.  if( bSki
1ac10 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b  p ){.    u32 s1;
1ac20 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20  .    idx1 = 1 + 
1ac30 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1ac40 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20  y1[1], s1);.    
1ac50 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30  szHdr1 = aKey1[0
1ac60 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64  ];.    d1 = szHd
1ac70 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65  r1 + sqlite3Vdbe
1ac80 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31  SerialTypeLen(s1
1ac90 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20  );.    i = 1;.  
1aca0 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73    pRhs++;.  }els
1acb0 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65  e{.    idx1 = ge
1acc0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
1acd0 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31   szHdr1);.    d1
1ace0 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69   = szHdr1;.    i
1acf0 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29  f( d1>(unsigned)
1ad00 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20  nKey1 ){ .      
1ad10 70 50 4b 65 79 32 2d 3e 69 73 43 6f 72 72 75 70  pPKey2->isCorrup
1ad20 74 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  t = (u8)SQLITE_C
1ad30 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1ad40 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
1ad50 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
1ad60 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a     }.    i = 0;.
1ad70 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28    }..  VVA_ONLY(
1ad80 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20   mem1.zMalloc = 
1ad90 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  0; ) /* Only nee
1ada0 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20  ded by assert() 
1adb0 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  statements */.  
1adc0 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
1add0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1ade0 2b 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66  +pPKey2->pKeyInf
1adf0 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65  o->nXField>=pPKe
1ae00 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20  y2->nField .    
1ae10 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
1ae20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1ae30 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1ae40 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
1ae50 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
1ae60 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  2->pKeyInfo->nFi
1ae70 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  eld>0 );.  asser
1ae80 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20  t( idx1<=szHdr1 
1ae90 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1aea0 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73  .  do{.    u32 s
1aeb0 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20  erial_type;..   
1aec0 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e   /* RHS is an in
1aed0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  teger */.    if(
1aee0 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1aef0 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
1af00 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b  serial_type = aK
1af10 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20  ey1[idx1];.     
1af20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
1af30 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
1af40 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1af50 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 20  ype>=12 ){.     
1af60 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1af70 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
1af80 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  al_type==0 ){.  
1af90 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1afa0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1afb0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
1afc0 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20  .        double 
1afd0 72 68 73 20 3d 20 28 64 6f 75 62 6c 65 29 70 52  rhs = (double)pR
1afe0 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20  hs->u.i;.       
1aff0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1b000 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1b010 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  , serial_type, &
1b020 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69  mem1);.        i
1b030 66 28 20 6d 65 6d 31 2e 72 3c 72 68 73 20 29 7b  f( mem1.r<rhs ){
1b040 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1b050 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
1b060 65 20 69 66 28 20 6d 65 6d 31 2e 72 3e 72 68 73  e if( mem1.r>rhs
1b070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1b080 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1b090 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b0a0 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20        i64 lhs = 
1b0b0 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1b0c0 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c  Int(serial_type,
1b0d0 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20   &aKey1[d1]);.  
1b0e0 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d 20        i64 rhs = 
1b0f0 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20  pRhs->u.i;.     
1b100 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29     if( lhs<rhs )
1b110 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1b120 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1b130 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29  se if( lhs>rhs )
1b140 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1b150 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1b160 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1b170 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c    /* RHS is real
1b180 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1b190 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1b1a0 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
1b1b0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1b1c0 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1b1d0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1b1e0 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 20 20 20  e>=12 ){.       
1b1f0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1b200 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
1b210 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _type==0 ){.    
1b220 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1b230 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b240 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20 70    double rhs = p
1b250 52 68 73 2d 3e 72 3b 0a 20 20 20 20 20 20 20 20  Rhs->r;.        
1b260 64 6f 75 62 6c 65 20 6c 68 73 3b 0a 20 20 20 20  double lhs;.    
1b270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
1b280 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1b290 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1b2a0 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20  , &mem1);.      
1b2b0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1b2c0 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1b2d0 20 20 6c 68 73 20 3d 20 6d 65 6d 31 2e 72 3b 0a    lhs = mem1.r;.
1b2e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1b2f0 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d 20 28           lhs = (
1b300 64 6f 75 62 6c 65 29 6d 65 6d 31 2e 75 2e 69 3b  double)mem1.u.i;
1b310 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b320 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29     if( lhs<rhs )
1b330 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1b340 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1b350 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29  se if( lhs>rhs )
1b360 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1b370 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1b380 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1b390 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74    /* RHS is a st
1b3a0 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65  ring */.    else
1b3b0 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1b3c0 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
1b3d0 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28      getVarint32(
1b3e0 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65  &aKey1[idx1], se
1b3f0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1b400 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1b410 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1b420 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1b430 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20  type<12 ){.     
1b440 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1b450 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65    }else if( !(se
1b460 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
1b470 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1b480 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1b490 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  e{.        mem1.
1b4a0 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
1b4b0 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20   - 12) / 2;.    
1b4c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1b4d0 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69  1+mem1.n)==(unsi
1b4e0 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1b4f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b500 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28  (d1+mem1.n+1)==(
1b510 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1b520 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64  ;.        if( (d
1b530 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73  1+mem1.n) > (uns
1b540 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20  igned)nKey1 ){. 
1b550 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
1b560 3e 69 73 43 6f 72 72 75 70 74 20 3d 20 28 75 38  >isCorrupt = (u8
1b570 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1b580 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1b590 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1b5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1b5b0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1b5c0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79    }else if( pKey
1b5d0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  Info->aColl[i] )
1b5e0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  {.          mem1
1b5f0 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
1b600 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  >enc;.          
1b610 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
1b620 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  fo->db;.        
1b630 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d    mem1.flags = M
1b640 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20  EM_Str;.        
1b650 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72    mem1.z = (char
1b660 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20  *)&aKey1[d1];.  
1b670 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
1b680 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1b690 67 28 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70  g(&mem1, pRhs, p
1b6a0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
1b6b0 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
1b6c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
1b6d0 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31   nCmp = MIN(mem1
1b6e0 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  .n, pRhs->n);.  
1b6f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
1b700 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
1b710 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
1b720 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1b730 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e  ==0 ) rc = mem1.
1b740 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20  n - pRhs->n; .  
1b750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1b760 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1b770 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20  S is a blob */. 
1b780 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
1b790 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
1b7a0 6f 62 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56  ob ){.      getV
1b7b0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69  arint32(&aKey1[i
1b7c0 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  dx1], serial_typ
1b7d0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1b7e0 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1b7f0 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1b800 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
1b810 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20  || (serial_type 
1b820 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20  & 0x01) ){.     
1b830 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1b840 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b850 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72   int nStr = (ser
1b860 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f  ial_type - 12) /
1b870 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   2;.        test
1b880 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d  case( (d1+nStr)=
1b890 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1b8a0 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
1b8b0 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31  case( (d1+nStr+1
1b8c0 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1b8d0 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y1 );.        if
1b8e0 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75  ( (d1+nStr) > (u
1b8f0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1b900 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
1b910 32 2d 3e 69 73 43 6f 72 72 75 70 74 20 3d 20 28  2->isCorrupt = (
1b920 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1b930 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
1b940 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1b950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1b960 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1b970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b980 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20       int nCmp = 
1b990 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e  MIN(nStr, pRhs->
1b9a0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  n);.          rc
1b9b0 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
1b9c0 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e  [d1], pRhs->z, n
1b9d0 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cmp);.          
1b9e0 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
1b9f0 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b   nStr - pRhs->n;
1ba00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ba10 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1ba20 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a   RHS is null */.
1ba30 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
1ba40 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b  serial_type = aK
1ba50 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20  ey1[idx1];.     
1ba60 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79   rc = (serial_ty
1ba70 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  pe!=0);.    }.. 
1ba80 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
1ba90 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
1baa0 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
1bab0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ] ){.        rc 
1bac0 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = -rc;.      }. 
1bad0 20 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52       assert( COR
1bae0 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 20  RUPT_DB.        
1baf0 20 20 7c 7c 20 28 72 63 3c 30 20 26 26 20 76 64    || (rc<0 && vd
1bb00 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1bb10 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1bb20 31 2c 20 70 50 4b 65 79 32 29 3c 30 29 0a 20 20  1, pPKey2)<0).  
1bb30 20 20 20 20 20 20 20 20 7c 7c 20 28 72 63 3e 30          || (rc>0
1bb40 20 26 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f   && vdbeRecordCo
1bb50 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
1bb60 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29  , pKey1, pPKey2)
1bb70 3e 30 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  >0).          ||
1bb80 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d   pKeyInfo->db->m
1bb90 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20 20  allocFailed.    
1bba0 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
1bbb0 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d  t( mem1.zMalloc=
1bbc0 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
1bbd0 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20  mment below */. 
1bbe0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1bbf0 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a      }..    i++;.
1bc00 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20      pRhs++;.    
1bc10 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
1bc20 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
1bc30 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1bc40 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33   idx1 += sqlite3
1bc50 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c  VarintLen(serial
1bc60 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  _type);.  }while
1bc70 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64  ( idx1<(unsigned
1bc80 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  )szHdr1 && i<pPK
1bc90 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64  ey2->nField && d
1bca0 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  1<=(unsigned)nKe
1bcb0 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  y1 );..  /* No m
1bcc0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1bcd0 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
1bce0 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
1bcf0 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
1bd00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1bd10 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
1bd20 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
1bd30 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
1bd40 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
1bd50 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
1bd60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1bd70 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20  elease(&mem1).  
1bd80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
1bd90 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  1.zMalloc==0 );.
1bda0 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
1bdb0 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
1bdc0 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b  or both of the k
1bdd0 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
1bde0 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
1bdf0 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
1be00 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
1be10 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72  ere equal. Retur
1be20 6e 20 74 68 65 20 74 68 65 20 64 65 66 61 75 6c  n the the defaul
1be30 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
1be40 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43    */.  assert( C
1be50 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20  ORRUPT_DB .     
1be60 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 64 65 66    || pPKey2->def
1be70 61 75 6c 74 5f 72 63 3d 3d 76 64 62 65 52 65 63  ault_rc==vdbeRec
1be80 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1be90 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1bea0 4b 65 79 32 29 20 0a 20 20 20 20 20 20 20 7c 7c  Key2) .       ||
1beb0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d   pKeyInfo->db->m
1bec0 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b  allocFailed.  );
1bed0 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32  .  return pPKey2
1bee0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a  ->default_rc;.}.
1bef0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1bf00 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d  tion is an optim
1bf10 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ized version of 
1bf20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1bf30 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74  dCompare() .** t
1bf40 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73  hat (a) the firs
1bf50 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
1bf60 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c  2 is an integer,
1bf70 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a   and (b) the .**
1bf80 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
1bf90 76 61 72 69 6e 74 20 61 74 20 74 68 65 20 73 74  varint at the st
1bfa0 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b  art of (pKey1/nK
1bfb0 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73  ey1) fits in a s
1bfc0 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69  ingle.** byte (i
1bfd0 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e  .e. is less than
1bfe0 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20   128)..**.** To 
1bff0 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61  avoid concerns a
1c000 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65 72  bout buffer over
1c010 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74  reads, this rout
1c020 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ine is only used
1c030 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77  .** on schemas w
1c040 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  here the maximum
1c050 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 73 69   valid header si
1c060 7a 65 20 69 73 20 36 33 20 62 79 74 65 73 20 6f  ze is 63 bytes o
1c070 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  r less..*/.stati
1c080 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
1c090 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e  CompareInt(.  in
1c0a0 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1c0b0 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
1c0c0 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1c0d0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1c0e0 65 79 32 2c 20 20 20 20 20 20 20 2f 2a 20 52 69  ey2,       /* Ri
1c0f0 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ght key */.  int
1c100 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20   bSkip          
1c110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67             /* Ig
1c120 6e 6f 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 6f  nored */.){.  co
1c130 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26  nst u8 *aKey = &
1c140 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  ((const u8*)pKey
1c150 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70  1)[*(const u8*)p
1c160 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20  Key1 & 0x3F];.  
1c170 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20  int serial_type 
1c180 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b  = ((const u8*)pK
1c190 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72  ey1)[1];.  int r
1c1a0 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75  es;.  u32 y;.  u
1c1b0 36 34 20 78 3b 0a 20 20 69 36 34 20 76 20 3d 20  64 x;.  i64 v = 
1c1c0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
1c1d0 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a  u.i;.  i64 lhs;.
1c1e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1c1f0 45 52 28 62 53 6b 69 70 29 3b 0a 0a 20 20 61 73  ER(bSkip);..  as
1c200 73 65 72 74 28 20 62 53 6b 69 70 3d 3d 30 20 29  sert( bSkip==0 )
1c210 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 28 75  ;.  assert( (*(u
1c220 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33 46 20  8*)pKey1)<=0x3F 
1c230 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1c240 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1c250 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1c260 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74  se 1: { /* 1-byt
1c270 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1c280 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1c290 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  ONE_BYTE_INT(aKe
1c2a0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1c2b0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1c2c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c2d0 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a      case 2: { /*
1c2e0 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   2-byte signed i
1c2f0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1c300 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49  lhs = TWO_BYTE_I
1c310 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1c320 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1c330 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c340 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
1c350 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
1c360 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1c370 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48 52 45        lhs = THRE
1c380 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1c390 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c3a0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1c3b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c3c0 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
1c3d0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1c3e0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20  eger */.      y 
1c3f0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1c400 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c 68  (aKey);.      lh
1c410 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29  s = (i64)*(int*)
1c420 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  &y;.      testca
1c430 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1c440 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c450 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
1c460 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
1c470 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1c480 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  lhs = FOUR_BYTE_
1c490 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28  UINT(aKey+2) + (
1c4a0 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
1c4b0 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1c4c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1c4d0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1c4e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1c4f0 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38    case 6: { /* 8
1c500 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1c510 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20  eger */.      x 
1c520 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1c530 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 78 20  (aKey);.      x 
1c540 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52  = (x<<32) | FOUR
1c550 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1c560 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  4);.      lhs = 
1c570 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
1c580 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1c590 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1c5a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1c5b0 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  8: .      lhs = 
1c5c0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1c5d0 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20      case 9:.    
1c5e0 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20 20    lhs = 1;.     
1c5f0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
1c600 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c 64 20  This case could 
1c610 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74 68 6f  be removed witho
1c620 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
1c630 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69  results of runni
1c640 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63  ng.    ** this c
1c650 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69  ode. Including i
1c660 74 20 63 61 75 73 65 73 20 67 63 63 20 74 6f 20  t causes gcc to 
1c670 67 65 6e 65 72 61 74 65 20 61 20 66 61 73 74 65  generate a faste
1c680 72 20 73 77 69 74 63 68 20 0a 20 20 20 20 2a 2a  r switch .    **
1c690 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69 6e 63   statement (sinc
1c6a0 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 73  e the range of s
1c6b0 77 69 74 63 68 20 74 61 72 67 65 74 73 20 6e 6f  witch targets no
1c6c0 77 20 73 74 61 72 74 73 20 61 74 20 7a 65 72 6f  w starts at zero
1c6d0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 63   and.    ** is c
1c6e0 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74 20 64  ontiguous) but d
1c6f0 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
1c700 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f 64 65  y duplicate code
1c710 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64   to be generated
1c720 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63 63 20  .    ** (as gcc 
1c730 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75 67 68  is clever enough
1c740 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20   to combine the 
1c750 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73 29 2e  two like cases).
1c760 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   Other .    ** c
1c770 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74 20 62  ompilers might b
1c780 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a  e similar.  */ .
1c790 20 20 20 20 63 61 73 65 20 30 3a 20 63 61 73 65      case 0: case
1c7a0 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e   7:.      return
1c7b0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1c7c0 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
1c7d0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1c7e0 30 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  0);..    default
1c7f0 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  :.      return s
1c800 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1c810 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
1c820 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29  Key1, pPKey2, 0)
1c830 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c  ;.  }..  if( v>l
1c840 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  hs ){.    res = 
1c850 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65  pPKey2->r1;.  }e
1c860 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b  lse if( v<lhs ){
1c870 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
1c880 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69  2->r2;.  }else i
1c890 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  f( pPKey2->nFiel
1c8a0 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  d>1 ){.    /* Th
1c8b0 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
1c8c0 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61  f the two keys a
1c8d0 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72  re equal. Compar
1c8e0 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a  e the trailing .
1c8f0 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20      ** fields.  
1c900 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  */.    res = sql
1c910 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1c920 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65  mpare(nKey1, pKe
1c930 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a  y1, pPKey2, 1);.
1c940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1c950 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
1c960 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
1c970 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74   are equal and t
1c980 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69  here are no trai
1c990 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ling.    ** fiel
1c9a0 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79  ds. Return pPKey
1c9b0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e  2->default_rc in
1c9c0 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20   this case. */. 
1c9d0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1c9e0 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 7d  >default_rc;.  }
1c9f0 0a 0a 20 20 61 73 73 65 72 74 28 20 28 72 65 73  ..  assert( (res
1ca00 3d 3d 30 20 26 26 20 76 64 62 65 52 65 63 6f 72  ==0 && vdbeRecor
1ca10 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1ca20 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1ca30 79 32 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 7c  y2)==0).       |
1ca40 7c 20 28 72 65 73 3c 30 20 26 26 20 76 64 62 65  | (res<0 && vdbe
1ca50 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1ca60 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
1ca70 20 70 50 4b 65 79 32 29 3c 30 29 0a 20 20 20 20   pPKey2)<0).    
1ca80 20 20 20 7c 7c 20 28 72 65 73 3e 30 20 26 26 20     || (res>0 && 
1ca90 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1caa0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1cab0 65 79 31 2c 20 70 50 4b 65 79 32 29 3e 30 29 0a  ey1, pPKey2)>0).
1cac0 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
1cad0 54 5f 44 42 0a 20 20 29 3b 0a 20 20 72 65 74 75  T_DB.  );.  retu
1cae0 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
1caf0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1cb00 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76  s an optimized v
1cb10 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
1cb20 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1cb30 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61  re() .** that (a
1cb40 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
1cb50 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61  d of pPKey2 is a
1cb60 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62   string, that (b
1cb70 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
1cb80 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f  d.** uses the co
1cb90 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1cba0 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20   BINARY and (c) 
1cbb0 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66  that the size-of
1cbc0 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a  -header varint .
1cbd0 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ** at the start 
1cbe0 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  of (pKey1/nKey1)
1cbf0 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
1cc00 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  e byte..*/.stati
1cc10 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
1cc20 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20  CompareString(. 
1cc30 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1cc40 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
1cc50 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1cc60 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1cc70 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 2f 2a  pPKey2,       /*
1cc80 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
1cc90 69 6e 74 20 62 53 6b 69 70 0a 29 7b 0a 20 20 63  int bSkip.){.  c
1cca0 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d  onst u8 *aKey1 =
1ccb0 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79   (const u8*)pKey
1ccc0 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f  1;.  int serial_
1ccd0 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b  type;.  int res;
1cce0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1ccf0 54 45 52 28 62 53 6b 69 70 29 3b 0a 0a 20 20 61  TER(bSkip);..  a
1cd00 73 73 65 72 74 28 20 62 53 6b 69 70 3d 3d 30 20  ssert( bSkip==0 
1cd10 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32  );.  getVarint32
1cd20 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69  (&aKey1[1], seri
1cd30 61 6c 5f 74 79 70 65 29 3b 0a 0a 20 20 69 66 28  al_type);..  if(
1cd40 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
1cd50 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
1cd60 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a  ey2->r1;      /*
1cd70 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69   (pKey1/nKey1) i
1cd80 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 20  s a number or a 
1cd90 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  null */.  }else 
1cda0 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70  if( !(serial_typ
1cdb0 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20 20  e & 0x01) ){ .  
1cdc0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1cdd0 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65  r2;      /* (pKe
1cde0 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 62  y1/nKey1) is a b
1cdf0 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  lob */.  }else{.
1ce00 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20      int nCmp;.  
1ce10 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20    int nStr;.    
1ce20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 79  int szHdr = aKey
1ce30 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20  1[0];..    nStr 
1ce40 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
1ce50 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20  2) / 2;.    if( 
1ce60 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 3e  (szHdr + nStr) >
1ce70 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20   nKey1 ){.      
1ce80 70 50 4b 65 79 32 2d 3e 69 73 43 6f 72 72 75 70  pPKey2->isCorrup
1ce90 74 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  t = (u8)SQLITE_C
1cea0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1ceb0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1cec0 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
1ced0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20  .    }.    nCmp 
1cee0 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61  = MIN( pPKey2->a
1cef0 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29  Mem[0].n, nStr )
1cf00 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63  ;.    res = memc
1cf10 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d  mp(&aKey1[szHdr]
1cf20 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  , pPKey2->aMem[0
1cf30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20  ].z, nCmp);..   
1cf40 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
1cf50 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20       res = nStr 
1cf60 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  - pPKey2->aMem[0
1cf70 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ].n;.      if( r
1cf80 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  es==0 ){.       
1cf90 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
1cfa0 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20  eld>1 ){.       
1cfb0 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
1cfc0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1cfd0 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
1cfe0 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20  pPKey2, 1);.    
1cff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d000 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
1d010 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
1d020 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d030 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
1d040 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
1d050 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
1d060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d070 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1d080 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1d090 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
1d0a0 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
1d0b0 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65  Key2->r2;.    }e
1d0c0 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  lse{.      res =
1d0d0 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
1d0e0 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1d0f0 28 20 28 72 65 73 3d 3d 30 20 26 26 20 76 64 62  ( (res==0 && vdb
1d100 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1d110 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1d120 2c 20 70 50 4b 65 79 32 29 3d 3d 30 29 0a 20 20  , pPKey2)==0).  
1d130 20 20 20 20 20 7c 7c 20 28 72 65 73 3c 30 20 26       || (res<0 &
1d140 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  & vdbeRecordComp
1d150 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1d160 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3c 30  pKey1, pPKey2)<0
1d170 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 72 65 73  ).       || (res
1d180 3e 30 20 26 26 20 76 64 62 65 52 65 63 6f 72 64  >0 && vdbeRecord
1d190 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
1d1a0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1d1b0 32 29 3e 30 29 0a 20 20 20 20 20 20 20 7c 7c 20  2)>0).       || 
1d1c0 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20  CORRUPT_DB.     
1d1d0 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65    || pPKey2->pKe
1d1e0 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
1d1f0 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72  cFailed.  );.  r
1d200 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
1d210 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1d220 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
1d230 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1d240 61 72 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65  are() compatible
1d250 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69   function.** sui
1d260 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72  table for compar
1d270 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72  ing serialized r
1d280 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e  ecords to the un
1d290 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61  packed record pa
1d2a0 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f  ssed.** as the o
1d2b0 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
1d2c0 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73  .RecordCompare s
1d2d0 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f  qlite3VdbeFindCo
1d2e0 6d 70 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65  mpare(UnpackedRe
1d2f0 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76  cord *p){.  /* v
1d300 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
1d310 72 65 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69  reInt() and vari
1d320 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  ntRecordCompareS
1d330 74 72 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73  tring() both ass
1d340 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  ume.  ** that th
1d350 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  e size-of-header
1d360 20 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63   varint that occ
1d370 75 72 73 20 61 74 20 74 68 65 20 73 74 61 72 74  urs at the start
1d380 20 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a   of each record.
1d390 20 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73    ** fits in a s
1d3a0 69 6e 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e  ingle byte (i.e.
1d3b0 20 69 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29   is 127 or less)
1d3c0 2e 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  . varintRecordCo
1d3d0 6d 70 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20  mpareInt().  ** 
1d3e0 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
1d3f0 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
1d400 6f 76 65 72 72 65 61 64 20 61 20 62 75 66 66 65  overread a buffe
1d410 72 20 62 79 20 61 74 20 6c 65 61 73 74 20 74 68  r by at least th
1d420 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20  e .  ** maximum 
1d430 70 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68  possible legal h
1d440 65 61 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20  eader size plus 
1d450 38 20 62 79 74 65 73 2e 20 42 65 63 61 75 73 65  8 bytes. Because
1d460 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67   there is.  ** g
1d470 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1d480 61 74 20 6c 65 61 73 74 20 37 34 20 28 62 75 74  at least 74 (but
1d490 20 6e 6f 74 20 31 33 36 29 20 62 79 74 65 73 20   not 136) bytes 
1d4a0 6f 66 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f  of padding follo
1d4b0 77 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62  wing each.  ** b
1d4c0 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20  uffer passed to 
1d4d0 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
1d4e0 61 72 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61  areInt() this ma
1d4f0 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e  kes it convenien
1d500 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20  t to.  ** limit 
1d510 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1d520 68 65 61 64 65 72 20 74 6f 20 36 34 20 62 79 74  header to 64 byt
1d530 65 73 20 69 6e 20 63 61 73 65 73 20 77 68 65 72  es in cases wher
1d540 65 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  e the first fiel
1d550 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74  d.  ** is an int
1d560 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  eger..  **.  ** 
1d570 54 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20  The easiest way 
1d580 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
1d590 6c 69 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73  limit is to cons
1d5a0 69 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64  ider only record
1d5b0 73 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66  s with.  ** 13 f
1d5c0 69 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49  ields or less. I
1d5d0 66 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  f the first fiel
1d5e0 64 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c  d is an integer,
1d5f0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   the maximum leg
1d600 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73  al.  ** header s
1d610 69 7a 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31  ize is (12*5 + 1
1d620 20 2b 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f   + 1) bytes.  */
1d630 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49  .  if( (p->pKeyI
1d640 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d  nfo->nField + p-
1d650 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  >pKeyInfo->nXFie
1d660 6c 64 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69  ld)<=13 ){.    i
1d670 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d  nt flags = p->aM
1d680 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20  em[0].flags;.   
1d690 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f   if( p->pKeyInfo
1d6a0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20  ->aSortOrder[0] 
1d6b0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d  ){.      p->r1 =
1d6c0 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20   1;.      p->r2 
1d6d0 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
1d6e0 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d  .      p->r1 = -
1d6f0 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d  1;.      p->r2 =
1d700 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
1d710 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  ( (flags & MEM_I
1d720 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  nt) ){.      ret
1d730 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
1d740 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a  mpareInt;.    }.
1d750 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
1d760 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
1d770 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d780 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
1d790 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1d7a0 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ( flags & MEM_Bl
1d7b0 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66  ob );.    if( (f
1d7c0 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c  lags & (MEM_Real
1d7d0 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c  |MEM_Null|MEM_Bl
1d7e0 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b  ob))==0 && p->pK
1d7f0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
1d800 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
1d810 65 72 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ert( flags & MEM
1d820 5f 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65  _Str );.      re
1d830 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43  turn vdbeRecordC
1d840 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20  ompareString;.  
1d850 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1d860 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
1d870 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f  ordCompare;.}../
1d880 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73  *.** pCur points
1d890 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   at an index ent
1d8a0 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ry created using
1d8b0 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
1d8c0 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65  rd opcode..** Re
1d8d0 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68  ad the rowid (th
1d8e0 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20  e last field in 
1d8f0 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20  the record) and 
1d900 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77  store it in *row
1d910 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  id..** Return SQ
1d920 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
1d930 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20  thing works, or 
1d940 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  an error code ot
1d950 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70  herwise..**.** p
1d960 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69  Cur might be poi
1d970 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62  nting to text ob
1d980 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f  tained from a co
1d990 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
1d9a0 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63  ile..** So the c
1d9b0 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65  ontent cannot be
1d9c0 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70   trusted.  Do ap
1d9d0 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73  propriate checks
1d9e0 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e   on the content.
1d9f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1da00 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69  dbeIdxRowid(sqli
1da10 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f  te3 *db, BtCurso
1da20 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
1da30 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
1da40 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
1da50 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  rc;.  u32 szHdr;
1da60 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1da70 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
1da80 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
1da90 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
1daa0 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
1dab0 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77   */.  u32 lenRow
1dac0 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  id;     /* Size 
1dad0 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
1dae0 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55    Mem m, v;..  U
1daf0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1db00 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  db);..  /* Get t
1db10 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  he size of the i
1db20 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c  ndex entry.  Onl
1db30 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65  y indices entrie
1db40 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74  s of less.  ** t
1db50 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70  han 2GiB are sup
1db60 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20  port - anything 
1db70 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61  large must be da
1db80 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1db90 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72  n..  ** Any corr
1dba0 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
1dbb0 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72  ed in sqlite3Btr
1dbc0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
1dbd0 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a  , though, so.  *
1dbe0 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20  * this code can 
1dbf0 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68  safely assume th
1dc00 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33  at nCellKey is 3
1dc10 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20  2-bits  .  */.  
1dc20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1dc30 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
1dc40 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41  d(pCur) );.  VVA
1dc50 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69  _ONLY(rc =) sqli
1dc60 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
1dc70 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
1dc80 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
1dc90 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
1dca0 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
1dcb0 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
1dcc0 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
1dcd0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43  */.  assert( (nC
1dce0 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f  ellKey & SQLITE_
1dcf0 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e  MAX_U32)==(u64)n
1dd00 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a  CellKey );..  /*
1dd10 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
1dd20 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
1dd30 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
1dd40 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c   */.  memset(&m,
1dd50 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a   0, sizeof(m));.
1dd60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
1dd70 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
1dd80 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65  Cur, 0, (u32)nCe
1dd90 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
1dda0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
1ddb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
1ddc0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e   /* The index en
1ddd0 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77  try must begin w
1dde0 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a  ith a header siz
1ddf0 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  e */.  (void)get
1de00 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
1de10 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73  z, szHdr);.  tes
1de20 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20  tcase( szHdr==3 
1de30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
1de40 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69  zHdr==m.n );.  i
1de50 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64  f( unlikely(szHd
1de60 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64  r<3 || (int)szHd
1de70 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f  r>m.n) ){.    go
1de80 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
1de90 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
1dea0 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c  /* The last fiel
1deb0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73  d of the index s
1dec0 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
1ded0 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e  ger - the ROWID.
1dee0 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61  .  ** Verify tha
1def0 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
1df00 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e   really is an in
1df10 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69  teger. */.  (voi
1df20 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
1df30 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
1df40 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
1df50 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
1df60 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74  wid==1 );.  test
1df70 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
1df80 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =2 );.  testcase
1df90 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29  ( typeRowid==3 )
1dfa0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
1dfb0 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20  peRowid==4 );.  
1dfc0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
1dfd0 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74  wid==5 );.  test
1dfe0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
1dff0 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =6 );.  testcase
1e000 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29  ( typeRowid==8 )
1e010 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
1e020 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20  peRowid==9 );.  
1e030 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70  if( unlikely(typ
1e040 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65  eRowid<1 || type
1e050 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52  Rowid>9 || typeR
1e060 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20  owid==7) ){.    
1e070 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
1e080 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  orruption;.  }. 
1e090 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
1e0a0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1e0b0 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
1e0c0 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33  .  testcase( (u3
1e0d0 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e  2)m.n==szHdr+len
1e0e0 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75  Rowid );.  if( u
1e0f0 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e  nlikely((u32)m.n
1e100 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29  <szHdr+lenRowid)
1e110 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
1e120 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
1e130 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74  n;.  }..  /* Fet
1e140 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f  ch the integer o
1e150 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
1e160 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  e index record *
1e170 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  /.  sqlite3VdbeS
1e180 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d  erialGet((u8*)&m
1e190 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d  .z[m.n-lenRowid]
1e1a0 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29  , typeRowid, &v)
1e1b0 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75  ;.  *rowid = v.u
1e1c0 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
1e1d0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
1e1e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e1f0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
1e200 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65  here if database
1e210 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
1e220 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20  etected after m 
1e230 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c  has been.  ** al
1e240 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74  located.  Free t
1e250 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20  he m object and 
1e260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e270 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f  RRUPT. */.idx_ro
1e280 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a  wid_corruption:.
1e290 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d    testcase( m.zM
1e2a0 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71  alloc!=0 );.  sq
1e2b0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1e2c0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
1e2d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1e2e0 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _BKPT;.}../*.** 
1e2f0 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
1e300 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
1e310 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
1e320 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  C is pointing to
1e330 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
1e340 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55  key string in pU
1e350 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20  npacked.  Write 
1e360 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d  into *pRes a num
1e370 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e  ber.** that is n
1e380 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
1e390 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43  r positive if pC
1e3a0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1e3b0 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67  qual to,.** or g
1e3c0 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70  reater than pUnp
1e3d0 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53  acked.  Return S
1e3e0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
1e3f0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61  ess..**.** pUnpa
1e400 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63  cked is either c
1e410 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
1e420 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
1e430 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
1e440 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
1e450 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
1e460 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
1e470 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
1e480 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
1e490 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
1e4a0 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f    Hence, this ro
1e4b0 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61  utine only compa
1e4c0 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73  res the prefixes
1e4d0 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73   .** of the keys
1e4e0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69   prior to the fi
1e4f0 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74  nal rowid, not t
1e500 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a  he entire key..*
1e510 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
1e520 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a  eIdxKeyCompare(.
1e530 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
1e540 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e550 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1e560 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
1e570 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  nst */.  Unpacke
1e580 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b  dRecord *pUnpack
1e590 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70  ed,       /* Unp
1e5a0 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
1e5b0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72   key */.  int *r
1e5c0 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
1e5d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1e5e0 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
1e5f0 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
1e600 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
1e610 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
1e620 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
1e630 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  Cur = pC->pCurso
1e640 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61  r;.  Mem m;..  a
1e650 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1e660 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
1e670 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f  (pCur) );.  VVA_
1e680 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74  ONLY(rc =) sqlit
1e690 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
1e6a0 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
1e6b0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
1e6c0 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f  QLITE_OK );    /
1e6d0 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73  * pCur is always
1e6e0 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a   valid so KeySiz
1e6f0 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  e cannot fail */
1e700 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77  .  /* nCellKey w
1e710 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65  ill always be be
1e720 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66  tween 0 and 0xff
1e730 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f  ffffff because o
1e740 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74  f the way.  ** t
1e750 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65  hat btreeParseCe
1e760 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69  llPtr() and sqli
1e770 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29  te3GetVarint32()
1e780 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64   are implemented
1e790 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b   */.  if( nCellK
1e7a0 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65  ey<=0 || nCellKe
1e7b0 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a  y>0x7fffffff ){.
1e7c0 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20      *res = 0;.  
1e7d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e7e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1e7f0 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30  }.  memset(&m, 0
1e800 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20  , sizeof(m));.  
1e810 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
1e820 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d  MemFromBtree(pC-
1e830 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 33  >pCursor, 0, (u3
1e840 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  2)nCellKey, 1, &
1e850 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
1e860 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e870 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69   }.  *res = sqli
1e880 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1e890 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70  pare(m.n, m.z, p
1e8a0 55 6e 70 61 63 6b 65 64 2c 20 30 29 3b 0a 20 20  Unpacked, 0);.  
1e8b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1e8c0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
1e8d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e8e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1e8f0 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61  tine sets the va
1e900 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
1e910 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
1e920 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
1e930 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f  ite3_changes() o
1e940 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
1e950 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a  andle 'db'. .*/.
1e960 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1e970 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74  SetChanges(sqlit
1e980 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61  e3 *db, int nCha
1e990 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nge){.  assert( 
1e9a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1e9b0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
1e9c0 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
1e9d0 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e   nChange;.  db->
1e9e0 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20  nTotalChange += 
1e9f0 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
1ea00 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20  * Set a flag in 
1ea10 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61  the vdbe to upda
1ea20 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  te the change co
1ea30 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73  unter when it is
1ea40 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72   finalised.** or
1ea50 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20   reset..*/.void 
1ea60 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
1ea70 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29  Changes(Vdbe *v)
1ea80 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74  {.  v->changeCnt
1ea90 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  On = 1;.}../*.**
1eaa0 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70   Mark every prep
1eab0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
1eac0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
1ead0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1eae0 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72  tion.** as expir
1eaf0 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70  ed..**.** An exp
1eb00 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ired statement m
1eb10 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70  eans that recomp
1eb20 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
1eb30 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72  tatement is.** r
1eb40 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65  ecommend.  State
1eb50 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65  ments expire whe
1eb60 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  n things happen 
1eb70 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a  that make their.
1eb80 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f  ** programs obso
1eb90 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20  lete.  Removing 
1eba0 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
1ebb0 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74  ctions or collat
1ebc0 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73  ing.** sequences
1ebd0 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e  , or changing an
1ebe0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
1ebf0 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20  unction are the 
1ec00 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e  types of.** thin
1ec10 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65  gs that make pre
1ec20 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
1ec30 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f   obsolete..*/.vo
1ec40 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65  id sqlite3Expire
1ec50 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
1ec60 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
1ec70 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f  .  Vdbe *p;.  fo
1ec80 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b  r(p = db->pVdbe;
1ec90 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
1eca0 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
1ecb0 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
1ecc0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
1ecd0 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
1ece0 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a   with the Vdbe..
1ecf0 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
1ed00 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a  te3VdbeDb(Vdbe *
1ed10 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
1ed20 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  db;.}../*.** Ret
1ed30 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1ed40 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
1ed50 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
1ed60 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
1ed70 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
1ed80 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76  ter iVar of VM v
1ed90 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65  . Except, if the
1eda0 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c   value is an SQL
1edb0 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a   NULL, return .*
1edc0 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c  * 0 instead. Unl
1edd0 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20  ess it is NULL, 
1ede0 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61  apply affinity a
1edf0 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53  ff (one of the S
1ee00 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63  QLITE_AFF_*.** c
1ee10 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65  onstants) to the
1ee20 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
1ee30 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  turning it..**.*
1ee40 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
1ee50 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65  alue must be fre
1ee60 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1ee70 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61   using sqlite3Va
1ee80 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71  lueFree()..*/.sq
1ee90 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c  lite3_value *sql
1eea0 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
1eeb0 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69  Value(Vdbe *v, i
1eec0 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29  nt iVar, u8 aff)
1eed0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
1eee0 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  >0 );.  if( v ){
1eef0 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
1ef00 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31   &v->aVar[iVar-1
1ef10 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  ];.    if( 0==(p
1ef20 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
1ef30 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  _Null) ){.      
1ef40 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
1ef50 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Ret = sqlite3Val
1ef60 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20  ueNew(v->db);.  
1ef70 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
1ef80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ef90 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20  dbeMemCopy((Mem 
1efa0 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20  *)pRet, pMem);. 
1efb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
1efc0 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
1efd0 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49  (pRet, aff, SQLI
1efe0 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
1eff0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
1f000 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Ret;.    }.  }. 
1f010 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1f020 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51  .** Configure SQ
1f030 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20  L variable iVar 
1f040 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20  so that binding 
1f050 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69  a new value to i
1f060 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20  t signals.** to 
1f070 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69  sqlite3_reoptimi
1f080 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65  ze() that re-pre
1f090 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
1f0a0 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a  ment may result.
1f0b0 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71  ** in a better q
1f0c0 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f  uery plan..*/.vo
1f0d0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
1f0e0 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76  tVarmask(Vdbe *v
1f0f0 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61  , int iVar){.  a
1f100 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
1f110 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29  .  if( iVar>32 )
1f120 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
1f130 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   = 0xffffffff;. 
1f140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65   }else{.    v->e
1f150 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29  xpmask |= ((u32)
1f160 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a  1 << (iVar-1));.
1f170 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
1f180 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1f190 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72  ALTABLE./*.** Tr
1f1a0 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73  ansfer error mes
1f1b0 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61  sage text from a
1f1c0 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a  n sqlite3_vtab.z
1f1d0 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f  ErrMsg (text sto
1f1e0 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  red.** in memory
1f1f0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
1f200 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69  qlite3_malloc) i
1f210 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d  nto a Vdbe.zErrM
1f220 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a  sg (text stored.
1f230 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ** in memory obt
1f240 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1f250 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a  e3DbMalloc)..*/.
1f260 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62  void sqlite3Vtab
1f270 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62  ImportErrmsg(Vdb
1f280 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74  e *p, sqlite3_vt
1f290 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71  ab *pVtab){.  sq
1f2a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
1f2b0 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  b;.  sqlite3DbFr
1f2c0 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
1f2d0 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
1f2e0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
1f2f0 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45  up(db, pVtab->zE
1f300 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
1f310 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45  3_free(pVtab->zE
1f320 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d  rrMsg);.  pVtab-
1f330 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a  >zErrMsg = 0;.}.
1f340 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1f350 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1f360 4c 45 20 2a 2f 0a                                LE */.