/ Hex Artifact Content
Login

Artifact 211ad29d51e01c44a0db1ab69b74c11c8de1cccf:


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 6e 20 4f  ng.** after an O
6340: 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74  OM fault without
6350: 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b   having to check
6360: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
6370: 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74  eturn from .** t
6380: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
6390: 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20   valid pointer. 
63a0: 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
63b0: 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73   dummy.opcode is
63c0: 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c   0,.** dummy wil
63d0: 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74  l never be writt
63e0: 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  en to.  This is 
63f0: 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65  verified by code
6400: 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a   inspection and.
6410: 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69  ** by running wi
6420: 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a  th Valgrind..*/.
6430: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
6440: 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70  dbeGetOp(Vdbe *p
6450: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f  , int addr){.  /
6460: 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20  * C89 specifies 
6470: 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e  that the constan
6480: 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62  t "dummy" will b
6490: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
64a0: 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c   all.  ** zeros,
64b0: 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63   which is correc
64c0: 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74  t.  MSVC generat
64d0: 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65  es a warning, ne
64e0: 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20  vertheless. */. 
64f0: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64   static VdbeOp d
6500: 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  ummy;  /* Ignore
6510: 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e   the MSVC warnin
6520: 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69  g about no initi
6530: 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65  alizer */.  asse
6540: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
6550: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
6560: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
6570: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
6580: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73  Op - 1;.  }.  as
6590: 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26  sert( (addr>=0 &
65a0: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c  & addr<p->nOp) |
65b0: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
65c0: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
65d0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
65e0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
65f0: 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79   (VdbeOp*)&dummy
6600: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
6610: 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64  eturn &p->aOp[ad
6620: 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  dr];.  }.}..#if 
6630: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
6640: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
6650: 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65  MMENTS)./*.** Re
6660: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
6670: 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66  value for one of
6680: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
6690: 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f  to the opcode pO
66a0: 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20  p.** determined 
66b0: 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a  by character c..
66c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72  */.static int tr
66d0: 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c  anslateP(char c,
66e0: 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b   const Op *pOp){
66f0: 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20  .  if( c=='1' ) 
6700: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a  return pOp->p1;.
6710: 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72    if( c=='2' ) r
6720: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20  eturn pOp->p2;. 
6730: 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65   if( c=='3' ) re
6740: 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20  turn pOp->p3;.  
6750: 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74  if( c=='4' ) ret
6760: 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20  urn pOp->p4.i;. 
6770: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b   return pOp->p5;
6780: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  .}../*.** Comput
6790: 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74  e a string for t
67a0: 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65  he "comment" fie
67b0: 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63  ld of a VDBE opc
67c0: 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a  ode listing..**.
67d0: 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a  ** The Synopsis:
67e0: 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e   field in commen
67f0: 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63  ts in the vdbe.c
6800: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74   source file get
6810: 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74  s converted.** t
6820: 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e  o an extra strin
6830: 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e 64  g that is append
6840: 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ed to the sqlite
6850: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20  3OpcodeName().  
6860: 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63  In the.** absenc
6870: 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65  e of other comme
6880: 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73  nts, this synops
6890: 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  is becomes the c
68a0: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70  omment on the op
68b0: 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72  code..** Some tr
68c0: 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73  anslation occurs
68d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50  :.**.**       "P
68e0: 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58  X"      ->  "r[X
68f0: 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40  ]".**       "PX@
6900: 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY"   ->  "r[X..
6910: 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78  X+Y-1]"  or "r[x
6920: 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 20  ]" if y is 0 or 
6930: 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50  1.**       "PX@P
6940: 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58  Y+1" ->  "r[X..X
6950: 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d  +Y]"    or "r[x]
6960: 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20  " if y is 0.**  
6970: 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d       "PY..PY"  -
6980: 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20  >  "r[X..Y]"    
6990: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
69a0: 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  <=x.*/.static in
69b0: 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74  t displayComment
69c0: 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f  (.  const Op *pO
69d0: 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  p,     /* The op
69e0: 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65  code to be comme
69f0: 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  nted */.  const 
6a00: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20  char *zP4,   /* 
6a10: 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69  Previously obtai
6a20: 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34  ned value for P4
6a30: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d   */.  char *zTem
6a40: 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  p,       /* Writ
6a50: 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  e result here */
6a60: 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20  .  int nTemp    
6a70: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61        /* Space a
6a80: 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d  vailable in zTem
6a90: 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  p[] */.){.  cons
6aa0: 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b  t char *zOpName;
6ab0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6ac0: 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20  Synopsis;.  int 
6ad0: 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69  nOpName;.  int i
6ae0: 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65  i, jj;.  zOpName
6af0: 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65   = sqlite3Opcode
6b00: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
6b10: 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73  );.  nOpName = s
6b20: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
6b30: 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  OpName);.  if( z
6b40: 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31  OpName[nOpName+1
6b50: 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65  ] ){.    int see
6b60: 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68  nCom = 0;.    ch
6b70: 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70  ar c;.    zSynop
6b80: 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d  sis = zOpName +=
6b90: 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20   nOpName + 1;.  
6ba0: 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a    for(ii=jj=0; j
6bb0: 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20  j<nTemp-1 && (c 
6bc0: 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29  = zSynopsis[ii])
6bd0: 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  !=0; ii++){.    
6be0: 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a    if( c=='P' ){.
6bf0: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e          c = zSyn
6c00: 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20  opsis[++ii];.   
6c10: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20       if( c=='4' 
6c20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
6c30: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6c40: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
6c50: 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20  , "%s", zP4);.  
6c60: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6c70: 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20  c=='X' ){.      
6c80: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6c90: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
6ca0: 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70  Temp+jj, "%s", p
6cb0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
6cc0: 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d           seenCom
6cd0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
6ce0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
6cf0: 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74  nt v1 = translat
6d00: 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20  eP(c, pOp);.    
6d10: 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20        int v2;.  
6d20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6d30: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
6d40: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64  j, zTemp+jj, "%d
6d50: 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20  ", v1);.        
6d60: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53    if( strncmp(zS
6d70: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40  ynopsis+ii+1, "@
6d80: 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20  P", 2)==0 ){.   
6d90: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33           ii += 3
6da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  ;.            jj
6db0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
6dc0: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
6dd0: 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d 20             v2 = 
6de0: 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f  translateP(zSyno
6df0: 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a  psis[ii], pOp);.
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6e10: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
6e20: 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d  s+ii+1,"+1",2)==
6e30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6e40: 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20     ii += 2;.    
6e50: 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a            v2++;.
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6e70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 32            if( v2
6e80: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
6e90: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6ea0: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
6eb0: 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c  Temp+jj, "..%d",
6ec0: 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20   v1+v2-1);.     
6ed0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6ee0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
6ef0: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
6f00: 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d  i+1, "..P3", 4)=
6f10: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30  =0 && pOp->p3==0
6f20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6f30: 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  ii += 4;.       
6f40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
6f50: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
6f60: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
6f70: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65  mp+jj);.      }e
6f80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65  lse{.        zTe
6f90: 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  mp[jj++] = c;.  
6fa0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6fb0: 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20  if( !seenCom && 
6fc0: 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f  jj<nTemp-5 && pO
6fd0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
6fe0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6ff0: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
7000: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22  zTemp+jj, "; %s"
7010: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
7020: 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71  ;.      jj += sq
7030: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
7040: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20  emp+jj);.    }. 
7050: 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20     if( jj<nTemp 
7060: 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b  ) zTemp[jj] = 0;
7070: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70  .  }else if( pOp
7080: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
7090: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
70a0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
70b0: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d   "%s", pOp->zCom
70c0: 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20  ment);.    jj = 
70d0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
70e0: 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  zTemp);.  }else{
70f0: 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20  .    zTemp[0] = 
7100: 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20  0;.    jj = 0;. 
7110: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a   }.  return jj;.
7120: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
7130: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a 23 69  TE_DEBUG */...#i
7140: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
7150: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
7160: 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  || !defined(NDEB
7170: 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65  UG) \.     || de
7180: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
7190: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
71a0: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
71b0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
71c0: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
71d0: 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65  es the P4 parame
71e0: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
71f0: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
7200: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
7210: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
7220: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
7230: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
7240: 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P4(Op *pOp, char
7250: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
7260: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  mp){.  char *zP4
7270: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65   = zTemp;.  asse
7280: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
7290: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
72a0: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
72b0: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
72c0: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
72d0: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
72e0: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
72f0: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
7300: 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
7310: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
7320: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
7330: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7340: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28 25 64  mp, zTemp, "k(%d
7350: 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  ", pKeyInfo->nFi
7360: 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20  eld);.      i = 
7370: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7380: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  zTemp);.      fo
7390: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66  r(j=0; j<pKeyInf
73a0: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  o->nField; j++){
73b0: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
73c0: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
73d0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
73e0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
73f0: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20   *zColl = pColl 
7400: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a  ? pColl->zName :
7410: 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20 20   "nil";.        
7420: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  int n = sqlite3S
7430: 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a  trlen30(zColl);.
7440: 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 36          if( n==6
7450: 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c 6c   && memcmp(zColl
7460: 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d 30 20  ,"BINARY",6)==0 
7470: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f  ){.          zCo
7480: 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20  ll = "B";.      
7490: 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20      n = 1;.     
74a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
74b0: 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a   i+n>nTemp-6 ){.
74c0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
74d0: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e  (&zTemp[i],",...
74e0: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
74f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
7500: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69  .        zTemp[i
7510: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
7520: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
7530: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29  >aSortOrder[j] )
7540: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d  {.          zTem
7550: 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20  p[i++] = '-';.  
7560: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7570: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
7580: 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a 20  , zColl, n+1);. 
7590: 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20         i += n;. 
75a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65       }.      zTe
75b0: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20  mp[i++] = ')';. 
75c0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20       zTemp[i] = 
75d0: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
75e0: 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20   i<nTemp );.    
75f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7600: 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53     case P4_COLLS
7610: 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  EQ: {.      Coll
7620: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70  Seq *pColl = pOp
7630: 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20  ->p4.pColl;.    
7640: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7650: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7660: 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c   "(%.20s)", pCol
7670: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
7680: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7690: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
76a0: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  F: {.      FuncD
76b0: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
76c0: 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  p4.pFunc;.      
76d0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
76e0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
76f0: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
7700: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
7710: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7720: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7730: 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20  4_INT64: {.     
7740: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7750: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7760: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34  "%lld", *pOp->p4
7770: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72  .pI64);.      br
7780: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7790: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a  ase P4_INT32: {.
77a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
77b0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
77c0: 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e  emp, "%d", pOp->
77d0: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65  p4.i);.      bre
77e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
77f0: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20  se P4_REAL: {.  
7800: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7810: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7820: 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70  p, "%.16g", *pOp
7830: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20  ->p4.pReal);.   
7840: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7850: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
7860: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d   {.      Mem *pM
7870: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  em = pOp->p4.pMe
7880: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  m;.      if( pMe
7890: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  m->flags & MEM_S
78a0: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  tr ){.        zP
78b0: 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  4 = pMem->z;.   
78c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
78d0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
78e0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
78f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7900: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
7910: 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b  ld", pMem->u.i);
7920: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
7930: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
7940: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
7950: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7960: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7970: 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d  , "%.16g", pMem-
7980: 3e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >r);.      }else
7990: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
79a0: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
79b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
79c0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
79d0: 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20  Temp, "NULL");. 
79e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
79f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
7a00: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
7a10: 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50  ob );.        zP
7a20: 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20  4 = "(blob)";.  
7a30: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7a40: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
7a50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7a60: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
7a70: 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20  se P4_VTAB: {.  
7a80: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
7a90: 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70   *pVtab = pOp->p
7aa0: 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a  4.pVtab->pVtab;.
7ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7ac0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
7ad0: 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70  emp, "vtab:%p:%p
7ae0: 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d  ", pVtab, pVtab-
7af0: 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20  >pModule);.     
7b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7b10: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
7b20: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
7b30: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7b40: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7b50: 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20  , "intarray");. 
7b60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7b70: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55  }.    case P4_SU
7b80: 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20  BPROGRAM: {.    
7b90: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7ba0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7bb0: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20   "program");.   
7bc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7bd0: 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41      case P4_ADVA
7be0: 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65  NCE: {.      zTe
7bf0: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
7c00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7c10: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
7c20: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34     zP4 = pOp->p4
7c30: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  .z;.      if( zP
7c40: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  4==0 ){.        
7c50: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP4 = zTemp;.   
7c60: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
7c70: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
7c80: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a  .  }.  assert( z
7c90: 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  P4!=0 );.  retur
7ca0: 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n zP4;.}.#endif.
7cb0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
7cc0: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20  o the Vdbe that 
7cd0: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74  the BTree object
7ce0: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69   at db->aDb[i] i
7cf0: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s used..**.** Th
7d00: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
7d10: 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e  ments need to kn
7d20: 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68  ow in advance th
7d30: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f  e complete set o
7d40: 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61  f.** attached da
7d50: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
7d60: 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73  l be use.  A mas
7d70: 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62  k of these datab
7d80: 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74  ases.** is maint
7d90: 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65  ained in p->btre
7da0: 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c  eMask.  The p->l
7db0: 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73  ockMask value is
7dc0: 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a   the subset of.*
7dd0: 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f  * p->btreeMask o
7de0: 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  f databases that
7df0: 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
7e00: 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lock..*/.void sq
7e10: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
7e20: 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ee(Vdbe *p, int 
7e30: 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  i){.  assert( i>
7e40: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e  =0 && i<p->db->n
7e50: 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a  Db && i<(int)siz
7e60: 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29  eof(yDbMask)*8 )
7e70: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69  ;.  assert( i<(i
7e80: 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72  nt)sizeof(p->btr
7e90: 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44  eeMask)*8 );.  D
7ea0: 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65  bMaskSet(p->btre
7eb0: 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28  eMask, i);.  if(
7ec0: 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33   i!=1 && sqlite3
7ed0: 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d  BtreeSharable(p-
7ee0: 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  >db->aDb[i].pBt)
7ef0: 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65   ){.    DbMaskSe
7f00: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69  t(p->lockMask, i
7f10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  );.  }.}..#if !d
7f20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7f30: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
7f40: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
7f50: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66  DSAFE>0./*.** If
7f60: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
7f70: 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73  led to support s
7f80: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
7f90: 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61   and to be threa
7fa0: 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72  dsafe,.** this r
7fb0: 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74  outine obtains t
7fc0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
7fd0: 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74  ted with each Bt
7fe0: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
7ff0: 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20  .** that may be 
8000: 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20  accessed by the 
8010: 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
8020: 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69  argument. In doi
8030: 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a  ng so it also.**
8040: 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72   sets the BtShar
8050: 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20  ed.db member of 
8060: 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68  each of the BtSh
8070: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c  ared structures,
8080: 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61   ensuring.** tha
8090: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75  t the correct bu
80a0: 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
80b0: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69  ack is invoked i
80c0: 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a  f required..**.*
80d0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
80e0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75  ot threadsafe bu
80f0: 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73  t does support s
8100: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
8110: 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  , then.** sqlite
8120: 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73  3BtreeEnter() is
8130: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
8140: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
8150: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20  variables.** of 
8160: 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20  all of BtShared 
8170: 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73  structures acces
8180: 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61  sible via the da
8190: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a  tabase handle .*
81a0: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
81b0: 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20  h the VM..**.** 
81c0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
81d0: 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20   threadsafe and 
81e0: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
81f0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
8200: 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  de, this.** func
8210: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
8220: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74  .**.** The p->bt
8230: 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73  reeMask field is
8240: 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c   a bitmask of al
8250: 6c 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68  l btrees that th
8260: 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73  e prepared .** s
8270: 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20  tatement p will 
8280: 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e  ever use.  Let N
8290: 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
82a0: 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72  f bits in p->btr
82b0: 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  eeMask.** corres
82c0: 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65  ponding to btree
82d0: 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65  s that use share
82e0: 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74  d cache.  Then t
82f0: 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a  he runtime of.**
8300: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8310: 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20   N*N.  But as N 
8320: 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74  is rarely more t
8330: 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75  han 1, this shou
8340: 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70  ld not.** be a p
8350: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
8360: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
8370: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
8380: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
8390: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
83a0: 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44  int nDb;.  if( D
83b0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e  bMaskAllZero(p->
83c0: 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75  lockMask) ) retu
83d0: 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  rn;  /* The comm
83e0: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20  on case */.  db 
83f0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
8400: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
8410: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
8420: 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  (i=0; i<nDb; i++
8430: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
8440: 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  && DbMaskTest(p-
8450: 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20  >lockMask,i) && 
8460: 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42  ALWAYS(aDb[i].pB
8470: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  t!=0) ){.      s
8480: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
8490: 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  (aDb[i].pBt);.  
84a0: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
84b0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
84c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
84d0: 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49  D_CACHE) && SQLI
84e0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a  TE_THREADSAFE>0.
84f0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c  /*.** Unlock all
8500: 20 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70   of the btrees p
8510: 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64  reviously locked
8520: 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   by a call to sq
8530: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29  lite3VdbeEnter()
8540: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8550: 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20  3VdbeLeave(Vdbe 
8560: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
8570: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
8580: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b *aDb;.  int nD
8590: 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41  b;.  if( DbMaskA
85a0: 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61  llZero(p->lockMa
85b0: 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  sk) ) return;  /
85c0: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
85d0: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e */.  db = p->d
85e0: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
85f0: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
8600: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  nDb;.  for(i=0; 
8610: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nDb; i++){.   
8620: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d   if( i!=1 && DbM
8630: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d  askTest(p->lockM
8640: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53  ask,i) && ALWAYS
8650: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
8660: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8670: 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69  BtreeLeave(aDb[i
8680: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
8690: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
86a0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
86b0: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
86c0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
86d0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
86e0: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
86f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
8700: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
8710: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
8720: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
8730: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
8740: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
8750: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68   char *zP4;.  ch
8760: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63  ar zPtr[50];.  c
8770: 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20  har zCom[100];. 
8780: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
8790: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22  ar *zFormat1 = "
87a0: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34  %4d %-13s %4d %4
87b0: 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58  d %4d %-13s %.2X
87c0: 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f   %s\n";.  if( pO
87d0: 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73  ut==0 ) pOut = s
87e0: 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64  tdout;.  zP4 = d
87f0: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50  isplayP4(pOp, zP
8800: 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29  tr, sizeof(zPtr)
8810: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
8820: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
8830: 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c  COMMENTS.  displ
8840: 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a  ayComment(pOp, z
8850: 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66  P4, zCom, sizeof
8860: 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20  (zCom));.#else. 
8870: 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65   zCom[0] = 0;.#e
8880: 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54  ndif.  /* NB:  T
8890: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
88a0: 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  Name() function 
88b0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
88c0: 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20  y code created. 
88d0: 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63   ** by the mkopc
88e0: 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f  odeh.awk and mko
88f0: 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70  pcodec.awk scrip
8900: 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63 74  ts which extract
8910: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d   the.  ** inform
8920: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76  ation from the v
8930: 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78  dbe.c source tex
8940: 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70  t */.  fprintf(p
8950: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70  Out, zFormat1, p
8960: 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  c, .      sqlite
8970: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
8980: 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70  >opcode), pOp->p
8990: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d  1, pOp->p2, pOp-
89a0: 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70  >p3, zP4, pOp->p
89b0: 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20  5,.      zCom.  
89c0: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74  );.  fflush(pOut
89d0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
89e0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72  ** Release an ar
89f0: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65  ray of N Mem ele
8a00: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
8a10: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41  void releaseMemA
8a20: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74  rray(Mem *p, int
8a30: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20   N){.  if( p && 
8a40: 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45  N ){.    Mem *pE
8a50: 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  nd;.    sqlite3 
8a60: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  *db = p->db;.   
8a70: 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65   u8 malloc_faile
8a80: 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  d = db->mallocFa
8a90: 69 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64 62  iled;.    if( db
8aa0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29  ->pnBytesFreed )
8ab0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 45 6e 64  {.      for(pEnd
8ac0: 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20  =&p[N]; p<pEnd; 
8ad0: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  p++){.        sq
8ae0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8af0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
8b00: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
8b10: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  n;.    }.    for
8b20: 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70  (pEnd=&p[N]; p<p
8b30: 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
8b40: 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29   assert( (&p[1])
8b50: 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64  ==pEnd || p[0].d
8b60: 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20  b==p[1].db );.  
8b70: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
8b80: 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49  te3VdbeCheckMemI
8b90: 6e 76 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a  nvariants(p) );.
8ba0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
8bb0: 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61  lock is really a
8bc0: 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f  n inlined versio
8bd0: 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
8be0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20  MemRelease().   
8bf0: 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73     ** that takes
8c00: 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
8c10: 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20  e fact that the 
8c20: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75  memory cell valu
8c30: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62  e is .      ** b
8c40: 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c  eing set to NULL
8c50: 20 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67   after releasing
8c60: 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73   any dynamic res
8c70: 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a  ources..      **
8c80: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75  .      ** The ju
8c90: 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20  stification for 
8ca0: 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65  duplicating code
8cb0: 20 69 73 20 74 68 61 74 20 61 63 63 6f 72 64 69   is that accordi
8cc0: 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ng to .      ** 
8cd0: 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20  callgrind, this 
8ce0: 63 61 75 73 65 73 20 61 20 63 65 72 74 61 69 6e  causes a certain
8cf0: 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 68 69   test case to hi
8d00: 74 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20  t the CPU 4.7 . 
8d10: 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20       ** percent 
8d20: 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c  less (x86 linux,
8d30: 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31   gcc version 4.1
8d40: 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66  .2, -O6) than if
8d50: 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74   .      ** sqlit
8d60: 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77  e3MemRelease() w
8d70: 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ere called from 
8d80: 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20  here. With -O2, 
8d90: 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20  this jumps.     
8da0: 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65   ** to 6.6 perce
8db0: 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63 61 73  nt. The test cas
8dc0: 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31  e is inserting 1
8dd0: 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20  000 rows into a 
8de0: 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20  table .      ** 
8df0: 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20  with no indexes 
8e00: 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70  using a single p
8e10: 72 65 70 61 72 65 64 20 49 4e 53 45 52 54 20 73  repared INSERT s
8e20: 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29  tatement, bind()
8e30: 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72   .      ** and r
8e40: 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20  eset(). Inserts 
8e50: 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f  are grouped into
8e60: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
8e70: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
8e80: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
8e90: 73 20 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20  s & MEM_Agg );. 
8ea0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
8eb0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79  ->flags & MEM_Dy
8ec0: 6e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  n );.      testc
8ed0: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ase( p->flags & 
8ee0: 4d 45 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20  MEM_Frame );.   
8ef0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
8f00: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
8f10: 65 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  et );.      if( 
8f20: 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67  p->flags&(MEM_Ag
8f30: 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72  g|MEM_Dyn|MEM_Fr
8f40: 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20  ame|MEM_RowSet) 
8f50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8f60: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
8f70: 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (p);.      }else
8f80: 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20   if( p->zMalloc 
8f90: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8fa0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
8fb0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
8fc0: 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30    p->zMalloc = 0
8fd0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
8fe0: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f   p->flags = MEM_
8ff0: 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d  Undefined;.    }
9000: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
9010: 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66  ailed = malloc_f
9020: 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ailed;.  }.}../*
9030: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62  .** Delete a Vdb
9040: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e  eFrame object an
9050: 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20  d its contents. 
9060: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
9070: 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
9080: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f  ed by the OP_Pro
9090: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73  gram opcode in s
90a0: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
90b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
90c0: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
90d0: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a  (VdbeFrame *p){.
90e0: 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a    int i;.  Mem *
90f0: 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65  aMem = VdbeFrame
9100: 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75  Mem(p);.  VdbeCu
9110: 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28  rsor **apCsr = (
9120: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61  VdbeCursor **)&a
9130: 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Mem[p->nChildMem
9140: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
9150: 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b  p->nChildCsr; i+
9160: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
9170: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d  dbeFreeCursor(p-
9180: 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20  >v, apCsr[i]);. 
9190: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
91a0: 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43  rray(aMem, p->nC
91b0: 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69  hildMem);.  sqli
91c0: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e  te3DbFree(p->v->
91d0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64  db, p);.}..#ifnd
91e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
91f0: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76  XPLAIN./*.** Giv
9200: 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  e a listing of t
9210: 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68  he program in th
9220: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
9230: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  e..**.** The int
9240: 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61  erface is the sa
9250: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62  me as sqlite3Vdb
9260: 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e  eExec().  But in
9270: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e  stead of.** runn
9280: 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74  ing the code, it
9290: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c   invokes the cal
92a0: 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65  lback once for e
92b0: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ach instruction.
92c0: 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65  .** This feature
92d0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
92e0: 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e  ement "EXPLAIN".
92f0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
9300: 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20  xplain==1, each 
9310: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c  instruction is l
9320: 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20  isted.  When.** 
9330: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f  p->explain==2, o
9340: 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  nly OP_Explain i
9350: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
9360: 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65  listed and these
9370: 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e  .** are shown in
9380: 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72   a different for
9390: 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e  mat.  p->explain
93a0: 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69  ==2 is used to i
93b0: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c  mplement.** EXPL
93c0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a  AIN QUERY PLAN..
93d0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
93e0: 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20  plain==1, first 
93f0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
9400: 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e   is listed, then
9410: 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20   each of.** the 
9420: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
9430: 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f  ams are listed o
9440: 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e  ne by one..*/.in
9450: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
9460: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
9470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9480: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
9490: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 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 20 2f 2a 20 53 74 6f 70 20          /* Stop 
94c0: 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72  when row count r
94d0: 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20  eaches this */. 
94e0: 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 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 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9510: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65  of sub-vdbes see
9520: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75  n so far */.  Su
9530: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
9540: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9550: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
9560: 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65  ub-vdbes */.  Me
9570: 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  m *pSub = 0;    
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9590: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
95a0: 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20  l hold array of 
95b0: 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71  subprogs */.  sq
95c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
95d0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
95e0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
95f0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
9600: 0a 20 20 69 6e 74 20 69 3b 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 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
9630: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
9640: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9660: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
9670: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
9680: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20  = &p->aMem[1];  
9690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
96a0: 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c  rst Mem of resul
96b0: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  t set */..  asse
96c0: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29  rt( p->explain )
96d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
96e0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
96f0: 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  _RUN );.  assert
9700: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
9710: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
9720: 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72  ITE_BUSY || p->r
9730: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
9740: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
9750: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
9760: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79   does not use dy
9770: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f  namic strings fo
9780: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c  r.  ** the resul
9790: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  t, result column
97a0: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e  s may become dyn
97b0: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72  amic if the user
97c0: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69   calls.  ** sqli
97d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
97e0: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74  6(), causing a t
97f0: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54  ranslation to UT
9800: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20  F-16 encoding.. 
9810: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   */.  releaseMem
9820: 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a  Array(pMem, 8);.
9830: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
9840: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  = 0;..  if( p->r
9850: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
9860: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
9870: 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c  appens if a mall
9880: 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61  oc() inside a ca
9890: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f  ll to sqlite3_co
98a0: 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20  lumn_text() or. 
98b0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
98c0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61  lumn_text16() fa
98d0: 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62  iled.  */.    db
98e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
98f0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
9900: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
9910: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
9920: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
9930: 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52   rows reaches nR
9940: 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ow, that means t
9950: 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20  he.  ** listing 
9960: 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64  has finished and
9970: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
9980: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51  should return SQ
9990: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20  LITE_DONE..  ** 
99a0: 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20  nRow is the sum 
99b0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
99c0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69   rows in the mai
99d0: 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a  n program, plus.
99e0: 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20    ** the sum of 
99f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
9a00: 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65  ws in all trigge
9a10: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e  r subprograms en
9a20: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73  countered.  ** s
9a30: 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77  o far.  The nRow
9a40: 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72   value will incr
9a50: 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67  ease as new trig
9a60: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
9a70: 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74  are.  ** encount
9a80: 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20  ered, but p->pc 
9a90: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20  will eventually 
9aa0: 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77  catch up to nRow
9ab0: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20  ..  */.  nRow = 
9ac0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d  p->nOp;.  if( p-
9ad0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
9ae0: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
9af0: 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  8 memory cells a
9b00: 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  re used for the 
9b10: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20  result set.  So 
9b20: 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63  we will.    ** c
9b30: 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74  ommandeer the 9t
9b40: 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73  h cell to use as
9b50: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20   storage for an 
9b60: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
9b70: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67  s.    ** to trig
9b80: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e  ger subprograms.
9b90: 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75    The VDBE is gu
9ba0: 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65  aranteed to have
9bb0: 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20   at least 9.    
9bc0: 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20  ** cells.  */.  
9bd0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65    assert( p->nMe
9be0: 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20  m>9 );.    pSub 
9bf0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20  = &p->aMem[9];. 
9c00: 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61     if( pSub->fla
9c10: 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20  gs&MEM_Blob ){. 
9c20: 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66       /* On the f
9c30: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
9c40: 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75  ite3_step(), pSu
9c50: 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55  b will hold a NU
9c60: 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20  LL.  It is.     
9c70: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   ** initialized 
9c80: 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65  to a BLOB by the
9c90: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70   P4_SUBPROGRAM p
9ca0: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
9cb0: 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e  below */.      n
9cc0: 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69  Sub = pSub->n/si
9cd0: 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20  zeof(Vdbe*);.   
9ce0: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
9cf0: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
9d00: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  z;.    }.    for
9d10: 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b  (i=0; i<nSub; i+
9d20: 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b  +){.      nRow +
9d30: 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b  = apSub[i]->nOp;
9d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f  .    }.  }..  do
9d50: 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b  {.    i = p->pc+
9d60: 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e  +;.  }while( i<n
9d70: 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69  Row && p->explai
9d80: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69  n==2 && p->aOp[i
9d90: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70  ].opcode!=OP_Exp
9da0: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e  lain );.  if( i>
9db0: 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e  =nRow ){.    p->
9dc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
9dd0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9de0: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DONE;.  }else if
9df0: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72  ( db->u1.isInter
9e00: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d  rupted ){.    p-
9e10: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
9e20: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ERRUPT;.    rc =
9e30: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
9e40: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
9e50: 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
9e60: 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74   db, "%s", sqlit
9e70: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29  e3ErrStr(p->rc))
9e80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
9e90: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70  har *zP4;.    Op
9ea0: 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69   *pOp;.    if( i
9eb0: 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20  <p->nOp ){.     
9ec0: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c   /* The output l
9ed0: 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d  ine number is sm
9ee0: 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20  all enough that 
9ef0: 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  we are still in 
9f00: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69  the.      ** mai
9f10: 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20  n program. */.  
9f20: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
9f30: 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  p[i];.    }else{
9f40: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65  .      /* We are
9f50: 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69   currently listi
9f60: 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  ng subprograms. 
9f70: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
9f80: 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20  h one and.      
9f90: 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61  ** pick up the a
9fa0: 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64  ppropriate opcod
9fb0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
9fc0: 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d  j;.      i -= p-
9fd0: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  >nOp;.      for(
9fe0: 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d  j=0; i>=apSub[j]
9ff0: 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nOp; j++){.   
a000: 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b       i -= apSub[
a010: 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d  j]->nOp;.      }
a020: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70  .      pOp = &ap
a030: 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a  Sub[j]->aOp[i];.
a040: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
a050: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
a060: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
a070: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
a080: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b    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 20                  
a0b0: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74  /* Program count
a0c0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
a0d0: 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65  ++;.  .      pMe
a0e0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
a0f0: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45  tatic|MEM_Str|ME
a100: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
a110: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73  em->z = (char*)s
a120: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
a130: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f  (pOp->opcode); /
a140: 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  * Opcode */.    
a150: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
a160: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
a170: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
a180: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
a190: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
a1a0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
a1b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  .      pMem++;..
a1c0: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e        /* When an
a1d0: 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f   OP_Program opco
a1e0: 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20  de is encounter 
a1f0: 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65  (the only opcode
a200: 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20   that has.      
a210: 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52  ** a P4_SUBPROGR
a220: 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78  AM argument), ex
a230: 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66  pand the size of
a240: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75   the array of su
a250: 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20  bprograms.      
a260: 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d  ** kept in p->aM
a270: 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20  em[9].z to hold 
a280: 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20  the new program 
a290: 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20  - assuming this 
a2a0: 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20  subprogram.     
a2b0: 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   ** has not alre
a2c0: 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20  ady been seen.. 
a2d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
a2e0: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
a2f0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
a300: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74          int nByt
a310: 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a  e = (nSub+1)*siz
a320: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
a330: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  ;.        int j;
a340: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
a350: 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  ; j<nSub; j++){.
a360: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70            if( ap
a370: 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e  Sub[j]==pOp->p4.
a380: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
a390: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a3a0: 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20      if( j==nSub 
a3b0: 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71  && SQLITE_OK==sq
a3c0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
a3d0: 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53  (pSub, nByte, nS
a3e0: 75 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ub!=0) ){.      
a3f0: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
a400: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
a410: 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  >z;.          ap
a420: 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f  Sub[nSub++] = pO
a430: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  p->p4.pProgram;.
a440: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
a450: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f  flags |= MEM_Blo
a460: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  b;.          pSu
a470: 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65  b->n = nSub*size
a480: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
a490: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a4a0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d   }.    }..    pM
a4b0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
a4c0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
a4d0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 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 20 2f 2a 20 50 31 20 2a 2f 0a         /* P1 */.
a500: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
a510: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
a520: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
a530: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  ->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 20 2f 2a 20 50 32 20            /* P2 
a560: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
a570: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
a580: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
a590: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
a5a0: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a5c0: 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P3 */.    pMem++
a5d0: 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ;..    if( sqlit
a5e0: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
a5f0: 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20  em, 32, 0) ){   
a600: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a           /* P4 *
a610: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
a620: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
a630: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
a640: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
a650: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
a660: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
a670: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
a680: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
a690: 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32  pOp, pMem->z, 32
a6a0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d  );.    if( zP4!=
a6b0: 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  pMem->z ){.     
a6c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
a6d0: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c  etStr(pMem, zP4,
a6e0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
a6f0: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
a700: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a710: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
a720: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
a730: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
a740: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
a750: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
a760: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
a770: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
a780: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
a790: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
a7a0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
a7b0: 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20  Mem, 4, 0) ){.  
a7c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a7d0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
a7e0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
a7f0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
a800: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a810: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
a820: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
a830: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
a840: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
a850: 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65  _snprintf(3, pMe
a860: 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f  m->z, "%.2x", pO
a870: 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20  p->p5);   /* P5 
a880: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  */.      pMem->e
a890: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
a8a0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
a8b0: 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45    .#ifdef SQLITE
a8c0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
a8d0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69  COMMENTS.      i
a8e0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
a8f0: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 35 30 30 2c  mGrow(pMem, 500,
a900: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61   0) ){.        a
a910: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
a920: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
a930: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a940: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
a950: 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66   }.      pMem->f
a960: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
a970: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
a980: 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79  Mem->n = display
a990: 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34  Comment(pOp, zP4
a9a0: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b  , pMem->z, 500);
a9b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
a9c0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
a9d0: 23 65 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d  #else.      pMem
a9e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
a9f0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
aa00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
aa10: 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ment */.#endif. 
aa20: 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65     }..    p->nRe
aa30: 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a  sColumn = 8 - 4*
aa40: 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a  (p->explain-1);.
aa50: 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65      p->pResultSe
aa60: 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b  t = &p->aMem[1];
aa70: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
aa80: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
aa90: 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d   SQLITE_ROW;.  }
aaa0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
aab0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
aac0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
aad0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
aae0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  DEBUG./*.** Prin
aaf0: 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77  t the SQL that w
ab00: 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  as used to gener
ab10: 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72  ate a VDBE progr
ab20: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
ab30: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28  te3VdbePrintSql(
ab40: 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73  Vdbe *p){.  cons
ab50: 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20  t char *z = 0;. 
ab60: 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a   if( p->zSql ){.
ab70: 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b      z = p->zSql;
ab80: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
ab90: 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f  nOp>=1 ){.    co
aba0: 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20  nst VdbeOp *pOp 
abb0: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
abc0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
abd0: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f  e==OP_Init && pO
abe0: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
abf0: 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e      z = pOp->p4.
ac00: 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  z;.      while( 
ac10: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a  sqlite3Isspace(*
ac20: 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a  z) ) z++;.    }.
ac30: 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72    }.  if( z ) pr
ac40: 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c  intf("SQL: [%s]\
ac50: 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66  n", z);.}.#endif
ac60: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
ac70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
ac80: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
ac90: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
aca0: 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  CE)./*.** Print 
acb0: 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61  an IOTRACE messa
acc0: 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63  ge showing SQL c
acd0: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ontent..*/.void 
ace0: 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61  sqlite3VdbeIOTra
acf0: 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ceSql(Vdbe *p){.
ad00: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
ad10: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
ad20: 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  p;.  if( sqlite3
ad30: 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74  IoTrace==0 ) ret
ad40: 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31  urn;.  if( nOp<1
ad50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70   ) return;.  pOp
ad60: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
ad70: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
ad80: 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70  ==OP_Init && pOp
ad90: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
ada0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63   int i, j;.    c
adb0: 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20  har z[1000];.   
adc0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
add0: 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
ade0: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  "%s", pOp->p4.z)
adf0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73  ;.    for(i=0; s
ae00: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
ae10: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
ae20: 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(j=0; z[i]; i
ae30: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
ae40: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
ae50: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
ae60: 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29  f( z[i-1]!=' ' )
ae70: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  {.          z[j+
ae80: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
ae90: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
aea0: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
aeb0: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  = z[i];.      }.
aec0: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d      }.    z[j] =
aed0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   0;.    sqlite3I
aee0: 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e  oTrace("SQL %s\n
aef0: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
af00: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
af10: 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c  MIT_TRACE && SQL
af20: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
af30: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  CE */../*.** All
af40: 6f 63 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d  ocate space from
af50: 20 61 20 66 69 78 65 64 20 73 69 7a 65 20 62 75   a fixed size bu
af60: 66 66 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20  ffer and return 
af70: 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  a pointer to.** 
af80: 74 68 61 74 20 73 70 61 63 65 2e 20 20 49 66 20  that space.  If 
af90: 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  insufficient spa
afa0: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  ce is available,
afb0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
afc0: 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70 61 72  .** The pBuf par
afd0: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 69 6e  ameter is the in
afe0: 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61  itial value of a
aff0: 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77   pointer which w
b000: 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74  ill.** receive t
b010: 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20  he new memory.  
b020: 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  pBuf is normally
b030: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20   NULL.  If pBuf 
b040: 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20  is not.** NULL, 
b050: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65  it means that me
b060: 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73 20 61  mory space has a
b070: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
b080: 63 61 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a  cated and that.*
b090: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * this routine s
b0a0: 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61  hould not alloca
b0b0: 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72  te any new memor
b0c0: 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20 69 73  y.  When pBuf is
b0d0: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d   not.** NULL sim
b0e0: 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e  ply return pBuf.
b0f0: 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20    Only allocate 
b100: 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  new memory space
b110: 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73   when pBuf.** is
b120: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79   NULL..**.** nBy
b130: 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  te is the number
b140: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
b150: 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  ce needed..**.**
b160: 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20   *ppFrom points 
b170: 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61  to available spa
b180: 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e  ce and pEnd poin
b190: 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ts to the end of
b1a0: 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c   the.** availabl
b1b0: 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73  e space.  When s
b1c0: 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  pace is allocate
b1d0: 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64  d, *ppFrom is ad
b1e0: 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74  vanced past.** t
b1f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c  he end of the al
b200: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a  located space..*
b210: 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20  *.** *pnByte is 
b220: 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65  a counter of the
b230: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
b240: 20 6f 66 20 73 70 61 63 65 20 74 68 61 74 20 68   of space that h
b250: 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f  ave failed.** to
b260: 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74   allocate.  If t
b270: 68 65 72 65 20 69 73 20 69 6e 73 75 66 66 69 63  here is insuffic
b280: 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70  ient space in *p
b290: 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79  pFrom to satisfy
b2a0: 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c   the.** request,
b2b0: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
b2c0: 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65 20 61  *pnByte by the a
b2d0: 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71  mount of the req
b2e0: 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uest..*/.static 
b2f0: 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65  void *allocSpace
b300: 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  (.  void *pBuf, 
b310: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
b320: 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72  e return pointer
b330: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
b340: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
b350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b360: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
b370: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38  allocate */.  u8
b380: 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20   **ppFrom,      
b390: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c     /* IN/OUT: Al
b3a0: 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46  locate from *ppF
b3b0: 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  rom */.  u8 *pEn
b3c0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
b3d0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79   Pointer to 1 by
b3e0: 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
b3f0: 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65  of *ppFrom buffe
b400: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79  r */.  int *pnBy
b410: 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  te          /* I
b420: 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e  f allocation can
b430: 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63  not be made, inc
b440: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a  rement *pnByte *
b450: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45  /.){.  assert( E
b460: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
b470: 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a  ENT(*ppFrom) );.
b480: 20 20 69 66 28 20 70 42 75 66 20 29 20 72 65 74    if( pBuf ) ret
b490: 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74  urn pBuf;.  nByt
b4a0: 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65  e = ROUND8(nByte
b4b0: 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72  );.  if( &(*ppFr
b4c0: 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45  om)[nByte] <= pE
b4d0: 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d  nd ){.    pBuf =
b4e0: 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b   (void*)*ppFrom;
b4f0: 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20  .    *ppFrom += 
b500: 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nByte;.  }else{.
b510: 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e      *pnByte += n
b520: 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Byte;.  }.  retu
b530: 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pBuf;.}../*.*
b540: 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42  * Rewind the VDB
b550: 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  E back to the be
b560: 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61  ginning in prepa
b570: 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75  ration for.** ru
b580: 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69  nning it..*/.voi
b590: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  d sqlite3VdbeRew
b5a0: 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  ind(Vdbe *p){.#i
b5b0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
b5c0: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
b5d0: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
b5e0: 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66  .  int i;.#endif
b5f0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
b600: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
b610: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
b620: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20  C_INIT );..  /* 
b630: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
b640: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
b650: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
b660: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
b670: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
b680: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
b690: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
b6a0: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
b6b0: 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  */.  p->magic = 
b6c0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
b6d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
b6e0: 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20  EBUG.  for(i=1; 
b6f0: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b  i<p->nMem; i++){
b700: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
b710: 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64  aMem[i].db==p->d
b720: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
b730: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20    p->pc = -1;.  
b740: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
b750: 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  K;.  p->errorAct
b760: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
b770: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
b780: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70  E_MAGIC_RUN;.  p
b790: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
b7a0: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31   p->cacheCtr = 1
b7b0: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  ;.  p->minWriteF
b7c0: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b  ileFormat = 255;
b7d0: 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  .  p->iStatement
b7e0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f   = 0;.  p->nFkCo
b7f0: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69  nstraint = 0;.#i
b800: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
b810: 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  E.  for(i=0; i<p
b820: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
b830: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
b840: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69   0;.    p->aOp[i
b850: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
b860: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
b870: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
b880: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
b890: 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68  execution for th
b8a0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74  e first time aft
b8b0: 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74  er.** creating t
b8c0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
b8d0: 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  ne.  This involv
b8e0: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
b8f0: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
b900: 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20  stack space and 
b910: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
b920: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
b930: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
b940: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
b950: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
b960: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
b970: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
b980: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
b990: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
b9a0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
b9b0: 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79  e called exactly
b9c0: 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69   once on each vi
b9d0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
b9e0: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
b9f0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
ba00: 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22  he VM has been "
ba10: 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73  packaged" and is
ba20: 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e   ready.** to run
ba30: 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  .  After this ro
ba40: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
ba50: 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74   further calls t
ba60: 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  o .** sqlite3Vdb
ba70: 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f  eAddOp() functio
ba80: 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65  ns are prohibite
ba90: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
baa0: 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20   disconnects.** 
bab0: 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68  the Vdbe from th
bac0: 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74  e Parse object t
bad0: 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72  hat helped gener
bae0: 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74  ate it so that t
baf0: 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62  he.** the Vdbe b
bb00: 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65  ecomes an indepe
bb10: 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64  ndent entity and
bb20: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
bb30: 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74  t can be.** dest
bb40: 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  royed..**.** Use
bb50: 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
bb60: 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75  Rewind() procedu
bb70: 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20  re to restore a 
bb80: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
bb90: 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69  back.** to its i
bba0: 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74  nitial state aft
bbb0: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72  er it has been r
bbc0: 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  un..*/.void sqli
bbd0: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
bbe0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 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 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
bc10: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
bc20: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
bc30: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
bc40: 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ntext */.){.  sq
bc50: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bc70: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
bc80: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
bc90: 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20   nVar;          
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bcb0: 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74  umber of paramet
bcc0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65  ers */.  int nMe
bcd0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
bce0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
bcf0: 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72  r of VM memory r
bd00: 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e  egisters */.  in
bd10: 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20  t nCursor;      
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bd30: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
bd40: 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  s required */.  
bd50: 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20  int nArg;       
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
bd80: 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67  ments in subprog
bd90: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  rams */.  int nO
bda0: 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  nce;            
bdb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
bdc0: 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e  er of OP_Once in
bdd0: 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  structions */.  
bde0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
be00: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
be10: 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20  /.  u8 *zCsr;   
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
be40: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  ilable for alloc
be50: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a  ation */.  u8 *z
be60: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
be70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
be80: 73 74 20 62 79 74 65 20 70 61 73 74 20 61 6c 6c  st byte past all
be90: 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  ocated memory */
bea0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78    /* How much ex
bed0: 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65  tra memory is ne
bee0: 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  eded */..  asser
bef0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
bf00: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
bf10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
bf20: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
bf30: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
bf40: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
bf50: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d   assert( pParse=
bf60: 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20  =p->pParse );.  
bf70: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
bf80: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
bf90: 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  Failed==0 );.  n
bfa0: 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56  Var = pParse->nV
bfb0: 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61  ar;.  nMem = pPa
bfc0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75  rse->nMem;.  nCu
bfd0: 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rsor = pParse->n
bfe0: 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50  Tab;.  nArg = pP
bff0: 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20  arse->nMaxArg;. 
c000: 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d   nOnce = pParse-
c010: 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f  >nOnce;.  if( nO
c020: 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d  nce==0 ) nOnce =
c030: 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74   1; /* Ensure at
c040: 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20   least one byte 
c050: 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b  in p->aOnceFlag[
c060: 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72  ] */.  .  /* For
c070: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71   each cursor req
c080: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f  uired, also allo
c090: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  cate a memory ce
c0a0: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20  ll. Memory.  ** 
c0b0: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43  cells (nMem+1-nC
c0c0: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e  ursor)..nMem, in
c0d0: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65  clusive, will ne
c0e0: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20  ver be used by. 
c0f0: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f   ** the vdbe pro
c100: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68  gram. Instead th
c110: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  ey are used to a
c120: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
c130: 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f  r.  ** VdbeCurso
c140: 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63  r/BtCursor struc
c150: 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20  tures. The blob 
c160: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
c170: 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20  ated with .  ** 
c180: 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72  cursor 0 is stor
c190: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c  ed in memory cel
c1a0: 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63  l nMem. Memory c
c1b0: 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a  ell (nMem-1).  *
c1c0: 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f  * stores the blo
c1d0: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
c1e0: 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
c1f0: 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a  or 1, etc..  **.
c200: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
c210: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
c220: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
c230: 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41  nCursor;..  /* A
c240: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
c250: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
c260: 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65  rs, SQL variable
c270: 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20  s, VDBE cursors 
c280: 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72  and .  ** an arr
c290: 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51  ay to marshal SQ
c2a0: 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  L function argum
c2b0: 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ents in..  */.  
c2c0: 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  zCsr = (u8*)&p->
c2d0: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20  aOp[p->nOp];    
c2e0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
c2f0: 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20  y avaliable for 
c300: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
c310: 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e  zEnd = (u8*)&p->
c320: 61 4f 70 5b 70 50 61 72 73 65 2d 3e 6e 4f 70 41  aOp[pParse->nOpA
c330: 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74  lloc];  /* First
c340: 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f   byte past end o
c350: 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72  f zCsr[] */..  r
c360: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
c370: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75  , &nArg);.  p->u
c380: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d  sesStmtJournal =
c390: 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73   (u8)(pParse->is
c3a0: 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50  MultiWrite && pP
c3b0: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b  arse->mayAbort);
c3c0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
c3d0: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
c3e0: 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20  0 ){.    nMem = 
c3f0: 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  10;.  }.  memset
c400: 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a  (zCsr, 0, zEnd-z
c410: 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20  Csr);.  zCsr += 
c420: 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26  (zCsr - (u8*)0)&
c430: 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  7;.  assert( EIG
c440: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
c450: 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70 2d 3e  T(zCsr) );.  p->
c460: 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20  expired = 0;..  
c470: 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65  /* Memory for re
c480: 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74  gisters, paramet
c490: 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63  ers, cursor, etc
c4a0: 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69  , is allocated i
c4b0: 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65  n two.  ** passe
c4c0: 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74  s.  On the first
c4d0: 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f   pass, we try to
c4e0: 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 73 70   reuse unused sp
c4f0: 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a  ace at the .  **
c500: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
c510: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
c520: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
c530: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
c540: 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65  y.  ** requireme
c550: 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74  nts by reusing t
c560: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
c570: 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73  tail, then the s
c580: 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20  econd.  ** pass 
c590: 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65  will fill in the
c5a0: 20 72 65 73 74 20 75 73 69 6e 67 20 61 20 66 72   rest using a fr
c5b0: 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  esh allocation. 
c5c0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
c5d0: 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61   two-pass approa
c5e0: 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61  ch that reuses a
c5f0: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
c600: 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20   possible from. 
c610: 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72   ** the leftover
c620: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
c630: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
c640: 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66  array can signif
c650: 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64  icantly.  ** red
c660: 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  uce the amount o
c670: 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  f memory held by
c680: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
c690: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f  ement..  */.  do
c6a0: 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30   {.    nByte = 0
c6b0: 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20  ;.    p->aMem = 
c6c0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d  allocSpace(p->aM
c6d0: 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28  em, nMem*sizeof(
c6e0: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
c6f0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
c700: 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53  p->aVar = allocS
c710: 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56  pace(p->aVar, nV
c720: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20  ar*sizeof(Mem), 
c730: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
c740: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41  yte);.    p->apA
c750: 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  rg = allocSpace(
c760: 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73  p->apArg, nArg*s
c770: 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43  izeof(Mem*), &zC
c780: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
c790: 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20  );.    p->azVar 
c7a0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
c7b0: 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  azVar, nVar*size
c7c0: 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72  of(char*), &zCsr
c7d0: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
c7e0: 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20  .    p->apCsr = 
c7f0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
c800: 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  Csr, nCursor*siz
c810: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
c820: 2c 0a 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 20 20 26 7a 43 73              &zCs
c840: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
c850: 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c  ;.    p->aOnceFl
c860: 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ag = allocSpace(
c870: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f  p->aOnceFlag, nO
c880: 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  nce, &zCsr, zEnd
c890: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  , &nByte);.    i
c8a0: 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  f( nByte ){.    
c8b0: 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c    p->pFree = sql
c8c0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
c8d0: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
c8e0: 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d   }.    zCsr = p-
c8f0: 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64  >pFree;.    zEnd
c900: 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b   = &zCsr[nByte];
c910: 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65  .  }while( nByte
c920: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
c930: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e  ailed );..  p->n
c940: 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72  Cursor = nCursor
c950: 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67  ;.  p->nOnceFlag
c960: 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20   = nOnce;.  if( 
c970: 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70  p->aVar ){.    p
c980: 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29  ->nVar = (ynVar)
c990: 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d  nVar;.    for(n=
c9a0: 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b  0; n<nVar; n++){
c9b0: 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e  .      p->aVar[n
c9c0: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ].flags = MEM_Nu
c9d0: 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  ll;.      p->aVa
c9e0: 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  r[n].db = db;.  
c9f0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
ca00: 3e 61 7a 56 61 72 20 29 7b 0a 20 20 20 20 70 2d  >azVar ){.    p-
ca10: 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d  >nzVar = pParse-
ca20: 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63  >nzVar;.    memc
ca30: 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61  py(p->azVar, pPa
ca40: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e  rse->azVar, p->n
ca50: 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  zVar*sizeof(p->a
ca60: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d  zVar[0]));.    m
ca70: 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a  emset(pParse->az
ca80: 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  Var, 0, pParse->
ca90: 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61  nzVar*sizeof(pPa
caa0: 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b  rse->azVar[0]));
cab0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d  .  }.  if( p->aM
cac0: 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65  em ){.    p->aMe
cad0: 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20  m--;            
cae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
caf0: 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e  m[] goes from 1.
cb00: 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e  .nMem */.    p->
cb10: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20  nMem = nMem;    
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb30: 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30        not from 0
cb40: 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20  ..nMem-1 */.    
cb50: 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d  for(n=1; n<=nMem
cb60: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; n++){.      p-
cb70: 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aMem[n].flags =
cb80: 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a   MEM_Undefined;.
cb90: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d        p->aMem[n]
cba0: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
cbb0: 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e    }.  p->explain
cbc0: 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61   = pParse->expla
cbd0: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  in;.  sqlite3Vdb
cbe0: 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f  eRewind(p);.}../
cbf0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42  *.** Close a VDB
cc00: 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c  E cursor and rel
cc10: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73  ease all the res
cc20: 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73  ources that curs
cc30: 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74  or .** happens t
cc40: 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20  o hold..*/.void 
cc50: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
cc60: 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56  ursor(Vdbe *p, V
cc70: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  dbeCursor *pCx){
cc80: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
cc90: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
cca0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f  .  sqlite3VdbeSo
ccb0: 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c  rterClose(p->db,
ccc0: 20 70 43 78 29 3b 0a 20 20 69 66 28 20 70 43 78   pCx);.  if( pCx
ccd0: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c  ->pBt ){.    sql
cce0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
ccf0: 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a  Cx->pBt);.    /*
cd00: 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f   The pCx->pCurso
cd10: 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20  r will be close 
cd20: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69  automatically, i
cd30: 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a  f it exists, by.
cd40: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
cd50: 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73  above. */.  }els
cd60: 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73  e if( pCx->pCurs
cd70: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
cd80: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
cd90: 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b  r(pCx->pCursor);
cda0: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
cdb0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
cdc0: 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d  TABLE.  if( pCx-
cdd0: 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a  >pVtabCursor ){.
cde0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
cdf0: 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75  _cursor *pVtabCu
ce00: 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61  rsor = pCx->pVta
ce10: 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e  bCursor;.    con
ce20: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  st sqlite3_modul
ce30: 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74  e *pModule = pVt
ce40: 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d  abCursor->pVtab-
ce50: 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d  >pModule;.    p-
ce60: 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
ce70: 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e  1;.    pModule->
ce80: 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73  xClose(pVtabCurs
ce90: 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  or);.    p->inVt
cea0: 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20  abMethod = 0;.  
ceb0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
cec0: 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65  * Copy the value
ced0: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
cee0: 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74  VdbeFrame struct
cef0: 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e  ure to its Vdbe.
cf00: 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64   This.** is used
cf10: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
cf20: 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75  hen a trigger su
cf30: 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c  b-program is hal
cf40: 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a  ted to restore.*
cf50: 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65  * control to the
cf60: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a   main program..*
cf70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
cf80: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64  eFrameRestore(Vd
cf90: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29  beFrame *pFrame)
cfa0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46  {.  Vdbe *v = pF
cfb0: 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f  rame->v;.  v->aO
cfc0: 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65  nceFlag = pFrame
cfd0: 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76  ->aOnceFlag;.  v
cfe0: 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46  ->nOnceFlag = pF
cff0: 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b  rame->nOnceFlag;
d000: 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61  .  v->aOp = pFra
d010: 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f  me->aOp;.  v->nO
d020: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b  p = pFrame->nOp;
d030: 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72  .  v->aMem = pFr
d040: 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e  ame->aMem;.  v->
d050: 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  nMem = pFrame->n
d060: 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20  Mem;.  v->apCsr 
d070: 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b  = pFrame->apCsr;
d080: 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  v->nCursor = 
d090: 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b  pFrame->nCursor;
d0a0: 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f  .  v->db->lastRo
d0b0: 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61  wid = pFrame->la
d0c0: 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43  stRowid;.  v->nC
d0d0: 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e  hange = pFrame->
d0e0: 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72  nChange;.  retur
d0f0: 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a  n pFrame->pc;.}.
d100: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
d110: 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20   cursors..**.** 
d120: 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79  Also release any
d130: 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20   dynamic memory 
d140: 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69  held by the VM i
d150: 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20  n the Vdbe.aMem 
d160: 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20  memory .** cell 
d170: 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e  array. This is n
d180: 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20  ecessary as the 
d190: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61  memory cell arra
d1a0: 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a  y may contain.**
d1b0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62   pointers to Vdb
d1c0: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20  eFrame objects, 
d1d0: 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72  which may in tur
d1e0: 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  n contain pointe
d1f0: 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75  rs to.** open cu
d200: 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rsors..*/.static
d210: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
d220: 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a  rsors(Vdbe *p){.
d230: 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20    if( p->pFrame 
d240: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
d250: 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f   *pFrame;.    fo
d260: 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61  r(pFrame=p->pFra
d270: 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72  me; pFrame->pPar
d280: 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  ent; pFrame=pFra
d290: 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
d2a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
d2b0: 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65  meRestore(pFrame
d2c0: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61  );.  }.  p->pFra
d2d0: 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72  me = 0;.  p->nFr
d2e0: 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ame = 0;..  if( 
d2f0: 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20  p->apCsr ){.    
d300: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
d310: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
d320: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64  ; i++){.      Vd
d330: 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70  beCursor *pC = p
d340: 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20  ->apCsr[i];.    
d350: 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20    if( pC ){.    
d360: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
d370: 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29  reeCursor(p, pC)
d380: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43  ;.        p->apC
d390: 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  sr[i] = 0;.     
d3a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
d3b0: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
d3c0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
d3d0: 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70  y(&p->aMem[1], p
d3e0: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77  ->nMem);.  }.  w
d3f0: 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61  hile( p->pDelFra
d400: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
d410: 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70  ame *pDel = p->p
d420: 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d  DelFrame;.    p-
d430: 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65  >pDelFrame = pDe
d440: 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20  l->pParent;.    
d450: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
d460: 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20  Delete(pDel);.  
d470: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  }..  /* Delete a
d480: 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63  ny auxdata alloc
d490: 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74  ations made by t
d4a0: 68 65 20 56 4d 20 2a 2f 0a 20 20 73 71 6c 69 74  he VM */.  sqlit
d4b0: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
d4c0: 61 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20  ata(p, -1, 0);. 
d4d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78   assert( p->pAux
d4e0: 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  Data==0 );.}../*
d4f0: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65  .** Clean up the
d500: 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74   VM after execut
d510: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
d520: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74  routine will aut
d530: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
d540: 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69   any cursors, li
d550: 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73  sts, and/or.** s
d560: 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65  orters that were
d570: 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20   left open.  It 
d580: 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65  also deletes the
d590: 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61   values of.** va
d5a0: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61  riables in the a
d5b0: 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Var[] array..*/.
d5c0: 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61  static void Clea
d5d0: 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nup(Vdbe *p){.  
d5e0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
d5f0: 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  >db;..#ifdef SQL
d600: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45  ITE_DEBUG.  /* E
d610: 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20  xecute assert() 
d620: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
d630: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64  sure that the Vd
d640: 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a  be.apCsr[] and .
d650: 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d    ** Vdbe.aMem[]
d660: 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72   arrays have alr
d670: 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65  eady been cleane
d680: 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  d up.  */.  int 
d690: 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  i;.  if( p->apCs
d6a0: 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  r ) for(i=0; i<p
d6b0: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20  ->nCursor; i++) 
d6c0: 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72  assert( p->apCsr
d6d0: 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  [i]==0 );.  if( 
d6e0: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66  p->aMem ){.    f
d6f0: 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d  or(i=1; i<=p->nM
d700: 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28  em; i++) assert(
d710: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67   p->aMem[i].flag
d720: 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64  s==MEM_Undefined
d730: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
d740: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d750: 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
d760: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
d770: 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  0;.  p->pResultS
d780: 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  et = 0;.}../*.**
d790: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
d7a0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
d7b0: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
d7c0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
d7d0: 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  SQL.** statement
d7e0: 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65  . This is now se
d7f0: 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  t at compile tim
d800: 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64  e, rather than d
d810: 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69  uring.** executi
d820: 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70  on of the vdbe p
d830: 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73  rogram so that s
d840: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
d850: 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20  unt() can.** be 
d860: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c  called on an SQL
d870: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72   statement befor
d880: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
d890: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d8a0: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
d8b0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65  Vdbe *p, int nRe
d8c0: 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20  sColumn){.  Mem 
d8d0: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74  *pColName;.  int
d8e0: 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   n;.  sqlite3 *d
d8f0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65  b = p->db;..  re
d900: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
d910: 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
d920: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
d930: 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  _N);.  sqlite3Db
d940: 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
d950: 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65  Name);.  n = nRe
d960: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
d970: 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  N;.  p->nResColu
d980: 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f  mn = (u16)nResCo
d990: 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e  lumn;.  p->aColN
d9a0: 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d  ame = pColName =
d9b0: 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62   (Mem*)sqlite3Db
d9c0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
d9d0: 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a  izeof(Mem)*n );.
d9e0: 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d    if( p->aColNam
d9f0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
da00: 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20   while( n-- > 0 
da10: 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  ){.    pColName-
da20: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
da30: 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  l;.    pColName-
da40: 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  >db = p->db;.   
da50: 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d   pColName++;.  }
da60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
da70: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64  e name of the id
da80: 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  x'th column to b
da90: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
daa0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
dab0: 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62  .** zName must b
dac0: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
dad0: 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20   nul terminated 
dae0: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
daf0: 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20  is call must be 
db00: 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c  made after a cal
db10: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
db20: 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a  SetNumCols()..**
db30: 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61  .** The final pa
db40: 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d  rameter, xDel, m
db50: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51  ust be one of SQ
db60: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51  LITE_DYNAMIC, SQ
db70: 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f  LITE_STATIC.** o
db80: 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  r SQLITE_TRANSIE
db90: 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c  NT. If it is SQL
dba0: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65  ITE_DYNAMIC, the
dbb0: 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
dbc0: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e  nted.** to by zN
dbd0: 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65  ame will be free
dbe0: 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72  d by sqlite3DbFr
dbf0: 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64  ee() when the vd
dc00: 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e  be is destroyed.
dc10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
dc20: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20  dbeSetColName(. 
dc30: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20    /* Vdbe being 
dc60: 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20  configured */.  
dc70: 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20  int idx,        
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc90: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
dca0: 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65  umn zName applie
dcb0: 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61  s to */.  int va
dcc0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
dcd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
dce0: 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45  e of the COLNAME
dcf0: 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a  _* constants */.
dd00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
dd10: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
dd20: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
dd30: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
dd40: 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69  ng name */.  voi
dd50: 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  d (*xDel)(void*)
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd70: 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65   Memory manageme
dd80: 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20  nt strategy for 
dd90: 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  zName */.){.  in
dda0: 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f  t rc;.  Mem *pCo
ddb0: 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  lName;.  assert(
ddc0: 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75   idx<p->nResColu
ddd0: 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mn );.  assert( 
dde0: 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b  var<COLNAME_N );
ddf0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
de00: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
de10: 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65    assert( !zName
de20: 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45   || xDel!=SQLITE
de30: 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20  _DYNAMIC );.    
de40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
de50: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  MEM;.  }.  asser
de60: 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d  t( p->aColName!=
de70: 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20  0 );.  pColName 
de80: 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b  = &(p->aColName[
de90: 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43  idx+var*p->nResC
dea0: 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20  olumn]);.  rc = 
deb0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
dec0: 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
ded0: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
dee0: 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20  _UTF8, xDel);.  
def0: 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c  assert( rc!=0 ||
df00: 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c   !zName || (pCol
df10: 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  Name->flags&MEM_
df20: 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65  Term)!=0 );.  re
df30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
df40: 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74  * A read or writ
df50: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  e transaction ma
df60: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
df70: 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61  active on databa
df80: 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
df90: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
dfa0: 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d  n is active, com
dfb0: 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65  mit it. If there
dfc0: 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74   is a.** write-t
dfd0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e  ransaction spann
dfe0: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ing more than on
dff0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
e000: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
e010: 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74   takes care of t
e020: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e030: 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73  l trickery..*/.s
e040: 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
e050: 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  mmit(sqlite3 *db
e060: 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  , Vdbe *p){.  in
e070: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e  t i;.  int nTran
e080: 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65  s = 0;  /* Numbe
e090: 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77  r of databases w
e0a0: 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72  ith an active wr
e0b0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
e0c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
e0d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
e0e0: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a  eedXcommit = 0;.
e0f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
e100: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
e110: 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20  .  /* With this 
e120: 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56  option, sqlite3V
e130: 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66  tabSync() is def
e140: 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c  ined to be simpl
e150: 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f  y .  ** SQLITE_O
e160: 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73  K so p is not us
e170: 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53  ed. .  */.  UNUS
e180: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
e190: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65  .#endif..  /* Be
e1a0: 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
e1b0: 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74  ing else, call t
e1c0: 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  he xSync() callb
e1d0: 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a  ack for any.  **
e1e0: 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20   virtual module 
e1f0: 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69  tables written i
e200: 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
e210: 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a  on. This has to.
e220: 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66    ** be done bef
e230: 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  ore determining 
e240: 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72  whether a master
e250: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
e260: 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c   .  ** required,
e270: 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63   as an xSync() c
e280: 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20  allback may add 
e290: 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61  an attached data
e2a0: 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  base.  ** to the
e2b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
e2c0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
e2d0: 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29  3VtabSync(db, p)
e2e0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
e2f0: 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29  p determines (a)
e300: 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68   if the commit h
e310: 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ook should be in
e320: 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28  voked and.  ** (
e330: 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61  b) how many data
e340: 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20  base files have 
e350: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
e360: 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20  actions, not .  
e370: 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
e380: 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20   temp database. 
e390: 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  (b) is important
e3a0: 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65   because if more
e3b0: 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20   than .  ** one 
e3c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
e3d0: 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  s an open write 
e3e0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d  transaction, a m
e3f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20  aster journal.  
e400: 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69  ** file is requi
e410: 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69  red for an atomi
e420: 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a  c commit..  */ .
e430: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
e440: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
e450: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
e460: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
e470: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
e480: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
e490: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
e4a0: 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58  ) ){.      needX
e4b0: 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  commit = 1;.    
e4c0: 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72    if( i!=1 ) nTr
e4d0: 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  ans++;.      sql
e4e0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
e4f0: 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
e500: 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
e510: 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65  usiveLock(sqlite
e520: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
e530: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e540: 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b  BtreeLeave(pBt);
e550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
e560: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e570: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
e580: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e590: 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
e5a0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
e5b0: 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
e5c0: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
e5d0: 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
e5e0: 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
e5f0: 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
e600: 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
e610: 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
e620: 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69  ommitArg);.    i
e630: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
e640: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
e650: 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f  STRAINT_COMMITHO
e660: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
e670: 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63   /* The simple c
e680: 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68  ase - no more th
e690: 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
e6a0: 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69  file (not counti
e6b0: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50  ng the.  ** TEMP
e6c0: 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61   database) has a
e6d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74   transaction act
e6e0: 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20  ive.   There is 
e6f0: 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a  no need for the.
e700: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
e710: 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  nal..  **.  ** I
e720: 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
e730: 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ue of sqlite3Btr
e740: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20  eeGetFilename() 
e750: 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68  is a zero length
e760: 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74  .  ** string, it
e770: 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20   means the main 
e780: 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d  database is :mem
e790: 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66  ory: or a temp f
e7a0: 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74  ile.  In .  ** t
e7b0: 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e  hat case we do n
e7c0: 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69  ot support atomi
e7d0: 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  c multi-file com
e7e0: 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65  mits, so use the
e7f0: 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61   .  ** simple ca
e800: 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a  se then too..  *
e810: 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  /.  if( 0==sqlit
e820: 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74  e3Strlen30(sqlit
e830: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
e840: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
e850: 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73  t)).   || nTrans
e860: 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72  <=1.  ){.    for
e870: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
e880: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
e890: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
e8a0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
e8b0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
e8c0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
e8d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e8e0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
e8f0: 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  One(pBt, 0);.   
e900: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
e910: 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74  /* Do the commit
e920: 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74   only if all dat
e930: 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75  abases successfu
e940: 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61  lly complete pha
e950: 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66  se 1. .    ** If
e960: 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65   one of the Btre
e970: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
e980: 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74  ) calls fails, t
e990: 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e  his indicates an
e9a0: 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72  .    ** IO error
e9b0: 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20   while deleting 
e9c0: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20  or truncating a 
e9d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74  journal file. It
e9e0: 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20   is unlikely,.  
e9f0: 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68    ** but could h
ea00: 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63  appen. In this c
ea10: 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  ase abandon proc
ea20: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
ea30: 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20  n the error..   
ea40: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
ea50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
ea60: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
ea70: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
ea80: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
ea90: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
eaa0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
eab0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
eac0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
ead0: 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
eae0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
eaf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
eb00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
eb10: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
eb20: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
eb30: 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54  complex case - T
eb40: 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d  here is a multi-
eb50: 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73  file write-trans
eb60: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20  action active.. 
eb70: 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65   ** This require
eb80: 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
eb90: 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72  al file to ensur
eba0: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
ebb0: 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74  n is.  ** commit
ebc0: 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ted atomically..
ebd0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
ebe0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
ebf0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
ec00: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
ec10: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  db->pVfs;.    in
ec20: 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
ec30: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
ec40: 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65  r = 0;   /* File
ec50: 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61  -name for the ma
ec60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster journal */.
ec70: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
ec80: 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
ec90: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
eca0: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
ecb0: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
ecc0: 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d  _file *pMaster =
ecd0: 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73   0;.    i64 offs
ece0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  et = 0;.    int 
ecf0: 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  res;.    int ret
ed00: 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ryCount = 0;.   
ed10: 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a   int nMainFile;.
ed20: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61  .    /* Select a
ed30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ed40: 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  file name */.   
ed50: 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c   nMainFile = sql
ed60: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
ed70: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61  inFile);.    zMa
ed80: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  ster = sqlite3MP
ed90: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a  rintf(db, "%s-mj
eda0: 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61  XXXXXX9XXz", zMa
edb0: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  inFile);.    if(
edc0: 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65   zMaster==0 ) re
edd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
ede0: 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  M;.    do {.    
edf0: 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20    u32 iRandom;. 
ee00: 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f       if( retryCo
ee10: 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unt ){.        i
ee20: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30  f( retryCount>10
ee30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
ee40: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
ee50: 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65  E_FULL, "MJ dele
ee60: 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  te: %s", zMaster
ee70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
ee80: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
ee90: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
eea0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
eeb0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
eec0: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31  f( retryCount==1
eed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
eee0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
eef0: 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69  _FULL, "MJ colli
ef00: 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72  de: %s", zMaster
ef10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ef20: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79     }.      retry
ef30: 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  Count++;.      s
ef40: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
ef50: 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d  s(sizeof(iRandom
ef60: 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20  ), &iRandom);.  
ef70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
ef80: 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65  intf(13, &zMaste
ef90: 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d  r[nMainFile], "-
efa0: 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20  mj%06X9%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 20 20 20 20 28 69 52               (iR
efd0: 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66  andom>>8)&0xffff
efe0: 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66  ff, iRandom&0xff
eff0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
f000: 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20  antipenultimate 
f010: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65  character of the
f020: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f030: 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20  name must.      
f040: 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f  ** be "9" to avo
f050: 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f  id name collisio
f060: 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b  ns when using 8+
f070: 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a  3 filenames. */.
f080: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d        assert( zM
f090: 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72  aster[sqlite3Str
f0a0: 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33  len30(zMaster)-3
f0b0: 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20  ]=='9' );.      
f0c0: 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
f0d0: 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d  x3(zMainFile, zM
f0e0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63  aster);.      rc
f0f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
f100: 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
f110: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
f120: 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
f130: 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
f140: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20  QLITE_OK && res 
f150: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
f160: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f170: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
f180: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  ster journal. */
f190: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f1a0: 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28  te3OsOpenMalloc(
f1b0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26  pVfs, zMaster, &
f1c0: 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20  pMaster, .      
f1d0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
f1e0: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
f1f0: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
f200: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
f210: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
f220: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
f230: 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20  _JOURNAL, 0.    
f240: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
f250: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f260: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f270: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
f280: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
f290: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20  rn rc;.    }. . 
f2a0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
f2b0: 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74  name of each dat
f2c0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
f2d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
f2e0: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
f2f0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
f300: 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72   file. If an err
f310: 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  or occurs at thi
f320: 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20  s point close.  
f330: 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20    ** and delete 
f340: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f350: 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65  al file. All the
f360: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
f370: 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a  nal files.    **
f380: 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c   still have 'nul
f390: 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72  l' as the master
f3a0: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
f3b0: 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72  , so they will r
f3c0: 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20  oll.    ** back 
f3d0: 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66  independently if
f3e0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
f3f0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
f400: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
f410: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
f420: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
f430: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
f440: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
f450: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
f460: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
f470: 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73  const *zFile = s
f480: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f  qlite3BtreeGetJo
f490: 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a  urnalname(pBt);.
f4a0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
f4b0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
f4c0: 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
f4d0: 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20  Ignore TEMP and 
f4e0: 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73  :memory: databas
f4f0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  es */.        }.
f500: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f510: 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20  zFile[0]!=0 );. 
f520: 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64         if( !need
f530: 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33  Sync && !sqlite3
f540: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
f550: 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  d(pBt) ){.      
f560: 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
f570: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f580: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f590: 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
f5a0: 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53   zFile, sqlite3S
f5b0: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
f5c0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
f5d0: 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c     offset += sql
f5e0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
f5f0: 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  le)+1;.        i
f600: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f610: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
f620: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
f630: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
f640: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
f650: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
f660: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
f670: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
f680: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
f690: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
f6a0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
f6b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
f6c0: 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
f6d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
f6e0: 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
f6f0: 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a  QUENTIAL device.
f700: 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
f710: 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  et this is not r
f720: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
f730: 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
f740: 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71   .     && 0==(sq
f750: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
f760: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
f770: 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
f780: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20  AP_SEQUENTIAL). 
f790: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
f7a0: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
f7b0: 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
f7c0: 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
f7d0: 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
f7e0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
f7f0: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
f800: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
f810: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
f820: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
f830: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
f840: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
f850: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
f860: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
f870: 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
f880: 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
f890: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
f8a0: 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
f8b0: 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
f8c0: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
f8d0: 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
f8e0: 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
f8f0: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
f900: 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
f910: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
f920: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f930: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
f940: 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
f950: 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
f960: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
f970: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
f980: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
f990: 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
f9a0: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
f9b0: 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
f9c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
f9d0: 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
f9e0: 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
f9f0: 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
fa00: 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
fa10: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
fa20: 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
fa30: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
fa40: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
fa50: 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
fa60: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a   occurred..    *
fa70: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
fa80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
fa90: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
faa0: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
fab0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
fac0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
fad0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
fae0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
faf0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
fb00: 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
fb10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
fb20: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
fb30: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
fb40: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
fb50: 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69  TE_BUSY );.    i
fb60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
fb70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fb80: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
fb90: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
fba0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
fbb0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
fbc0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
fbd0: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
fbe0: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
fbf0: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
fc00: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
fc10: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
fc20: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
fc30: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
fc40: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
fc50: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
fc60: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
fc70: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
fc80: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
fc90: 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
fca0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
fcb0: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
fcc0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
fcd0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
fce0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
fcf0: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
fd00: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
fd10: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
fd20: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
fd30: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
fd40: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
fd50: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
fd60: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
fd70: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
fd80: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
fd90: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
fda0: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
fdb0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
fdc0: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
fdd0: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
fde0: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
fdf0: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
fe00: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
fe10: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
fe20: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
fe30: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
fe40: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
fe50: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
fe60: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
fe70: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
fe80: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
fe90: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
fea0: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
feb0: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
fec0: 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
fed0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
fee0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
fef0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
ff00: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
ff10: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
ff20: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
ff30: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
ff40: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
ff50: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
ff60: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
ff70: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ff80: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
ff90: 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
ffa0: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
ffb0: 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
ffc0: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
ffd0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
ffe0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
fff0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10000 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
10010 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63   sqlite3.nVdbeAc
10020 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61  tive count varia
10030 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
10040 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
10050 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
10060 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
10070 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
10080 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
10090 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
100a0 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
100b0 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
100c0 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
100d0 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
100e0 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
100f0 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
10100 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
10110 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
10120 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
10130 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
10140 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
10150 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
10160 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
10170 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
10180 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
10190 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  nt = 0;.  int nW
101a0 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rite = 0;.  int 
101b0 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d  nRead = 0;.  p =
101c0 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
101d0 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
101e0 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62  ( sqlite3_stmt_b
101f0 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d  usy((sqlite3_stm
10200 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63  t*)p) ){.      c
10210 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
10220 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
10230 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20   nWrite++;.     
10240 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65   if( p->bIsReade
10250 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20  r ) nRead++;.   
10260 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
10270 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
10280 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62  t( cnt==db->nVdb
10290 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73  eActive );.  ass
102a0 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d  ert( nWrite==db-
102b0 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
102c0 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d   assert( nRead==
102d0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
102e0 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
102f0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
10300 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
10310 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65  *.** If the Vdbe
10320 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
10330 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70  irst argument op
10340 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74  ened a statement
10350 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a  -transaction,.**
10360 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41   close it now. A
10370 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74  rgument eOp must
10380 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50   be either SAVEP
10390 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
103a0 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  .** SAVEPOINT_RE
103b0 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20  LEASE. If it is 
103c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
103d0 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61  CK, then the sta
103e0 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
103f0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
10400 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20  back. If eOp is 
10410 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
10420 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  E, then the .** 
10430 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
10440 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
10450 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
10460 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
10470 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
10480 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
10490 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
104a0 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   Otherwise SQLIT
104b0 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
104c0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
104d0 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  tement(Vdbe *p, 
104e0 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69  int eOp){.  sqli
104f0 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20  te3 *const db = 
10500 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
10510 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
10520 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d  /* If p->iStatem
10530 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ent is greater t
10540 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
10550 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20  his Vdbe opened 
10560 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  a .  ** statemen
10570 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  t transaction th
10580 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  at should be clo
10590 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e  sed here. The on
105a0 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a  ly exception.  *
105b0 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20  * is that an IO 
105c0 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f  error may have o
105d0 63 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67  ccurred, causing
105e0 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f   an emergency ro
105f0 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20  llback..  ** In 
10600 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e  this case (db->n
10610 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61  Statement==0), a
10620 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  nd there is noth
10630 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a  ing to do..  */.
10640 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65    if( db->nState
10650 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74  ment && p->iStat
10660 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74  ement ){.    int
10670 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   i;.    const in
10680 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  t iSavepoint = p
10690 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a  ->iStatement-1;.
106a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70  .    assert( eOp
106b0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
106c0 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56  BACK || eOp==SAV
106d0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b  EPOINT_RELEASE);
106e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
106f0 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b  >nStatement>0 );
10700 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
10710 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d  iStatement==(db-
10720 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e  >nStatement+db->
10730 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a  nSavepoint) );..
10740 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
10750 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
10760 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53       int rc2 = S
10770 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
10780 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
10790 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
107a0 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
107b0 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
107c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
107d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
107e0 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
107f0 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
10800 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10810 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
10820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10830 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49     if( rc2==SQLI
10840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10850 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
10860 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
10870 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  Bt, SAVEPOINT_RE
10880 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
10890 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
108a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
108b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
108c0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
108d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
108e0 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e  .    }.    db->n
108f0 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20  Statement--;.   
10900 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
10910 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   0;..    if( rc=
10920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10930 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
10940 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
10950 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10960 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
10970 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
10980 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
10990 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
109a0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
109b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
109c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
109d0 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
109e0 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  b, SAVEPOINT_REL
109f0 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
10a00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10a10 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
10a20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
10a30 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72  ction is being r
10a40 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f  olled back, also
10a50 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20   restore the .  
10a60 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61    ** database ha
10a70 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63  ndles deferred c
10a80 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65  onstraint counte
10a90 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  r to the value i
10aa0 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20  t had when .    
10ab0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
10ac0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
10ad0 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20   opened.  */.   
10ae0 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
10af0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
10b00 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
10b10 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74  redCons = p->nSt
10b20 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20  mtDefCons;.     
10b30 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
10b40 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  mCons = p->nStmt
10b50 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20  DefImmCons;.    
10b60 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
10b70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
10b80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
10b90 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  led when a trans
10ba0 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79  action opened by
10bb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
10bc0 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61  * handle associa
10bd0 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20  ted with the VM 
10be0 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
10bf0 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74  ument is about t
10c00 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74  o be .** committ
10c10 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ed. If there are
10c20 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66   outstanding def
10c30 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
10c40 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  y constraint.** 
10c50 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75  violations, retu
10c60 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
10c70 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
10c80 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
10c90 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
10ca0 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69  nding FK violati
10cb0 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ons and this fun
10cc0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a  ction returns .*
10cd0 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  * SQLITE_ERROR, 
10ce0 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
10cf0 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49  f the VM to SQLI
10d00 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
10d10 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20  REIGNKEY.** and 
10d20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  write an error m
10d30 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68  essage to it. Th
10d40 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  en return SQLITE
10d50 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64  _ERROR..*/.#ifnd
10d60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
10d70 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73  OREIGN_KEY.int s
10d80 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
10d90 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64  k(Vdbe *p, int d
10da0 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69  eferred){.  sqli
10db0 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
10dc0 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64  .  if( (deferred
10dd0 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72   && (db->nDeferr
10de0 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65  edCons+db->nDefe
10df0 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20  rredImmCons)>0) 
10e00 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65  .   || (!deferre
10e10 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  d && p->nFkConst
10e20 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20  raint>0) .  ){. 
10e30 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
10e40 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
10e50 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e  EIGNKEY;.    p->
10e60 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
10e70 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69  _Abort;.    sqli
10e80 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
10e90 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 46  >zErrMsg, db, "F
10ea0 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
10eb0 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a  raint failed");.
10ec0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10ed0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
10ee0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10ef0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
10f00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
10f10 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e   called the when
10f20 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f   a VDBE tries to
10f30 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56   halt.  If the V
10f40 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20  DBE.** has made 
10f50 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69  changes and is i
10f60 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64  n autocommit mod
10f70 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  e, then commit t
10f80 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  hose.** changes.
10f90 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20    If a rollback 
10fa0 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  is needed, then 
10fb0 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  do the rollback.
10fc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
10fd0 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  ine is the only 
10fe0 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  way to move the 
10ff0 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72  state of a VM fr
11000 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47  om.** SQLITE_MAG
11010 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45  IC_RUN to SQLITE
11020 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74  _MAGIC_HALT.  It
11030 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a   is harmless to.
11040 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20  ** call this on 
11050 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20  a VM that is in 
11060 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  the SQLITE_MAGIC
11070 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a  _HALT state..**.
11080 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
11090 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65  or code.  If the
110a0 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f   commit could no
110b0 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
110c0 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  se of.** lock co
110d0 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e  ntention, return
110e0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49   SQLITE_BUSY.  I
110f0 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  f SQLITE_BUSY is
11100 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a   returned, it.**
11110 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65   means the close
11120 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20   did not happen 
11130 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
11140 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  repeated..*/.int
11150 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
11160 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
11170 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11190 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72  Used to store tr
111a0 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63  ansient return c
111b0 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  odes */.  sqlite
111c0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
111d0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
111e0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
111f0 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72  logic that deter
11200 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65  mines if a state
11210 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61  ment or.  ** tra
11220 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
11230 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
11240 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
11250 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a  esult of the.  *
11260 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
11270 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
11280 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine. .  **.  ** 
11290 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
112a0 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f  llowing errors o
112b0 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccur:.  **.  ** 
112c0 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d      SQLITE_NOMEM
112d0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
112e0 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20  _IOERR.  **     
112f0 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a  SQLITE_FULL.  **
11300 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45       SQLITE_INTE
11310 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RRUPT.  **.  ** 
11320 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  Then the interna
11330 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61  l cache might ha
11340 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20  ve been left in 
11350 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a  an inconsistent.
11360 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20    ** state.  We 
11370 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  need to rollback
11380 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
11390 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74  ransaction, if t
113a0 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  here is.  ** one
113b0 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  , or the complet
113c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  e transaction if
113d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
113e0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
113f0 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20  on..  */..  if( 
11400 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
11410 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
11420 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
11430 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f  .  }.  if( p->aO
11440 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74  nceFlag ) memset
11450 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30  (p->aOnceFlag, 0
11460 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b  , p->nOnceFlag);
11470 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
11480 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  rs(p);.  if( p->
11490 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
114a0 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74  C_RUN ){.    ret
114b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
114c0 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65   }.  checkActive
114d0 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
114e0 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
114f0 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
11500 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
11510 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72 20  ever started or 
11520 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20  if the.  ** SQL 
11530 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e  statement does n
11540 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ot read or write
11550 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
11560 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
11570 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65  c>=0 && p->bIsRe
11580 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  ader ){.    int 
11590 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72  mrc;   /* Primar
115a0 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  y error code fro
115b0 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69  m p->rc */.    i
115c0 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  nt eStatementOp 
115d0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53  = 0;.    int isS
115e0 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20  pecialError;    
115f0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
11600 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65  o true if a 'spe
11610 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a  cial' error */..
11620 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20      /* Lock all 
11630 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74  btrees used by t
11640 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
11650 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
11660 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  nter(p);..    /*
11670 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f   Check for one o
11680 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
11690 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20  rors */.    mrc 
116a0 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a  = p->rc & 0xff;.
116b0 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
116c0 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45  or = mrc==SQLITE
116d0 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
116e0 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20  QLITE_IOERR.    
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11700 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
11710 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63  INTERRUPT || mrc
11720 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  ==SQLITE_FULL;. 
11730 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c     if( isSpecial
11740 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f  Error ){.      /
11750 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
11760 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64  as read-only and
11770 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
11780 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  is SQLITE_INTERR
11790 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e  UPT, .      ** n
117a0 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  o rollback is ne
117b0 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69  cessary. Otherwi
117c0 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73  se, at least a s
117d0 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
117e0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ** transaction m
117f0 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
11800 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ck to restore th
11810 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20  e database to a 
11820 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  .      ** consis
11830 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
11840 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76    **.      ** Ev
11850 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  en if the statem
11860 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ent is read-only
11870 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  , it is importan
11880 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20  t to perform.   
11890 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e     ** a statemen
118a0 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
118b0 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
118c0 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
118d0 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  r .      ** occu
118e0 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  rred while writi
118f0 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
11900 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  l, sub-journal o
11910 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  r database.     
11920 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74   ** file as part
11930 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   of an effort to
11940 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73   free up cache s
11950 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69  pace (see functi
11960 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  on.      ** page
11970 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67  rStress() in pag
11980 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62  er.c), the rollb
11990 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20  ack is required 
119a0 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20  to restore .    
119b0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74    ** the pager t
119c0 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73  o a consistent s
119d0 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tate..      */. 
119e0 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61       if( !p->rea
119f0 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51  dOnly || mrc!=SQ
11a00 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29  LITE_INTERRUPT )
11a10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
11a20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11a30 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
11a40 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73  FULL) && p->uses
11a50 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  StmtJournal ){. 
11a60 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d           eStatem
11a70 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
11a80 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
11a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11aa0 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
11ab0 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
11ac0 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
11ad0 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
11ae0 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
11af0 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
11b00 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
11b10 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
11b20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
11b30 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
11b40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
11b50 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
11b60 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
11b70 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
11b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
11b90 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
11ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
11bb0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
11bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11bd0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
11be0 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
11bf0 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
11c00 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
11c10 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
11c20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11c30 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
11c40 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
11c50 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
11c60 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
11c70 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
11c80 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
11c90 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
11ca0 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
11cb0 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
11cc0 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
11cd0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
11ce0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
11cf0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
11d00 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
11d10 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
11d20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
11d30 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
11d40 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
11d50 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
11d60 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
11d70 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
11d80 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
11d90 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
11da0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28  b->nVdbeWrite==(
11db0 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
11dc0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
11dd0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
11de0 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41  OK || (p->errorA
11df0 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26  ction==OE_Fail &
11e00 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f  & !isSpecialErro
11e10 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  r) ){.        rc
11e20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
11e30 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20  eckFk(p, 1);.   
11e40 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11e50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11e60 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d      if( NEVER(p-
11e70 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
11e80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11e90 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
11ea0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
11eb0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
11ec0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11ed0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
11ee0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
11ef0 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20  EIGNKEY;.       
11f00 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
11f10 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
11f20 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
11f30 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
11f40 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
11f50 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
11f60 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
11f70 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
11f80 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
11f90 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
11fa0 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
11fb0 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
11fc0 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
11fd0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
11fe0 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
11ff0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
12000 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
12010 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
12020 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
12030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12040 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12050 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64  _BUSY && p->read
12060 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
12070 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
12080 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
12090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
120a0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
120b0 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
120c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
120d0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
120e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
120f0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
12100 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
12110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12120 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
12130 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
12140 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
12150 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
12160 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
12170 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65  gs &= ~SQLITE_De
12180 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20  ferFKs;.        
12190 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
121a0 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
121b0 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
121c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
121d0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
121e0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
121f0 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _OK);.      }.  
12200 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
12210 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nt = 0;.    }els
12220 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74  e if( eStatement
12230 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  Op==0 ){.      i
12240 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
12250 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41  _OK || p->errorA
12260 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29  ction==OE_Fail )
12270 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
12280 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
12290 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20  NT_RELEASE;.    
122a0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
122b0 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41  rrorAction==OE_A
122c0 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
122d0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
122e0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
122f0 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
12300 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
12310 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
12320 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
12330 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  BACK);.        s
12340 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
12350 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
12360 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
12370 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
12380 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
12390 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69  f eStatementOp i
123a0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
123b0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
123c0 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
123d0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d  o.    ** be comm
123e0 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
123f0 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74  back. Call sqlit
12400 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
12410 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a  ment() to.    **
12420 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20   do so. If this 
12430 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e  operation return
12440 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  s an error, and 
12450 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
12460 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72  ement.    ** err
12470 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
12480 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43  E_OK or SQLITE_C
12490 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20  ONSTRAINT, then 
124a0 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20  promote the.    
124b0 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
124c0 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e  ment error code.
124d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
124e0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a  eStatementOp ){.
124f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12500 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
12510 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65  ment(p, eStateme
12520 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ntOp);.      if(
12530 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69   rc ){.        i
12540 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
12550 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78  _OK || (p->rc&0x
12560 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
12570 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
12580 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
12590 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
125a0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
125b0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
125c0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
125d0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
125e0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
125f0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
12600 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
12610 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
12620 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
12630 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
12640 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
12650 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
12660 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
12670 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52  his was an INSER
12680 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
12690 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65  ETE and no state
126a0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
126b0 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  .    ** has been
126c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70   rolled back, up
126d0 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
126e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61  e connection cha
126f0 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20  nge-counter. .  
12700 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
12710 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20  changeCntOn ){. 
12720 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d       if( eStatem
12730 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54  entOp!=SAVEPOINT
12740 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
12750 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12760 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70  SetChanges(db, p
12770 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  ->nChange);.    
12780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12790 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
127a0 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20  hanges(db, 0);. 
127b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
127c0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
127d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
127e0 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a  se the locks */.
127f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
12800 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20  eave(p);.  }..  
12810 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65  /* We have succe
12820 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61  ssfully halted a
12830 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d  nd closed the VM
12840 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66  .  Record this f
12850 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  act. */.  if( p-
12860 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62  >pc>=0 ){.    db
12870 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b  ->nVdbeActive--;
12880 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61  .    if( !p->rea
12890 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62  dOnly ) db->nVdb
128a0 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66  eWrite--;.    if
128b0 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  ( p->bIsReader )
128c0 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d   db->nVdbeRead--
128d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
128e0 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64  ->nVdbeActive>=d
128f0 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
12900 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12910 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e  nVdbeRead>=db->n
12920 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20  VdbeWrite );.   
12930 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
12940 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20  beWrite>=0 );.  
12950 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
12960 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a  DBE_MAGIC_HALT;.
12970 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
12980 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20  eCnt(db);.  if( 
12990 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
129a0 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
129b0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
129c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
129d0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
129e0 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ag is set to tru
129f0 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b  e, then any lock
12a00 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64  s that were held
12a10 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74  .  ** by connect
12a20 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20  ion db have now 
12a30 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43  been released. C
12a40 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  all sqlite3Conne
12a50 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20  ctionUnlocked() 
12a60 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20  .  ** to invoke 
12a70 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c  any required unl
12a80 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
12a90 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  acks..  */.  if(
12aa0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
12ab0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
12ac0 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
12ad0 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  (db);.  }..  ass
12ae0 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63  ert( db->nVdbeAc
12af0 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75  tive>0 || db->au
12b00 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64  toCommit==0 || d
12b10 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
12b20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d   );.  return (p-
12b30 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
12b40 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a   ? SQLITE_BUSY :
12b50 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a   SQLITE_OK);.}..
12b60 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45  ./*.** Each VDBE
12b70 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c   holds the resul
12b80 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
12b90 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65  cent sqlite3_ste
12ba0 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70  p() call.** in p
12bb0 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74  ->rc.  This rout
12bc0 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65  ine sets that re
12bd0 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c  sult back to SQL
12be0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20  ITE_OK..*/.void 
12bf0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
12c00 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20  StepResult(Vdbe 
12c10 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  *p){.  p->rc = S
12c20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12c30 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f  ** Copy the erro
12c40 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72  r code and error
12c50 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69   message belongi
12c60 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70  ng to the VDBE p
12c70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
12c80 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
12c90 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68  o its database h
12ca0 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74  andle (so that t
12cb0 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20  hey will be .** 
12cc0 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c  returned by call
12cd0 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72  s to sqlite3_err
12ce0 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74  code() and sqlit
12cf0 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a  e3_errmsg())..**
12d00 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12d10 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72  n does not clear
12d20 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20   the VDBE error 
12d30 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c  code or message,
12d40 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20   just.** copies 
12d50 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61  them to the data
12d60 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
12d70 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54  int sqlite3VdbeT
12d80 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62  ransferError(Vdb
12d90 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
12da0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
12db0 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
12dc0 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67    if( p->zErrMsg
12dd0 20 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f   ){.    u8 mallo
12de0 63 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61  cFailed = db->ma
12df0 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
12e00 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
12e10 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
12e20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20  if( db->pErr==0 
12e30 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c  ) db->pErr = sql
12e40 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29  ite3ValueNew(db)
12e50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
12e60 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
12e70 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
12e80 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
12e90 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
12ea0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
12eb0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
12ec0 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
12ed0 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61  ailed = mallocFa
12ee0 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72  iled;.    db->er
12ef0 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65  rCode = rc;.  }e
12f00 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
12f10 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20  Error(db, rc);. 
12f20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12f30 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
12f40 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f  _ENABLE_SQLLOG./
12f50 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54  *.** If an SQLIT
12f60 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20  E_CONFIG_SQLLOG 
12f70 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72  hook is register
12f80 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61  ed and the VM ha
12f90 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20  s been run, .** 
12fa0 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74  invoke it..*/.st
12fb0 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e  atic void vdbeIn
12fc0 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20  vokeSqllog(Vdbe 
12fd0 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *v){.  if( sqlit
12fe0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
12ff0 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d  Sqllog && v->rc=
13000 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d  =SQLITE_OK && v-
13010 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d  >zSql && v->pc>=
13020 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
13030 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74  Expanded = sqlit
13040 65 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28  e3VdbeExpandSql(
13050 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20  v, v->zSql);.   
13060 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e   assert( v->db->
13070 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a  init.busy==0 );.
13080 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65      if( zExpande
13090 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
130a0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
130b0 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20  Sqllog(.        
130c0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
130d0 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
130e0 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64  , v->db, zExpand
130f0 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20  ed, 1.      );. 
13100 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
13110 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e  ee(v->db, zExpan
13120 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ded);.    }.  }.
13130 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
13140 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
13150 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  g(x).#endif../*.
13160 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44  ** Clean up a VD
13170 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
13180 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65  on but do not de
13190 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75  lete the VDBE ju
131a0 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65  st yet..** Write
131b0 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
131c0 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ges into *pzErrM
131d0 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  sg.  Return the 
131e0 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a  result code..**.
131f0 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
13200 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68  utine is run, th
13210 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65  e VDBE should be
13220 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65   ready to be exe
13230 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a  cuted.** again..
13240 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74  **.** To look at
13250 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c   it another way,
13260 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
13270 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
13280 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  f the.** virtual
13290 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44   machine from VD
132a0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20  BE_MAGIC_RUN or 
132b0 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
132c0 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f  back to.** VDBE_
132d0 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69  MAGIC_INIT..*/.i
132e0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
132f0 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  set(Vdbe *p){.  
13300 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64  sqlite3 *db;.  d
13310 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
13320 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e   If the VM did n
13330 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  ot run to comple
13340 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e  tion or if it en
13350 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a  countered an.  *
13360 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74  * error, then it
13370 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
13380 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70  been halted prop
13390 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20  erly.  So halt. 
133a0 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f   ** it now..  */
133b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  .  sqlite3VdbeHa
133c0 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  lt(p);..  /* If 
133d0 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
133e0 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
133f0 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
13400 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
13410 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
13420 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
13430 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
13440 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
13450 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
13460 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
13470 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
13480 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
13490 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
134a0 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
134b0 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
134c0 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
134d0 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
134e0 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
134f0 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
13500 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
13510 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
13520 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
13530 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
13540 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(p);.    sqlite
13550 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
13560 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
13570 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
13580 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f   if( p->runOnlyO
13590 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64  nce ) p->expired
135a0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
135b0 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78  ( p->rc && p->ex
135c0 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  pired ){.    /* 
135d0 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67  The expired flag
135e0 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20   was set on the 
135f0 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20  VDBE before the 
13600 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a  first call.    *
13610 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  * to sqlite3_ste
13620 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74  p(). For consist
13630 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69  ency (since sqli
13640 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20  te3_step() was. 
13650 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73     ** called), s
13660 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
13670 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61  error in this ca
13680 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20  se as well..    
13690 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
136a0 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70  rorWithMsg(db, p
136b0 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  ->rc, p->zErrMsg
136c0 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e   ? "%s" : 0, p->
136d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  zErrMsg);.    sq
136e0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
136f0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
13700 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
13710 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61  .  }..  /* Recla
13720 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73  im all memory us
13730 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20  ed by the VDBE. 
13740 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29   */.  Cleanup(p)
13750 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  ;..  /* Save pro
13760 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
13770 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
13780 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  E run..  */.#ifd
13790 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
137a0 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75    {.    FILE *ou
137b0 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f  t = fopen("vdbe_
137c0 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61  profile.out", "a
137d0 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20  ");.    if( out 
137e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
137f0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
13800 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20  t, "---- ");.   
13810 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
13820 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
13830 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
13840 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b   "%02x", p->aOp[
13850 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20  i].opcode);.    
13860 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
13870 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
13880 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20      if( p->zSql 
13890 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
138a0 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20  c, pc = 0;.     
138b0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
138c0 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
138d0 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d  for(i=0; (c = p-
138e0 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b  >zSql[i])!=0; i+
138f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
13900 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72  ( pc=='\n' ) fpr
13910 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29  intf(out, "-- ")
13920 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 63  ;.          putc
13930 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  (c, out);.      
13940 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20      pc = c;.    
13950 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
13960 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72  ( pc!='\n' ) fpr
13970 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
13980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
13990 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
139a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
139b0 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a  char zHdr[100];.
139c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
139d0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
139e0 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36  zHdr), zHdr, "%6
139f0 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22  u %12llu %8llu "
13a00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
13a10 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20  aOp[i].cnt,.    
13a20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
13a30 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20  .cycles,.       
13a40 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
13a50 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e  t>0 ? p->aOp[i].
13a60 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d  cycles/p->aOp[i]
13a70 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20  .cnt : 0.       
13a80 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   );.        fpri
13a90 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
13aa0 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Hdr);.        sq
13ab0 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
13ac0 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
13ad0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
13ae0 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
13af0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13b00 66 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54  f.  p->iCurrentT
13b10 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61  ime = 0;.  p->ma
13b20 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
13b30 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20  _INIT;.  return 
13b40 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d  p->rc & db->errM
13b50 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43  ask;.}. ./*.** C
13b60 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65  lean up and dele
13b70 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20  te a VDBE after 
13b80 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75  execution.  Retu
13b90 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
13ba0 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65  ich is.** the re
13bb0 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74  sult code.  Writ
13bc0 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
13bd0 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70  age text into *p
13be0 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
13bf0 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
13c00 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ize(Vdbe *p){.  
13c10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13c20 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  OK;.  if( p->mag
13c30 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
13c40 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  UN || p->magic==
13c50 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
13c60 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
13c70 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b  te3VdbeReset(p);
13c80 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63  .    assert( (rc
13c90 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73   & p->db->errMas
13ca0 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20  k)==rc );.  }.  
13cb0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
13cc0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
13cd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  c;.}../*.** If p
13ce0 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20  arameter iOp is 
13cf0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
13d00 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
13d10 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a  destructor for.*
13d20 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20  * all auxiliary 
13d30 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75  data pointers cu
13d40 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62  rrently cached b
13d50 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  y the VM passed 
13d60 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  as.** the first 
13d70 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
13d80 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72  Or, if iOp is gr
13d90 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
13da0 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
13db0 6e 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  n the destructor
13dc0 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f   is.** only invo
13dd0 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75  ked for those au
13de0 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
13df0 6e 74 65 72 73 20 63 72 65 61 74 65 64 20 62 79  nters created by
13e00 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75   the user .** fu
13e10 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62  nction invoked b
13e20 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f  y the OP_Functio
13e30 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74  n opcode at inst
13e40 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a  ruction iOp of .
13e50 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64  ** VM pVdbe, and
13e60 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a   only then if:.*
13e70 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73  *.**    * the as
13e80 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f  sociated functio
13e90 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  n parameter is t
13ea0 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72  he 32nd or later
13eb0 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20   (counting.**   
13ec0 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20     from left to 
13ed0 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a  right), or.**.**
13ee0 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73      * the corres
13ef0 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61  ponding bit in a
13f00 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20  rgument mask is 
13f10 63 6c 65 61 72 20 28 77 68 65 72 65 20 74 68 65  clear (where the
13f20 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66   first.**      f
13f30 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
13f40 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  r corresponds to
13f50 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f   bit 0 etc.)..*/
13f60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
13f70 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56  eDeleteAuxData(V
13f80 64 62 65 20 2a 70 56 64 62 65 2c 20 69 6e 74 20  dbe *pVdbe, int 
13f90 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  iOp, int mask){.
13fa0 20 20 41 75 78 44 61 74 61 20 2a 2a 70 70 20 3d    AuxData **pp =
13fb0 20 26 70 56 64 62 65 2d 3e 70 41 75 78 44 61 74   &pVdbe->pAuxDat
13fc0 61 3b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20  a;.  while( *pp 
13fd0 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a  ){.    AuxData *
13fe0 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20  pAux = *pp;.    
13ff0 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20  if( (iOp<0).    
14000 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d   || (pAux->iOp==
14010 69 4f 70 20 26 26 20 28 70 41 75 78 2d 3e 69 41  iOp && (pAux->iA
14020 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20  rg>31 || !(mask 
14030 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78  & MASKBIT32(pAux
14040 2d 3e 69 41 72 67 29 29 29 29 0a 20 20 20 20 29  ->iArg)))).    )
14050 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
14060 28 20 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31  ( pAux->iArg==31
14070 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41   );.      if( pA
14080 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20  ux->xDelete ){. 
14090 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65         pAux->xDe
140a0 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29  lete(pAux->pAux)
140b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
140c0 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78  *pp = pAux->pNex
140d0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
140e0 44 62 46 72 65 65 28 70 56 64 62 65 2d 3e 64 62  DbFree(pVdbe->db
140f0 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c  , pAux);.    }el
14100 73 65 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70  se{.      pp= &p
14110 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Aux->pNext;.    
14120 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
14130 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
14140 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
14150 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
14160 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
14170 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74  ument,.** except
14180 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65   for object itse
14190 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70 72 65  lf, which is pre
141a0 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  served..**.** Th
141b0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
141c0 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
141d0 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64  on and sqlite3Vd
141e0 62 65 44 65 6c 65 74 65 28 29 20 69 73 20 74 68  beDelete() is th
141f0 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65  at.** VdbeDelete
14200 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20  () also unlinks 
14210 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68  the Vdbe from th
14220 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73  e list of VMs as
14230 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
14240 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
14250 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nnection and fre
14260 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74  es the object it
14270 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  self..*/.void sq
14280 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
14290 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  ject(sqlite3 *db
142a0 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75  , Vdbe *p){.  Su
142b0 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20  bProgram *pSub, 
142c0 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b  *pNext;.  int i;
142d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
142e0 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62  ==0 || p->db==db
142f0 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   );.  releaseMem
14300 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
14310 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61  ->nVar);.  relea
14320 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
14330 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
14340 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
14350 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e  ;.  for(pSub=p->
14360 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20  pProgram; pSub; 
14370 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20  pSub=pNext){.   
14380 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70   pNext = pSub->p
14390 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72  Next;.    vdbeFr
143a0 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53  eeOpArray(db, pS
143b0 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e  ub->aOp, pSub->n
143c0 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Op);.    sqlite3
143d0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29  DbFree(db, pSub)
143e0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d  ;.  }.  for(i=p-
143f0 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20  >nzVar-1; i>=0; 
14400 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72  i--) sqlite3DbFr
14410 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b  ee(db, p->azVar[
14420 69 5d 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f  i]);.  vdbeFreeO
14430 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f  pArray(db, p->aO
14440 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71  p, p->nOp);.  sq
14450 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14460 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
14470 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14480 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71  , p->zSql);.  sq
14490 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
144a0 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66 20 64  p->pFree);.#if d
144b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
144c0 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
144d0 4e 29 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  N).  sqlite3DbFr
144e0 65 65 28 64 62 2c 20 70 2d 3e 7a 45 78 70 6c 61  ee(db, p->zExpla
144f0 69 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  in);.  sqlite3Db
14500 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 45 78 70  Free(db, p->pExp
14510 6c 61 69 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  lain);.#endif.}.
14520 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
14530 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
14540 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
14550 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
14560 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
14570 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ..  if( NEVER(p=
14580 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
14590 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
145a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
145b0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
145c0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
145d0 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
145e0 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d  db, p);.  if( p-
145f0 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
14600 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
14610 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
14620 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
14630 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
14640 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70     db->pVdbe = p
14650 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
14660 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
14670 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
14680 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
14690 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
146a0 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b  VDBE_MAGIC_DEAD;
146b0 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20  .  p->db = 0;.  
146c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
146d0 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , p);.}../*.** T
146e0 68 65 20 63 75 72 73 6f 72 20 22 70 22 20 68 61  he cursor "p" ha
146f0 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b  s a pending seek
14700 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20   operation that 
14710 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
14720 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e  .** carried out.
14730 20 20 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f    Seek the curso
14740 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72  r now.  If an er
14750 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
14760 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70  rn.** the approp
14770 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
14780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14790 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
147a0 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f  handleDeferredMo
147b0 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
147c0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20  *p){.  int res, 
147d0 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
147e0 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20  E_TEST.  extern 
147f0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
14800 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
14810 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65  .  assert( p->de
14820 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a  ferredMoveto );.
14830 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54    assert( p->isT
14840 61 62 6c 65 20 29 3b 0a 20 20 72 63 20 3d 20 73  able );.  rc = s
14850 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
14860 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75  oUnpacked(p->pCu
14870 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
14880 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65  toTarget, 0, &re
14890 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
148a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 2d 3e 6c  eturn rc;.  p->l
148b0 61 73 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f  astRowid = p->mo
148c0 76 65 74 6f 54 61 72 67 65 74 3b 0a 20 20 69 66  vetoTarget;.  if
148d0 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72  ( res!=0 ) retur
148e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
148f0 5f 42 4b 50 54 3b 0a 20 20 70 2d 3e 72 6f 77 69  _BKPT;.  p->rowi
14900 64 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69  dIsValid = 1;.#i
14910 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
14920 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  .  sqlite3_searc
14930 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  h_count++;.#endi
14940 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  f.  p->deferredM
14950 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e  oveto = 0;.  p->
14960 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
14970 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74  CHE_STALE;.  ret
14980 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14990 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e  ../*.** Somethin
149a0 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73  g has moved curs
149b0 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c  or "p" out of pl
149c0 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20  ace.  Maybe the 
149d0 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f  row it was.** po
149e0 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c  inted to was del
149f0 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
14a00 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62  der it.  Or mayb
14a10 65 20 74 68 65 20 62 74 72 65 65 20 77 61 73 0a  e the btree was.
14a20 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20  ** rebalanced.  
14a30 57 68 61 74 65 76 65 72 20 74 68 65 20 63 61 75  Whatever the cau
14a40 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f  se, try to resto
14a50 72 65 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c  re "p" to the pl
14a60 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70  ace it.** is sup
14a70 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e  posed to be poin
14a80 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f  ting.  If the ro
14a90 77 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  w was deleted ou
14aa0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
14ab0 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20  .** cursor, set 
14ac0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
14ad0 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f  int to a NULL ro
14ae0 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
14af0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
14b00 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
14b10 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  or(VdbeCursor *p
14b20 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65  ){.  int isDiffe
14b30 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61  rentRow, rc;.  a
14b40 73 73 65 72 74 28 20 70 2d 3e 70 43 75 72 73 6f  ssert( p->pCurso
14b50 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
14b60 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
14b70 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
14b80 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63  pCursor) );.  rc
14b90 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
14ba0 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e  ursorRestore(p->
14bb0 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66  pCursor, &isDiff
14bc0 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e  erentRow);.  p->
14bd0 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
14be0 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28  CHE_STALE;.  if(
14bf0 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20   isDifferentRow 
14c00 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31  ) p->nullRow = 1
14c10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14c20 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
14c30 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69  e the cursor p i
14c40 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20  s ready to read 
14c50 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77  or write the row
14c60 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20   to which it.** 
14c70 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f  was last positio
14c80 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ned.  Return an 
14c90 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
14ca0 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f   OOM fault or I/
14cb0 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65  O error.** preve
14cc0 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69  nts us from posi
14cd0 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73  tioning the curs
14ce0 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  or to its correc
14cf0 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t position..**.*
14d00 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
14d10 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
14d20 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
14d30 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
14d40 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
14d50 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20  ow.  If no move 
14d60 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63  is pending, chec
14d70 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
14d80 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  row has been.** 
14d90 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
14da0 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
14db0 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c  r and if it has,
14dc0 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73   mark the row as
14dd0 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a  .** a NULL row..
14de0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
14df0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
14e00 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63  ointing to the c
14e10 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74  orrect row and t
14e20 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e  hat row has.** n
14e30 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ot been deleted 
14e40 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
14e50 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  he cursor, then 
14e60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
14e70 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
14e80 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
14e90 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73  rMoveto(VdbeCurs
14ea0 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
14eb0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
14ec0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61  ){.    return ha
14ed0 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65  ndleDeferredMove
14ee0 74 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28  to(p);.  }.  if(
14ef0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
14f00 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70  sorHasMoved(p->p
14f10 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72  Cursor) ){.    r
14f20 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65  eturn handleMove
14f30 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a  dCursor(p);.  }.
14f40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14f50 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
14f60 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
14f70 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
14f80 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
14f90 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
14fa0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
14fb0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
14fc0 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
14fd0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14fe0 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Put().** sqlite3
14ff0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a  VdbeSerialGet().
15000 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
15010 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
15020 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
15030 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
15040 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
15050 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
15060 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
15070 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
15080 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
15090 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
150a0 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
150b0 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
150c0 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
150d0 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
150e0 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
150f0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
15100 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
15110 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
15120 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
15130 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
15140 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
15150 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
15160 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
15170 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
15180 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
15190 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
151a0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
151b0 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
151c0 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
151d0 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
151e0 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
151f0 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
15200 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
15210 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
15220 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
15230 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  parately..**.** 
15240 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
15250 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
15260 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
15270 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
15280 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
15290 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
152a0 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
152b0 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
152c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
152d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
152e0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
152f0 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
15300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15310 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
15320 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15340 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
15350 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
15360 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
15370 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
15380 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
15390 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153b0 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
153c0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
153d0 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
153e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
153f0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
15400 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
15410 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
15420 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
15430 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
15440 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15460 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
15470 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
15480 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
15490 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
154a0 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
154b0 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
154c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154d0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
154e0 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
154f0 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15510 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
15520 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
15530 2a 2a 20 20 20 20 20 31 30 2c 31 31 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 20 20 20 20 20 20 72 65 73 65 72             reser
15560 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
15570 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
15580 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
15590 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
155a0 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
155b0 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
155c0 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
155d0 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
155e0 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
155f0 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
15600 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
15610 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
15620 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
15630 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
15640 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
15650 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
15660 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
15670 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
15680 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
15690 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
156a0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
156b0 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
156c0 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e  le_format){.  in
156d0 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
156e0 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a  flags;.  u32 n;.
156f0 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
15700 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
15710 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
15720 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
15730 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
15740 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
15750 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
15760 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
15770 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
15780 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
15790 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  8000)<<32)-1).  
157a0 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
157b0 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
157c0 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
157d0 20 20 20 20 20 69 66 28 20 69 3c 28 2d 4d 41 58       if( i<(-MAX
157e0 5f 36 42 59 54 45 29 20 29 20 72 65 74 75 72 6e  _6BYTE) ) return
157f0 20 36 3b 0a 20 20 20 20 20 20 2f 2a 20 50 72 65   6;.      /* Pre
15800 76 69 6f 75 73 20 74 65 73 74 20 70 72 65 76 65  vious test preve
15810 6e 74 73 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32  nts:  u = -(-922
15820 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38  3372036854775808
15830 29 20 2a 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d  ) */.      u = -
15840 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
15850 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d      u = i;.    }
15860 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
15870 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
15880 28 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c  ((i&1)==i && fil
15890 65 5f 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38  e_format>=4) ? 8
158a0 2b 28 75 33 32 29 75 20 3a 20 31 3b 0a 20 20 20  +(u32)u : 1;.   
158b0 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32   }.    if( u<=32
158c0 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  767 ) return 2;.
158d0 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
158e0 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  07 ) return 3;. 
158f0 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
15900 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b  3647 ) return 4;
15910 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
15920 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35  6BYTE ) return 5
15930 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
15940 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
15950 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
15960 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
15970 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
15980 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
15990 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  | flags&(MEM_Str
159a0 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
159b0 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e  assert( pMem->n>
159c0 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32  =0 );.  n = (u32
159d0 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20  )pMem->n;.  if( 
159e0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
159f0 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
15a00 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  m->u.nZero;.  }.
15a10 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
15a20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
15a30 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
15a40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
15a50 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
15a60 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
15a70 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
15a80 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
15a90 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
15aa0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
15ab0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
15ac0 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
15ad0 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72  ype>=12 ){.    r
15ae0 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
15af0 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73  pe-12)/2;.  }els
15b00 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
15b10 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d  nst u8 aSize[] =
15b20 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34   { 0, 1, 2, 3, 4
15b30 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c  , 6, 8, 8, 0, 0,
15b40 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74   0, 0 };.    ret
15b50 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c  urn aSize[serial
15b60 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _type];.  }.}../
15b70 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
15b80 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
15b90 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
15ba0 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
15bb0 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
15bc0 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
15bd0 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
15be0 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
15bf0 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
15c00 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
15c10 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
15c20 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
15c30 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
15c40 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
15c50 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
15c60 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
15c70 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
15c80 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
15c90 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
15ca0 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
15cb0 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
15cc0 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
15cd0 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
15ce0 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
15cf0 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
15d00 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
15d10 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
15d20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
15d30 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
15d40 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
15d50 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
15d60 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
15d70 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
15d80 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
15d90 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
15da0 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
15db0 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
15dc0 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
15dd0 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
15de0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
15df0 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
15e00 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
15e10 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
15e20 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
15e30 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
15e40 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
15e50 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
15e60 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
15e70 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
15e80 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
15e90 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
15ea0 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
15eb0 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
15ec0 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
15ed0 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
15ee0 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
15ef0 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
15f00 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
15f10 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
15f20 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
15f30 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
15f40 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
15f50 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
15f60 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
15f70 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
15f80 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
15f90 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
15fa0 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
15fb0 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
15fc0 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
15fd0 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
15fe0 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
15ff0 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
16000 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
16010 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
16020 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
16030 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
16040 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
16050 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
16060 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
16070 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
16080 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
16090 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
160a0 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
160b0 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
160c0 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
160d0 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
160e0 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
160f0 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
16100 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
16110 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
16120 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
16130 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
16140 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
16150 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
16160 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
16170 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
16180 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
16190 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
161a0 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
161b0 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
161c0 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
161d0 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
161e0 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
161f0 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
16200 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
16210 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
16220 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
16230 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
16240 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
16250 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
16260 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
16270 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
16280 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
16290 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
162a0 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
162b0 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
162c0 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
162d0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
162e0 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
162f0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
16300 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
16310 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
16320 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
16330 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
16340 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
16350 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
16360 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
16370 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
16380 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
16390 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
163a0 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
163b0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
163c0 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
163d0 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
163e0 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
163f0 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
16400 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65  uf[].  The calle
16410 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
16420 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  .** for allocati
16430 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ng enough space 
16440 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64  to buf[] to hold
16450 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
16460 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  d, exclusive.** 
16470 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e  of the pMem->u.n
16480 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61  Zero bytes for a
16490 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e   MEM_Zero value.
164a0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
164b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
164c0 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
164d0 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  en into buf[].  
164e0 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
164f0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65   bytes in the ze
16500 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69  ro-filled tail i
16510 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
16520 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
16530 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20  nly.** if those 
16540 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65  bytes were zeroe
16550 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a  d in buf[]..*/ .
16560 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
16570 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66  erialPut(u8 *buf
16580 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32  , Mem *pMem, u32
16590 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
165a0 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   u32 len;..  /* 
165b0 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
165c0 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
165d0 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
165e0 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
165f0 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20   u64 v;.    u32 
16600 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
16610 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
16620 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
16630 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
16640 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  m->r) );.      m
16650 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
16660 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  >r, sizeof(v));.
16670 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
16680 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
16690 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
166a0 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
166b0 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
166c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
166d0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
166e0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73  al_type);.    as
166f0 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
16700 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d   do{.      buf[-
16710 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46  -i] = (u8)(v&0xF
16720 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
16730 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  8;.    }while( i
16740 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c   );.    return l
16750 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  en;.  }..  /* St
16760 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
16770 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
16780 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73  e>=12 ){.    ass
16790 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28  ert( pMem->n + (
167a0 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
167b0 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75  EM_Zero)?pMem->u
167c0 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20  .nZero:0).      
167d0 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73         == (int)s
167e0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
167f0 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
16800 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20  ype) );.    len 
16810 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d  = pMem->n;.    m
16820 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d  emcpy(buf, pMem-
16830 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65  >z, len);.    re
16840 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
16850 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73   /* NULL or cons
16860 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a  tants 0 or 1 */.
16870 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
16880 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73 20 61  * Input "x" is a
16890 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73   sequence of uns
168a0 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72 73  igned characters
168b0 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 20   that represent 
168c0 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20  a.** big-endian 
168d0 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e  integer.  Return
168e0 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
168f0 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a  native integer.*
16900 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59  /.#define ONE_BY
16910 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69  TE_INT(x)    ((i
16920 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e  8)(x)[0]).#defin
16930 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78  e TWO_BYTE_INT(x
16940 29 20 20 20 20 28 32 35 36 2a 28 69 38 29 28 28  )    (256*(i8)((
16950 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23  x)[0])|(x)[1]).#
16960 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54  define THREE_BYT
16970 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33 36  E_INT(x)  (65536
16980 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28  *(i8)((x)[0])|((
16990 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d  x)[1]<<8)|(x)[2]
169a0 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42  ).#define FOUR_B
169b0 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28  YTE_UINT(x)  (((
169c0 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c  u32)(x)[0]<<24)|
169d0 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78  ((x)[1]<<16)|((x
169e0 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29  )[2]<<8)|(x)[3])
169f0 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59  .#define FOUR_BY
16a00 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37  TE_INT(x) (16777
16a10 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  216*(i8)((x)[0])
16a20 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28  |((x)[1]<<16)|((
16a30 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d  x)[2]<<8)|(x)[3]
16a40 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  )../*.** Deseria
16a50 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
16a60 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
16a70 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
16a80 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
16a90 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
16aa0 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
16ab0 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
16ac0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
16ad0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
16ae0 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  nction is implem
16af0 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65 70  ented as two sep
16b00 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66  arate routines f
16b10 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  or performance..
16b20 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73 65 73  ** The few cases
16b30 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f   that require lo
16b40 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72  cal variables ar
16b50 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74  e broken out int
16b60 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20  o a separate.** 
16b70 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20  routine so that 
16b80 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68  in most cases th
16b90 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f  e overhead of mo
16ba0 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70  ving the stack p
16bb0 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f  ointer.** is avo
16bc0 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  ided..*/ .static
16bd0 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   u32 SQLITE_NOIN
16be0 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a  LINE serialGet(.
16bf0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
16c00 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
16c10 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
16c20 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
16c30 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
16c40 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
16c50 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
16c60 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
16c70 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
16c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c90 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
16ca0 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
16cb0 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34  into */.){.  u64
16cc0 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
16cd0 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20  INT(buf);.  u32 
16ce0 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
16cf0 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d  NT(buf+4);.  x =
16d00 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20   (x<<32) + y;.  
16d10 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
16d20 3d 36 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e  =6 ){.    pMem->
16d30 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  u.i = *(i64*)&x;
16d40 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
16d50 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
16d60 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
16d70 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65  u.i<0 );.  }else
16d80 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  {.#if !defined(N
16d90 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
16da0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
16db0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
16dc0 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
16dd0 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66  t integers and f
16de0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
16df0 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d  lues use the sam
16e00 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72  e.    ** byte or
16e10 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69  der.  Or, that i
16e20 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
16e30 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
16e40 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  T is.    ** defi
16e50 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20  ned that 64-bit 
16e60 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
16e70 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65  alues really are
16e80 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e   mixed.    ** en
16e90 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dian..    */.   
16ea0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36   static const u6
16eb0 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33  4 t1 = ((u64)0x3
16ec0 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20  ff00000)<<32;.  
16ed0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
16ee0 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
16ef0 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
16f00 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e  .    swapMixedEn
16f10 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20  dianFloat(t2);. 
16f20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
16f30 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32  f(r1)==sizeof(t2
16f40 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c  ) && memcmp(&r1,
16f50 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29   &t2, sizeof(r1)
16f60 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20  )==0 );.#endif. 
16f70 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
16f80 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f  f(x)==8 && sizeo
16f90 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b  f(pMem->r)==8 );
16fa0 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e  .    swapMixedEn
16fb0 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20  dianFloat(x);.  
16fc0 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e    memcpy(&pMem->
16fd0 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
16fe0 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  );.    pMem->fla
16ff0 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61  gs = sqlite3IsNa
17000 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d  N(pMem->r) ? MEM
17010 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c  _Null : MEM_Real
17020 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38  ;.  }.  return 8
17030 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56  ;.}.u32 sqlite3V
17040 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
17050 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
17060 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
17070 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
17080 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
17090 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
170a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
170b0 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
170c0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
170d0 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
170e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170f0 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
17100 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
17110 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
17120 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
17130 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20  {.    case 10:  
17140 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
17150 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
17160 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
17170 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
17180 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
17190 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55  case 0: {  /* NU
171a0 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  LL */.      pMem
171b0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
171c0 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
171d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
171e0 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
171f0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
17200 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
17210 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28   = ONE_BYTE_INT(
17220 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
17230 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
17240 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
17250 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
17260 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
17270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
17280 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
17290 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
172a0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
172b0 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  i = TWO_BYTE_INT
172c0 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
172d0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
172e0 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
172f0 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
17300 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17310 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  2;.    }.    cas
17320 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
17330 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
17340 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
17350 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f  .i = THREE_BYTE_
17360 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
17370 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
17380 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
17390 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
173a0 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
173b0 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 3;.    }.    
173c0 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
173d0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
173e0 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
173f0 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54  ->u.i = FOUR_BYT
17400 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
17410 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
17420 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
17430 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
17440 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
17450 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20  turn 4;.    }.  
17460 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
17470 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
17480 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
17490 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42  em->u.i = FOUR_B
174a0 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20  YTE_UINT(buf+2) 
174b0 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
174c0 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75  *TWO_BYTE_INT(bu
174d0 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
174e0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
174f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
17500 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
17510 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a        return 6;.
17520 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
17530 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  :   /* 8-byte si
17540 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
17550 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a      case 7: { /*
17560 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70   IEEE floating p
17570 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  oint */.      /*
17580 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c   These use local
17590 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64   variables, so d
175a0 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61  o them in a sepa
175b0 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20  rate routine.   
175c0 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68     ** to avoid h
175d0 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68  aving to move th
175e0 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20  e frame pointer 
175f0 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
17600 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  se */.      retu
17610 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75 66  rn serialGet(buf
17620 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65  ,serial_type,pMe
17630 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  m);.    }.    ca
17640 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65  se 8:    /* Inte
17650 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73  ger 0 */.    cas
17660 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67  e 9: {  /* Integ
17670 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d  er 1 */.      pM
17680 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c  em->u.i = serial
17690 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
176a0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
176b0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
176c0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
176d0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
176e0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
176f0 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45  6 aFlag[] = { ME
17700 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d  M_Blob|MEM_Ephem
17710 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70  , MEM_Str|MEM_Ep
17720 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65  hem };.      pMe
17730 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62  m->z = (char *)b
17740 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  uf;.      pMem->
17750 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
17760 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d  -12)/2;.      pM
17770 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20  em->xDel = 0;.  
17780 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
17790 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74  = aFlag[serial_t
177a0 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65  ype&1];.      re
177b0 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  turn pMem->n;.  
177c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
177d0 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73   0;.}./*.** This
177e0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
177f0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66   to allocate suf
17800 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f  ficient space fo
17810 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63  r an UnpackedRec
17820 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ord.** structure
17830 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
17840 20 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71   be used with sq
17850 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
17860 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68  npack() if.** th
17870 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
17880 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
17890 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
178a0 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a  re pKeyInfo..**.
178b0 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20  ** The space is 
178c0 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64  either allocated
178d0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
178e0 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66  MallocRaw() or f
178f0 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68  rom within.** th
17900 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66  e unaligned buff
17910 65 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68  er passed via th
17920 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69  e second and thi
17930 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72  rd arguments (pr
17940 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63  esumably.** stac
17950 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65  k space). If the
17960 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70   former, then *p
17970 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
17980 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73  a pointer that s
17990 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e  hould.** be even
179a0 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20  tually freed by 
179b0 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
179c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
179d0 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a  . Or, if the .**
179e0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65   allocation come
179f0 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63  s from the pSpac
17a00 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72  e/szSpace buffer
17a10 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74  , *ppFree is set
17a20 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f   to NULL.** befo
17a30 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
17a40 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
17a50 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
17a60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
17a70 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  .UnpackedRecord 
17a80 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f  *sqlite3VdbeAllo
17a90 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
17aa0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
17ab0 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
17ac0 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
17ad0 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  n of the record 
17ae0 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63  */.  char *pSpac
17af0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
17b00 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65       /* Unaligne
17b10 64 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  d space availabl
17b20 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61  e */.  int szSpa
17b30 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
17b40 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
17b50 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79  f pSpace[] in by
17b60 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  tes */.  char **
17b70 70 70 46 72 65 65 20 20 20 20 20 20 20 20 20 20  ppFree          
17b80 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
17b90 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66   Caller should f
17ba0 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ree this pointer
17bb0 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65   */.){.  Unpacke
17bc0 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20  dRecord *p;     
17bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61           /* Unpa
17be0 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72  cked record to r
17bf0 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  eturn */.  int n
17c00 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
17c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17c20 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62  crement pSpace b
17c30 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20  y nOff to align 
17c40 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  it */.  int nByt
17c50 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
17c60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17c70 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
17c80 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20  red for *p */.. 
17c90 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73   /* We want to s
17ca0 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72  hift the pointer
17cb0 20 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20   pSpace up such 
17cc0 74 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74  that it is 8-byt
17cd0 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20  e aligned..  ** 
17ce0 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  Thus, we need to
17cf0 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c   calculate a val
17d00 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65  ue, nOff, betwee
17d10 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68  n 0 and 7, to sh
17d20 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e  ift .  ** it by.
17d30 20 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61    If pSpace is a
17d40 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c  lready 8-byte al
17d50 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75  igned, nOff shou
17d60 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f  ld be zero..  */
17d70 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28  .  nOff = (8 - (
17d80 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
17d90 54 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20  T(pSpace) & 7)) 
17da0 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52  & 7;.  nByte = R
17db0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70  OUND8(sizeof(Unp
17dc0 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20  ackedRecord)) + 
17dd0 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65  sizeof(Mem)*(pKe
17de0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29  yInfo->nField+1)
17df0 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a  ;.  if( nByte>sz
17e00 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20  Space+nOff ){.  
17e10 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52    p = (UnpackedR
17e20 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44  ecord *)sqlite3D
17e30 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49  bMallocRaw(pKeyI
17e40 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  nfo->db, nByte);
17e50 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28  .    *ppFree = (
17e60 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66  char *)p;.    if
17e70 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ( !p ) return 0;
17e80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
17e90 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
17ea0 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d  d*)&pSpace[nOff]
17eb0 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20  ;.    *ppFree = 
17ec0 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65  0;.  }..  p->aMe
17ed0 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61  m = (Mem*)&((cha
17ee0 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a  r*)p)[ROUND8(siz
17ef0 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
17f00 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28  rd))];.  assert(
17f10 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
17f20 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d  Order!=0 );.  p-
17f30 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
17f40 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c  Info;.  p->nFiel
17f50 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d = pKeyInfo->nF
17f60 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75  ield + 1;.  retu
17f70 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
17f80 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79  iven the nKey-by
17f90 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  te encoding of a
17fa0 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b   record in pKey[
17fb0 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  ], populate the 
17fc0 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  .** UnpackedReco
17fd0 72 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  rd structure ind
17fe0 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f  icated by the fo
17ff0 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69  urth argument wi
18000 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  th the.** conten
18010 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65  ts of the decode
18020 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f  d record..*/ .vo
18030 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
18040 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65  cordUnpack(.  Ke
18050 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
18060 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
18070 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65  ion about the re
18080 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20  cord format */. 
18090 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20   int nKey,      
180a0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
180b0 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65  of the binary re
180c0 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
180d0 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20  void *pKey,     
180e0 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72   /* The binary r
180f0 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63  ecord */.  Unpac
18100 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20  kedRecord *p    
18110 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
18120 69 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66  is structure bef
18130 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a  ore returning. *
18140 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  /.){.  const uns
18150 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
18160 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
18170 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a  ed char *)pKey;.
18180 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20    int d; .  u32 
18190 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
181a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
181b0 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20  ffset in aKey[] 
181c0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
181d0 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20    u16 u;        
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181f0 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
18200 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
18210 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d  u32 szHdr;.  Mem
18220 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d   *pMem = p->aMem
18230 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f  ;..  p->default_
18240 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  rc = 0;.  assert
18250 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
18260 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a  GNMENT(pMem) );.
18270 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
18280 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
18290 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20  ;.  d = szHdr;. 
182a0 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   u = 0;.  while(
182b0 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c   idx<szHdr && d<
182c0 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32  =nKey ){.    u32
182d0 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
182e0 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
182f0 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d  int32(&aKey[idx]
18300 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
18310 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
18320 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
18330 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b     pMem->db = pK
18340 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
18350 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d  /* pMem->flags =
18360 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64   0; // sqlite3Vd
18370 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69  beSerialGet() wi
18380 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20  ll set this for 
18390 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  us */.    pMem->
183a0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
183b0 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62   d += sqlite3Vdb
183c0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
183d0 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [d], serial_type
183e0 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65  , pMem);.    pMe
183f0 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b  m++;.    if( (++
18400 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20  u)>=p->nField ) 
18410 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73  break;.  }.  ass
18420 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f  ert( u<=pKeyInfo
18430 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a  ->nField + 1 );.
18440 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b    p->nField = u;
18450 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .}..#if SQLITE_D
18460 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EBUG./*.** This 
18470 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
18480 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74  s two index or t
18490 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73  able record keys
184a0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79   in the same way
184b0 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74  .** as the sqlit
184c0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
184d0 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55  are() routine. U
184e0 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64  nlike VdbeRecord
184f0 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68  Compare(),.** th
18500 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65  is function dese
18510 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d  rializes and com
18520 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69  pares values usi
18530 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ng the.** sqlite
18540 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
18550 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43   and sqlite3MemC
18560 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f  ompare() functio
18570 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a  ns. It is used.*
18580 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  * in assert() st
18590 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
185a0 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69  re that the opti
185b0 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a  mized code in.**
185c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
185d0 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75  rdCompare() retu
185e0 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68  rns results with
185f0 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69   these two primi
18600 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  tives..**.** Ret
18610 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
18620 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
18630 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65  ison is equivale
18640 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52 65 73  nt to desiredRes
18650 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66  ult..** Return f
18660 61 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73  alse if there is
18670 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e   a disagreement.
18680 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
18690 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
186a0 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65  Debug(.  int nKe
186b0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
186c0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
186d0 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e  ey */.  const Un
186e0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
186f0 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b  Key2, /* Right k
18700 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69  ey */.  int desi
18710 72 65 64 52 65 73 75 6c 74 20 20 20 20 20 20 20  redResult       
18720 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74        /* Correct
18730 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20   answer */.){.  
18740 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20  u32 d1;         
18750 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
18760 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
18770 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
18780 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
18790 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
187a0 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
187b0 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65  ext header eleme
187c0 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  nt */.  u32 szHd
187d0 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  r1;        /* Nu
187e0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
187f0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
18800 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63   i = 0;.  int rc
18810 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e   = 0;.  const un
18820 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
18830 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
18840 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
18850 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  1;.  KeyInfo *pK
18860 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65  eyInfo;.  Mem me
18870 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20  m1;..  pKeyInfo 
18880 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  = pPKey2->pKeyIn
18890 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e  fo;.  if( pKeyIn
188a0 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75  fo->db==0 ) retu
188b0 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63  rn 1;.  mem1.enc
188c0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
188d0 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b  ;.  mem1.db = pK
188e0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a  eyInfo->db;.  /*
188f0 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b   mem1.flags = 0;
18900 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69    // Will be ini
18910 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69  tialized by sqli
18920 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
18930 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59  () */.  VVA_ONLY
18940 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d  ( mem1.zMalloc =
18950 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
18960 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
18970 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a   statements */..
18980 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d    /* Compilers m
18990 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74  ay complain that
189a0 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74   mem1.u.i is pot
189b0 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69  entially uniniti
189c0 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20  alized..  ** We 
189d0 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65  could initialize
189e0 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65   it, as shown he
189f0 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74  re, to silence t
18a00 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e  hose complaints.
18a10 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63  .  ** But in fac
18a20 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c  t, mem1.u.i will
18a30 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20   never actually 
18a40 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61  be used uninitia
18a50 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67  lized, and doing
18a60 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63   .  ** the unnec
18a70 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a  essary initializ
18a80 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73  ation has a meas
18a90 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20  urable negative 
18aa0 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a  performance.  **
18ab0 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74   impact, since t
18ac0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
18ad0 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65   very high runne
18ae0 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63  r.  And so, we c
18af0 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67  hoose.  ** to ig
18b00 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  nore the compile
18b10 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c  r warnings and l
18b20 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62  eave this variab
18b30 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  le uninitialized
18b40 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d  ..  */.  /*  mem
18b50 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e  1.u.i = 0;  // n
18b60 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20  ot needed, here 
18b70 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69  to silence compi
18b80 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20  ler warning */. 
18b90 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61   .  idx1 = getVa
18ba0 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
18bb0 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a  Hdr1);.  d1 = sz
18bc0 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20  Hdr1;.  assert( 
18bd0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
18be0 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  +pKeyInfo->nXFie
18bf0 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  ld>=pPKey2->nFie
18c00 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ld || CORRUPT_DB
18c10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
18c20 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
18c30 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
18c40 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  t( pKeyInfo->nFi
18c50 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  eld>0 );.  asser
18c60 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20  t( idx1<=szHdr1 
18c70 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
18c80 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73  .  do{.    u32 s
18c90 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20  erial_type1;..  
18ca0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
18cb0 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
18cc0 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
18cd0 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
18ce0 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56      idx1 += getV
18cf0 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69  arint32( aKey1+i
18d00 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx1, serial_type
18d10 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  1 );..    /* Ver
18d20 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20 69  ify that there i
18d30 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61  s enough key spa
18d40 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20  ce remaining to 
18d50 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62  avoid.    ** a b
18d60 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20  uffer overread. 
18d70 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f   The "d1+serial_
18d80 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70 72  type1+2" subexpr
18d90 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  ession will.    
18da0 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72 65  ** always be gre
18db0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
18dc0 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74  al to the amount
18dd0 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65 79   of required key
18de0 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55   space..    ** U
18df0 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d  se that approxim
18e00 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74  ation to avoid t
18e10 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76  he more expensiv
18e20 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  e call to.    **
18e30 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
18e40 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74  alTypeLen() in t
18e50 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
18e60 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64      */.    if( d
18e70 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
18e80 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20  >(u32)nKey1.    
18e90 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64   && d1+sqlite3Vd
18ea0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
18eb0 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75  serial_type1)>(u
18ec0 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b  32)nKey1 .    ){
18ed0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18ee0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72    }..    /* Extr
18ef0 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  act the values t
18f00 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20  o be compared.. 
18f10 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20     */.    d1 += 
18f20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
18f30 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
18f40 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26   serial_type1, &
18f50 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  mem1);..    /* D
18f60 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
18f70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
18f80 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
18f90 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79  re(&mem1, &pPKey
18fa0 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79  2->aMem[i], pKey
18fb0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b  Info->aColl[i]);
18fc0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
18fd0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18fe0 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  mem1.zMalloc==0 
18ff0 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65  );  /* See comme
19000 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  nt below */.    
19010 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
19020 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
19030 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72  .        rc = -r
19040 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68  c;  /* Invert th
19050 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53  e result for DES
19060 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f  C sort order. */
19070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
19080 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65  oto debugCompare
19090 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  End;.    }.    i
190a0 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64  ++;.  }while( id
190b0 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70  x1<szHdr1 && i<p
190c0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b  PKey2->nField );
190d0 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
190e0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
190f0 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
19100 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
19110 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
19120 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
19130 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
19140 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
19150 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
19160 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
19170 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
19180 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
19190 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20  e(&mem1)..  */. 
191a0 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
191b0 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
191c0 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
191d0 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
191e0 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
191f0 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
19200 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
19210 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
19220 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52  nt were equal. R
19230 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c  eturn the defaul
19240 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  t_rc.  ** value.
19250 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65    */.  rc = pPKe
19260 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
19270 0a 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64  .debugCompareEnd
19280 3a 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  :.  if( desiredR
19290 65 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d  esult==0 && rc==
192a0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
192b0 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
192c0 74 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 65  t<0 && rc<0 ) re
192d0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65  turn 1;.  if( de
192e0 73 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26  siredResult>0 &&
192f0 20 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31   rc>0 ) return 1
19300 3b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ;.  if( CORRUPT_
19310 44 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  DB ) return 1;. 
19320 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64   if( pKeyInfo->d
19330 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19340 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
19350 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
19360 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d  ../*.** Both *pM
19370 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63  em1 and *pMem2 c
19380 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61  ontain string va
19390 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68  lues. Compare th
193a0 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20  e two values.** 
193b0 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74  using the collat
193c0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ion sequence pCo
193d0 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65  ll. As usual, re
193e0 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
193f0 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
19400 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a  itive value if *
19410 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68  pMem1 is less th
19420 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
19430 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a  greater than .**
19440 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74   *pMem2, respect
19450 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69  ively. Similar i
19460 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20  n spirit to "rc 
19470 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70  = (*pMem1) - (*p
19480 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74  Mem2);"..*/.stat
19490 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61  ic int vdbeCompa
194a0 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63  reMemString(.  c
194b0 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c  onst Mem *pMem1,
194c0 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  .  const Mem *pM
194d0 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  em2,.  const Col
194e0 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75  lSeq *pColl,.  u
194f0 38 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 20  8 *prcErr       
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19510 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75  * If an OOM occu
19520 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54  rs, set to SQLIT
19530 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20  E_NOMEM */.){.  
19540 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  if( pMem1->enc==
19550 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20  pColl->enc ){.  
19560 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73    /* The strings
19570 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
19580 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f  the correct enco
19590 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a  ding.  Call the.
195a0 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73       ** comparis
195b0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65  on function dire
195c0 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75  ctly */.    retu
195d0 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70  rn pColl->xCmp(p
195e0 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d  Coll->pUser,pMem
195f0 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d  1->n,pMem1->z,pM
19600 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29  em2->n,pMem2->z)
19610 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
19620 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74  nt rc;.    const
19630 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a   void *v1, *v2;.
19640 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a      int n1, n2;.
19650 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20      Mem c1;.    
19660 4d 65 6d 20 63 32 3b 0a 20 20 20 20 63 31 2e 64  Mem c2;.    c1.d
19670 62 20 3d 20 63 32 2e 64 62 20 3d 20 70 4d 65 6d  b = c2.db = pMem
19680 31 2d 3e 64 62 3b 0a 20 20 20 20 63 31 2e 66 6c  1->db;.    c1.fl
19690 61 67 73 20 3d 20 63 32 2e 66 6c 61 67 73 20 3d  ags = c2.flags =
196a0 20 30 3b 0a 20 20 20 20 63 31 2e 7a 4d 61 6c 6c   0;.    c1.zMall
196b0 6f 63 20 3d 20 63 32 2e 7a 4d 61 6c 6c 6f 63 20  oc = c2.zMalloc 
196c0 3d 20 30 3b 0a 20 20 20 20 63 31 2e 78 44 65 6c  = 0;.    c1.xDel
196d0 20 3d 20 63 32 2e 78 44 65 6c 20 3d 20 30 3b 0a   = c2.xDel = 0;.
196e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
196f0 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63  emShallowCopy(&c
19700 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70  1, pMem1, MEM_Ep
19710 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  hem);.    sqlite
19720 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
19730 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20  opy(&c2, pMem2, 
19740 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
19750 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  v1 = sqlite3Valu
19760 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76  eText((sqlite3_v
19770 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c  alue*)&c1, pColl
19780 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d  ->enc);.    n1 =
19790 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e   v1==0 ? 0 : c1.
197a0 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69  n;.    v2 = sqli
197b0 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
197c0 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32  lite3_value*)&c2
197d0 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
197e0 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20     n2 = v2==0 ? 
197f0 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63  0 : c2.n;.    rc
19800 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
19810 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c  Coll->pUser, n1,
19820 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20   v1, n2, v2);.  
19830 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
19840 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20  Release(&c1);.  
19850 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
19860 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20  Release(&c2);.  
19870 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20    if( (v1==0 || 
19880 76 32 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72  v2==0) && prcErr
19890 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c   ) *prcErr = SQL
198a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72  ITE_NOMEM;.    r
198b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a  eturn rc;.  }.}.
198c0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
198d0 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72  wo blobs.  Retur
198e0 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  n negative, zero
198f0 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
19900 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73   the first.** is
19910 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
19920 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
19930 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64   than the second
19940 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
19950 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69  ** If one blob i
19960 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
19970 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68  e other, then th
19980 65 20 73 68 6f 72 74 65 72 20 69 73 20 74 68 65  e shorter is the
19990 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   lessor..*/.stat
199a0 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
199b0 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c  NE int sqlite3Bl
199c0 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  obCompare(const 
199d0 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20  Mem *pB1, const 
199e0 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74  Mem *pB2){.  int
199f0 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d   c = memcmp(pB1-
19a00 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d  >z, pB2->z, pB1-
19a10 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d  >n>pB2->n ? pB2-
19a20 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20  >n : pB1->n);.  
19a30 69 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63  if( c ) return c
19a40 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e  ;.  return pB1->
19a50 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 0a  n - pB2->n;.}...
19a60 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
19a70 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e  e values contain
19a80 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65  ed by the two me
19a90 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75  mory cells, retu
19aa0 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76  rning.** negativ
19ab0 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74  e, zero or posit
19ac0 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20  ive if pMem1 is 
19ad0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
19ae0 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a   to, or greater.
19af0 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53  ** than pMem2. S
19b00 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20  orting order is 
19b10 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f  NULL's first, fo
19b20 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72  llowed by number
19b30 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61  s (integers.** a
19b40 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64  nd reals) sorted
19b50 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f   numerically, fo
19b60 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f  llowed by text o
19b70 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f  rdered by the co
19b80 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
19b90 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69  nce pColl and fi
19ba0 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64  nally blob's ord
19bb0 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29  ered by memcmp()
19bc0 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
19bd0 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73   values are cons
19be0 69 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20  idered equal by 
19bf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
19c00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d  /.int sqlite3Mem
19c10 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65  Compare(const Me
19c20 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20  m *pMem1, const 
19c30 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73  Mem *pMem2, cons
19c40 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  t CollSeq *pColl
19c50 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b  ){.  int f1, f2;
19c60 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f  .  int combined_
19c70 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70  flags;..  f1 = p
19c80 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66  Mem1->flags;.  f
19c90 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73  2 = pMem2->flags
19ca0 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  ;.  combined_fla
19cb0 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73  gs = f1|f2;.  as
19cc0 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f  sert( (combined_
19cd0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
19ce0 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a  et)==0 );. .  /*
19cf0 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
19d00 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73   NULL, it is les
19d10 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72  s than the other
19d20 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73  . If both values
19d30 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20  .  ** are NULL, 
19d40 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20  return 0..  */. 
19d50 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
19d60 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
19d70 20 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d      return (f2&M
19d80 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d  EM_Null) - (f1&M
19d90 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20  EM_Null);.  }.. 
19da0 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
19db0 20 69 73 20 61 20 6e 75 6d 62 65 72 20 61 6e 64   is a number and
19dc0 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f   the other is no
19dd0 74 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 69 73  t, the number is
19de0 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62   less..  ** If b
19df0 6f 74 68 20 61 72 65 20 6e 75 6d 62 65 72 73 2c  oth are numbers,
19e00 20 63 6f 6d 70 61 72 65 20 61 73 20 72 65 61 6c   compare as real
19e10 73 20 69 66 20 6f 6e 65 20 69 73 20 61 20 72 65  s if one is a re
19e20 61 6c 2c 20 6f 72 20 61 73 20 69 6e 74 65 67 65  al, or as intege
19e30 72 73 0a 20 20 2a 2a 20 69 66 20 62 6f 74 68 20  rs.  ** if both 
19e40 76 61 6c 75 65 73 20 61 72 65 20 69 6e 74 65 67  values are integ
19e50 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ers..  */.  if( 
19e60 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28  combined_flags&(
19e70 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
19e80 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ) ){.    double 
19e90 72 31 2c 20 72 32 3b 0a 20 20 20 20 69 66 28 20  r1, r2;.    if( 
19ea0 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49  (f1 & f2 & MEM_I
19eb0 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
19ec0 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c  if( pMem1->u.i <
19ed0 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65   pMem2->u.i ) re
19ee0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69  turn -1;.      i
19ef0 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20  f( pMem1->u.i > 
19f00 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
19f10 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 72 65 74  urn 1;.      ret
19f20 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
19f30 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61   if( (f1&MEM_Rea
19f40 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  l)!=0 ){.      r
19f50 31 20 3d 20 70 4d 65 6d 31 2d 3e 72 3b 0a 20 20  1 = pMem1->r;.  
19f60 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 31 26    }else if( (f1&
19f70 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
19f80 20 20 20 20 20 72 31 20 3d 20 28 64 6f 75 62 6c       r1 = (doubl
19f90 65 29 70 4d 65 6d 31 2d 3e 75 2e 69 3b 0a 20 20  e)pMem1->u.i;.  
19fa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
19fb0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
19fc0 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52     if( (f2&MEM_R
19fd0 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
19fe0 20 72 32 20 3d 20 70 4d 65 6d 32 2d 3e 72 3b 0a   r2 = pMem2->r;.
19ff0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
1a000 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  2&MEM_Int)!=0 ){
1a010 0a 20 20 20 20 20 20 72 32 20 3d 20 28 64 6f 75  .      r2 = (dou
1a020 62 6c 65 29 70 4d 65 6d 32 2d 3e 75 2e 69 3b 0a  ble)pMem2->u.i;.
1a030 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a040 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1a050 7d 0a 20 20 20 20 69 66 28 20 72 31 3c 72 32 20  }.    if( r1<r2 
1a060 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1a070 20 69 66 28 20 72 31 3e 72 32 20 29 20 72 65 74   if( r1>r2 ) ret
1a080 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72  urn 1;.    retur
1a090 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
1a0a0 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61  f one value is a
1a0b0 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20   string and the 
1a0c0 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c  other is a blob,
1a0d0 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c   the string is l
1a0e0 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74  ess..  ** If bot
1a0f0 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63  h are strings, c
1a100 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65  ompare using the
1a110 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
1a120 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
1a130 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1a140 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69  MEM_Str ){.    i
1a150 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72  f( (f1 & MEM_Str
1a160 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1a170 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1a180 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f    if( (f2 & MEM_
1a190 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
1a1a0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1a1b0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
1a1c0 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32  Mem1->enc==pMem2
1a1d0 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20 61 73 73  ->enc );.    ass
1a1e0 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
1a1f0 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20  =SQLITE_UTF8 || 
1a200 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65  .            pMe
1a210 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1a220 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31  UTF16LE || pMem1
1a230 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1a240 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a  F16BE );..    /*
1a250 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
1a260 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20  equence must be 
1a270 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73 20  defined at this 
1a280 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20  point, even if. 
1a290 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64     ** the user d
1a2a0 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61  eletes the colla
1a2b0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66  tion sequence af
1a2c0 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72 6f  ter the vdbe pro
1a2d0 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63  gram is.    ** c
1a2e0 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77 61  ompiled (this wa
1a2f0 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65  s not always the
1a300 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20   case)..    */. 
1a310 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c     assert( !pCol
1a320 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l || pColl->xCmp
1a330 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f   );..    if( pCo
1a340 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ll ){.      retu
1a350 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65  rn vdbeCompareMe
1a360 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70  mString(pMem1, p
1a370 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b  Mem2, pColl, 0);
1a380 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66  .    }.    /* If
1a390 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
1a3a0 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74 68  was passed as th
1a3b0 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69  e collate functi
1a3c0 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  on, fall through
1a3d0 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62  .    ** to the b
1a3e0 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73 65  lob case and use
1a3f0 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20   memcmp().  */. 
1a400 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76   }. .  /* Both v
1a410 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c  alues must be bl
1a420 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73  obs.  Compare us
1a430 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  ing memcmp().  *
1a440 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
1a450 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d  e3BlobCompare(pM
1a460 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a  em1, pMem2);.}..
1a470 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
1a480 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
1a490 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1a4a0 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79  n is a serial-ty
1a4b0 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65  pe that.** corre
1a4c0 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74  sponds to an int
1a4d0 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65  eger - all value
1a4e0 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
1a4f0 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20  9 inclusive .** 
1a500 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 65  except 7. The se
1a510 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61  cond points to a
1a520 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1a530 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  ng an integer va
1a540 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65  lue.** serialize
1a550 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73  d according to s
1a560 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73  erial_type. This
1a570 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69   function deseri
1a580 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65  alizes.** and re
1a590 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e  turns the value.
1a5a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76  .*/.static i64 v
1a5b0 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49  dbeRecordDecodeI
1a5c0 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  nt(u32 serial_ty
1a5d0 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  pe, const u8 *aK
1a5e0 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20  ey){.  u32 y;.  
1a5f0 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
1a600 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79  DB || (serial_ty
1a610 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f  pe>=1 && serial_
1a620 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61  type<=9 && seria
1a630 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20  l_type!=7) );.  
1a640 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
1a650 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
1a660 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20  0:.    case 1:. 
1a670 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1a680 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1a690 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f       return ONE_
1a6a0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1a6b0 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20      case 2:.    
1a6c0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1a6d0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1a6e0 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54    return TWO_BYT
1a6f0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1a700 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74   case 3:.      t
1a710 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1a720 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
1a730 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45  eturn THREE_BYTE
1a740 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1a750 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20  case 4: {.      
1a760 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1a770 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1a780 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
1a790 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1a7a0 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e  return (i64)*(in
1a7b0 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20  t*)&y;.    }.   
1a7c0 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20   case 5: {.     
1a7d0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1a7e0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1a7f0 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54   return FOUR_BYT
1a800 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
1a810 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
1a820 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1a830 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  y);.    }.    ca
1a840 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36  se 6: {.      u6
1a850 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  4 x = FOUR_BYTE_
1a860 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1a870 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1a880 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1a890 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
1a8a0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1a8b0 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65  Key+4);.      re
1a8c0 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a  turn (i64)*(i64*
1a8d0 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  )&x;.    }.  }..
1a8e0 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
1a8f0 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f  _type - 8);.}../
1a900 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1a910 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  on compares the 
1a920 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f  two table rows o
1a930 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a  r index records.
1a940 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
1a950 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61  {nKey1, pKey1} a
1a960 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72  nd pPKey2.  It r
1a970 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76  eturns a negativ
1a980 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f  e, zero.** or po
1a990 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69  sitive integer i
1a9a0 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  f key1 is less t
1a9b0 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
1a9c0 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61   .** greater tha
1a9d0 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b  n key2.  The {nK
1a9e0 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20  ey1, pKey1} key 
1a9f0 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a  must be a blob.*
1aa00 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  * created by the
1aa10 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
1aa20 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
1aa30 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a  E.  The pPKey2.*
1aa40 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  * key must be a 
1aa50 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20  parsed key such 
1aa60 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
1aa70 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50  .** sqlite3VdbeP
1aa80 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  arseRecord..**.*
1aa90 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53  * If argument bS
1aaa0 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
1aab0 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1aac0 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
1aad0 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65  as already.** de
1aae0 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68  termined that th
1aaf0 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
1ab00 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65  f the keys are e
1ab10 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31  qual..**.** Key1
1ab20 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74   and Key2 do not
1ab30 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e   have to contain
1ab40 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1ab50 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61   of fields. If a
1ab60 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68  ll .** fields th
1ab70 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74  at appear in bot
1ab80 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  h keys are equal
1ab90 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64  , then pPKey2->d
1aba0 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a  efault_rc is .**
1abb0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1abc0 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   If database cor
1abd0 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f  ruption is disco
1abe0 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79  vered, set pPKey
1abf0 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a  2->errCode to .*
1ac00 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
1ac10 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49   and return 0. I
1ac20 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
1ac30 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a  s encountered, .
1ac40 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  ** pPKey2->errCo
1ac50 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  de is set to SQL
1ac60 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69  ITE_NOMEM and, i
1ac70 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f it is not NULL
1ac80 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d  , the.** malloc-
1ac90 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20  failed flag set 
1aca0 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
1acb0 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79  le (pPKey2->pKey
1acc0 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 73 74  Info->db)..*/.st
1acd0 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
1ace0 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
1acf0 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ip(.  int nKey1,
1ad00 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1ad10 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65  y1,   /* Left ke
1ad20 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1ad30 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20  ecord *pPKey2,  
1ad40 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1ad50 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b  key */.  int bSk
1ad60 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ip              
1ad70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1ad80 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69  rue, skip the fi
1ad90 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  rst field */.){.
1ada0 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20    u32 d1;       
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adc0 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1add0 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1ade0 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
1adf0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1ae00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae10 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65    /* Index of ne
1ae20 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70  xt field to comp
1ae30 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  are */.  u32 szH
1ae40 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
1ae50 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1ae60 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64 65   of record heade
1ae70 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
1ae80 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aea0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72  /* Offset of fir
1aeb0 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 64 65  st type in heade
1aec0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
1aed0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1aee0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1aef0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20   value */.  Mem 
1af00 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e  *pRhs = pPKey2->
1af10 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e  aMem;       /* N
1af20 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b  ext field of pPK
1af30 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  ey2 to compare *
1af40 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
1af50 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
1af60 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73  pKeyInfo;.  cons
1af70 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1af80 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
1af90 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1afa0 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d  pKey1;.  Mem mem
1afb0 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69  1;..  /* If bSki
1afc0 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  p is true, then 
1afd0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
1afe0 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65  lready determine
1aff0 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
1b000 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e  .  ** two elemen
1b010 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61  ts in the keys a
1b020 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68  re equal. Fix th
1b030 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20  e various stack 
1b040 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a  variables so.  *
1b050 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  * that this rout
1b060 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61  ine begins compa
1b070 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f  ring at the seco
1b080 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69  nd field. */.  i
1b090 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( bSkip ){.    
1b0a0 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31  u32 s1;.    idx1
1b0b0 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74   = 1 + getVarint
1b0c0 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31  32(&aKey1[1], s1
1b0d0 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20  );.    szHdr1 = 
1b0e0 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31  aKey1[0];.    d1
1b0f0 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69   = szHdr1 + sqli
1b100 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1b110 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20  eLen(s1);.    i 
1b120 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b  = 1;.    pRhs++;
1b130 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64  .  }else{.    id
1b140 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
1b150 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
1b160 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
1b170 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e  ;.    if( d1>(un
1b180 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20  signed)nKey1 ){ 
1b190 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  .      pPKey2->e
1b1a0 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1b1b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1b1c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1b1d0 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e  ;  /* Corruption
1b1e0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20   */.    }.    i 
1b1f0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f  = 0;.  }..  VVA_
1b200 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c  ONLY( mem1.zMall
1b210 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c  oc = 0; ) /* Onl
1b220 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65  y needed by asse
1b230 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1b240 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  */.  assert( pPK
1b250 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
1b260 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70 4b  Field+pPKey2->pK
1b270 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e  eyInfo->nXField>
1b280 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  =pPKey2->nField 
1b290 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55  .       || CORRU
1b2a0 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
1b2b0 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
1b2c0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
1b2d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1b2e0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1b2f0 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  ->nField>0 );.  
1b300 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a  assert( idx1<=sz
1b310 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Hdr1 || CORRUPT_
1b320 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  DB );.  do{.    
1b330 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
1b340 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1b350 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  an integer */.  
1b360 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67    if( pRhs->flag
1b370 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
1b380 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
1b390 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
1b3a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b3b0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1b3c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1b3d0 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
1b3e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1b3f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1b400 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20   serial_type==0 
1b410 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1b420 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  -1;.      }else 
1b430 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1b440 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  =7 ){.        do
1b450 75 62 6c 65 20 72 68 73 20 3d 20 28 64 6f 75 62  uble rhs = (doub
1b460 6c 65 29 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20  le)pRhs->u.i;.  
1b470 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b480 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1b490 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
1b4a0 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  pe, &mem1);.    
1b4b0 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 72 3c 72      if( mem1.r<r
1b4c0 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1b4d0 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
1b4e0 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e   }else if( mem1.
1b4f0 72 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  r>rhs ){.       
1b500 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1b510 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1b520 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c  e{.        i64 l
1b530 68 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44  hs = vdbeRecordD
1b540 65 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f  ecodeInt(serial_
1b550 74 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d  type, &aKey1[d1]
1b560 29 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 72  );.        i64 r
1b570 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a  hs = pRhs->u.i;.
1b580 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c          if( lhs<
1b590 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1b5a0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1b5b0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e    }else if( lhs>
1b5c0 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1b5d0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1b5e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b5f0 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1b600 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   real */.    els
1b610 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1b620 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  s & MEM_Real ){.
1b630 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1b640 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1b650 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1b660 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
1b670 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1b680 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1b690 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b  erial_type==0 ){
1b6a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
1b6b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b6c0 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68         double rh
1b6d0 73 20 3d 20 70 52 68 73 2d 3e 72 3b 0a 20 20 20  s = pRhs->r;.   
1b6e0 20 20 20 20 20 64 6f 75 62 6c 65 20 6c 68 73 3b       double lhs;
1b6f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1b700 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
1b710 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
1b720 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20  _type, &mem1);. 
1b730 20 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61         if( seria
1b740 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
1b750 20 20 20 20 20 20 20 6c 68 73 20 3d 20 6d 65 6d         lhs = mem
1b760 31 2e 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  1.r;.        }el
1b770 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68  se{.          lh
1b780 73 20 3d 20 28 64 6f 75 62 6c 65 29 6d 65 6d 31  s = (double)mem1
1b790 2e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a  .u.i;.        }.
1b7a0 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c          if( lhs<
1b7b0 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1b7c0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1b7d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e    }else if( lhs>
1b7e0 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1b7f0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1b800 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b810 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1b820 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20   a string */.   
1b830 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e   else if( pRhs->
1b840 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
1b850 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69  ){.      getVari
1b860 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31  nt32(&aKey1[idx1
1b870 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
1b880 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b890 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
1b8a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
1b8b0 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a  rial_type<12 ){.
1b8c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1b8d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1b8e0 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26   !(serial_type &
1b8f0 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20   0x01) ){.      
1b900 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1b910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b920 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c  mem1.n = (serial
1b930 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b  _type - 12) / 2;
1b940 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1b950 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d  e( (d1+mem1.n)==
1b960 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1b970 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1b980 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b  ase( (d1+mem1.n+
1b990 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  1)==(unsigned)nK
1b9a0 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ey1 );.        i
1b9b0 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e  f( (d1+mem1.n) >
1b9c0 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31   (unsigned)nKey1
1b9d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1b9e0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
1b9f0 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
1ba00 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1ba10 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1ba20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1ba30 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1ba40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1ba50 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
1ba60 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  ] ){.          m
1ba70 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
1ba80 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20  fo->enc;.       
1ba90 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65     mem1.db = pKe
1baa0 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20  yInfo->db;.     
1bab0 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20       mem1.flags 
1bac0 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20  = MEM_Str;.     
1bad0 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63       mem1.z = (c
1bae0 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b  har*)&aKey1[d1];
1baf0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1bb00 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74  vdbeCompareMemSt
1bb10 72 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20 20  ring(.          
1bb20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c      &mem1, pRhs,
1bb30 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1bb40 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72  [i], &pPKey2->er
1bb50 72 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20  rCode.          
1bb60 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1bb70 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1bb80 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e  nCmp = MIN(mem1.
1bb90 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20  n, pRhs->n);.   
1bba0 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63         rc = memc
1bbb0 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70  mp(&aKey1[d1], p
1bbc0 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20  Rhs->z, nCmp);. 
1bbd0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1bbe0 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e  =0 ) rc = mem1.n
1bbf0 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20   - pRhs->n; .   
1bc00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1bc10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1bc20 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20   is a blob */.  
1bc30 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
1bc40 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
1bc50 62 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61  b ){.      getVa
1bc60 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64  rint32(&aKey1[id
1bc70 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  x1], serial_type
1bc80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1bc90 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
1bca0 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
1bcb0 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c  serial_type<12 |
1bcc0 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26  | (serial_type &
1bcd0 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20   0x01) ){.      
1bce0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1bcf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bd00 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69  int nStr = (seri
1bd10 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20  al_type - 12) / 
1bd20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  2;.        testc
1bd30 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d  ase( (d1+nStr)==
1bd40 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1bd50 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
1bd60 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29  ase( (d1+nStr+1)
1bd70 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1bd80 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
1bd90 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e   (d1+nStr) > (un
1bda0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a  signed)nKey1 ){.
1bdb0 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
1bdc0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1bdd0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1bde0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  KPT;.          r
1bdf0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1be00 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75          /* Corru
1be10 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
1be20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1be30 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
1be40 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b  (nStr, pRhs->n);
1be50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1be60 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31  memcmp(&aKey1[d1
1be70 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70  ], pRhs->z, nCmp
1be80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1be90 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53   rc==0 ) rc = nS
1bea0 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20  tr - pRhs->n;.  
1beb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1bec0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1bed0 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20  S is null */.   
1bee0 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72   else{.      ser
1bef0 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1bf00 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63  [idx1];.      rc
1bf10 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21   = (serial_type!
1bf20 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  =0);.    }..    
1bf30 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1bf40 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
1bf50 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
1bf60 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1bf70 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1bf80 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
1bf90 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1bfa0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1bfb0 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20  PKey2, rc) );.  
1bfc0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
1bfd0 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20  .zMalloc==0 );  
1bfe0 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62  /* See comment b
1bff0 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65  elow */.      re
1c000 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1c010 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68      i++;.    pRh
1c020 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73  s++;.    d1 += s
1c030 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1c040 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
1c050 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b  ype);.    idx1 +
1c060 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c  = sqlite3VarintL
1c070 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
1c080 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
1c090 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31  (unsigned)szHdr1
1c0a0 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
1c0b0 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73  ield && d1<=(uns
1c0c0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a  igned)nKey1 );..
1c0d0 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
1c0e0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
1c0f0 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
1c100 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
1c110 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
1c120 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
1c130 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
1c140 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
1c150 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
1c160 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
1c170 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
1c180 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1c190 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73  &mem1).  */.  as
1c1a0 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c  sert( mem1.zMall
1c1b0 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72  oc==0 );..  /* r
1c1c0 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20  c==0 here means 
1c1d0 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68  that one or both
1c1e0 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
1c1f0 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
1c200 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20  nd.  ** all the 
1c210 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
1c220 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75  t point were equ
1c230 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  al. Return the d
1c240 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76  efault_rc.  ** v
1c250 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  alue.  */.  asse
1c260 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a  rt( CORRUPT_DB .
1c270 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65         || vdbeRe
1c280 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1c290 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1c2a0 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64  PKey2, pPKey2->d
1c2b0 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20  efault_rc) .    
1c2c0 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e     || pKeyInfo->
1c2d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c2e0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  .  );.  return p
1c2f0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1c300 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
1c310 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1c320 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  e(.  int nKey1, 
1c330 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1c340 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79  1,   /* Left key
1c350 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1c360 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
1c370 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
1c380 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  ey */.){.  retur
1c390 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
1c3a0 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
1c3b0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1c3c0 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
1c3d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1c3e0 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65   an optimized ve
1c3f0 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
1c400 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1c410 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29  e() .** that (a)
1c420 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1c430 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e   of pPKey2 is an
1c440 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62   integer, and (b
1c450 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f  ) the .** size-o
1c460 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
1c470 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1c480 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69  (pKey1/nKey1) fi
1c490 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a  ts in a single.*
1c4a0 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  * byte (i.e. is 
1c4b0 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a  less than 128)..
1c4c0 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63  **.** To avoid c
1c4d0 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75  oncerns about bu
1c4e0 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20  ffer overreads, 
1c4f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1c500 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20  only used.** on 
1c510 73 63 68 65 6d 61 73 20 77 68 65 72 65 20 74 68  schemas where th
1c520 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20  e maximum valid 
1c530 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 36  header size is 6
1c540 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e  3 bytes or less.
1c550 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1c560 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c570 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  Int(.  int nKey1
1c580 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1c590 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
1c5a0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1c5b0 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
1c5c0 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
1c5d0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
1c5e0 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e  8 *aKey = &((con
1c5f0 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28  st u8*)pKey1)[*(
1c600 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20  const u8*)pKey1 
1c610 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73  & 0x3F];.  int s
1c620 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63  erial_type = ((c
1c630 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b  onst u8*)pKey1)[
1c640 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  1];.  int res;. 
1c650 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b   u32 y;.  u64 x;
1c660 0a 20 20 69 36 34 20 76 20 3d 20 70 50 4b 65 79  .  i64 v = pPKey
1c670 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a  2->aMem[0].u.i;.
1c680 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 61 73    i64 lhs;..  as
1c690 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65  sert( (*(u8*)pKe
1c6a0 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52  y1)<=0x3F || COR
1c6b0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69  RUPT_DB );.  swi
1c6c0 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
1c6d0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20   ){.    case 1: 
1c6e0 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
1c6f0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1c700 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59      lhs = ONE_BY
1c710 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1c720 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1c730 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1c740 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1c750 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
1c760 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1c770 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1c780 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1c790 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1c7a0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1c7b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c7c0 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
1c7d0 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
1c7e0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1c7f0 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45  lhs = THREE_BYTE
1c800 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1c810 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1c820 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1c830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c840 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
1c850 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1c860 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52  /.      y = FOUR
1c870 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1c880 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69  ;.      lhs = (i
1c890 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20  64)*(int*)&y;.  
1c8a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1c8b0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1c8c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1c8d0 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
1c8e0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1c8f0 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1c900 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1c910 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29  Key+2) + (((i64)
1c920 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
1c930 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1c940 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1c950 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1c960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c970 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20   6: { /* 8-byte 
1c980 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1c990 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52  /.      x = FOUR
1c9a0 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1c9b0 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
1c9c0 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f  32) | FOUR_BYTE_
1c9d0 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20  UINT(aKey+4);.  
1c9e0 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a      lhs = *(i64*
1c9f0 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63  )&x;.      testc
1ca00 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1ca10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ca20 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20  .    case 8: .  
1ca30 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20      lhs = 0;.   
1ca40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1ca50 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20  se 9:.      lhs 
1ca60 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
1ca70 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ;..    /* This c
1ca80 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d  ase could be rem
1ca90 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68 61  oved without cha
1caa0 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nging the result
1cab0 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20  s of running.   
1cac0 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49   ** this code. I
1cad0 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73  ncluding it caus
1cae0 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61  es gcc to genera
1caf0 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69 74  te a faster swit
1cb00 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ch .    ** state
1cb10 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20  ment (since the 
1cb20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20  range of switch 
1cb30 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72  targets now star
1cb40 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20  ts at zero and. 
1cb50 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75     ** is contigu
1cb60 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f  ous) but does no
1cb70 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c  t cause any dupl
1cb80 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65  icate code to be
1cb90 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a   generated.    *
1cba0 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c 65  * (as gcc is cle
1cbb0 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  ver enough to co
1cbc0 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69  mbine the two li
1cbd0 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72  ke cases). Other
1cbe0 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65   .    ** compile
1cbf0 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69  rs might be simi
1cc00 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61  lar.  */ .    ca
1cc10 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20  se 0: case 7:.  
1cc20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1cc30 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1cc40 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  are(nKey1, pKey1
1cc50 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20  , pPKey2);..    
1cc60 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
1cc70 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1cc80 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
1cc90 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1cca0 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ey2);.  }..  if(
1ccb0 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65   v>lhs ){.    re
1ccc0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
1ccd0 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68    }else if( v<lh
1cce0 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  s ){.    res = p
1ccf0 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c  PKey2->r2;.  }el
1cd00 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e  se if( pPKey2->n
1cd10 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f  Field>1 ){.    /
1cd20 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
1cd30 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
1cd40 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f  ys are equal. Co
1cd50 6d 70 61 72 65 20 74 68 65 20 74 72 61 69 6c 69  mpare the traili
1cd60 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  ng .    ** field
1cd70 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  s.  */.    res =
1cd80 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1cd90 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
1cda0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1cdb0 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
1cdc0 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
1cdd0 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
1cde0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20   keys are equal 
1cdf0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
1ce00 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a   trailing.    **
1ce10 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20   fields. Return 
1ce20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1ce30 72 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  rc in this case.
1ce40 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50   */.    res = pP
1ce50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1ce60 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1ce70 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1ce80 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1ce90 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65  Key1, pPKey2, re
1cea0 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  s) );.  return r
1ceb0 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  es;.}../*.** Thi
1cec0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e  s function is an
1ced0 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69   optimized versi
1cee0 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
1cef0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1cf00 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68   .** that (a) th
1cf10 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66  e first field of
1cf20 20 70 50 4b 65 79 32 20 69 73 20 61 20 73 74 72   pPKey2 is a str
1cf30 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74 68  ing, that (b) th
1cf40 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a  e first field.**
1cf50 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74   uses the collat
1cf60 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e  ion sequence BIN
1cf70 41 52 59 20 61 6e 64 20 28 63 29 20 74 68 61 74  ARY and (c) that
1cf80 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61   the size-of-hea
1cf90 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61  der varint .** a
1cfa0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28  t the start of (
1cfb0 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74  pKey1/nKey1) fit
1cfc0 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  s in a single by
1cfd0 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
1cfe0 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
1cff0 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74  areString(.  int
1d000 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1d010 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
1d020 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1d030 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1d040 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
1d050 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63  ht key */.){.  c
1d060 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d  onst u8 *aKey1 =
1d070 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79   (const u8*)pKey
1d080 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f  1;.  int serial_
1d090 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b  type;.  int res;
1d0a0 0a 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32 28  ..  getVarint32(
1d0b0 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61  &aKey1[1], seria
1d0c0 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73  l_type);.  if( s
1d0d0 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b  erial_type<12 ){
1d0e0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
1d0f0 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28  2->r1;      /* (
1d100 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20  pKey1/nKey1) is 
1d110 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75  a number or a nu
1d120 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  ll */.  }else if
1d130 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20  ( !(serial_type 
1d140 26 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20  & 0x01) ){ .    
1d150 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
1d160 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31  ;      /* (pKey1
1d170 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f  /nKey1) is a blo
1d180 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b */.  }else{.  
1d190 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20    int nCmp;.    
1d1a0 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e  int nStr;.    in
1d1b0 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b  t szHdr = aKey1[
1d1c0 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20  0];..    nStr = 
1d1d0 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
1d1e0 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73   / 2;.    if( (s
1d1f0 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e  zHdr + nStr) > n
1d200 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50  Key1 ){.      pP
1d210 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
1d220 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
1d230 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72  PT_BKPT;.      r
1d240 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43  eturn 0;    /* C
1d250 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1d260 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49   }.    nCmp = MI
1d270 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  N( pPKey2->aMem[
1d280 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20  0].n, nStr );.  
1d290 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26    res = memcmp(&
1d2a0 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50  aKey1[szHdr], pP
1d2b0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c  Key2->aMem[0].z,
1d2c0 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28   nCmp);..    if(
1d2d0 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
1d2e0 20 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50   res = nStr - pP
1d2f0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b  Key2->aMem[0].n;
1d300 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d  .      if( res==
1d310 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1d320 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e   pPKey2->nField>
1d330 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  1 ){.          r
1d340 65 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 43  es = vdbeRecordC
1d350 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
1d360 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1d370 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ey2, 1);.       
1d380 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d390 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1d3a0 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20  default_rc;.    
1d3b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1d3c0 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20  e if( res>0 ){. 
1d3d0 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
1d3e0 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d  ey2->r2;.      }
1d3f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
1d400 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
1d410 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1d420 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20  e if( res>0 ){. 
1d430 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
1d440 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65  2->r2;.    }else
1d450 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
1d460 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a  Key2->r1;.    }.
1d470 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76    }..  assert( v
1d480 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1d490 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1d4a0 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29  y1, pPKey2, res)
1d4b0 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55  .       || CORRU
1d4c0 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20  PT_DB.       || 
1d4d0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1d4e0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1d4f0 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  ed.  );.  return
1d500 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   res;.}../*.** R
1d510 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1d520 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62  to an sqlite3Vdb
1d530 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1d540 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63   compatible func
1d550 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65  tion.** suitable
1d560 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73   for comparing s
1d570 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64  erialized record
1d580 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65  s to the unpacke
1d590 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a  d record passed.
1d5a0 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ** as the only a
1d5b0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f  rgument..*/.Reco
1d5c0 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65  rdCompare sqlite
1d5d0 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65  3VdbeFindCompare
1d5e0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
1d5f0 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74  *p){.  /* varint
1d600 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1d610 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63  () and varintRec
1d620 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
1d630 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20  () both assume. 
1d640 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a   ** that the siz
1d650 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
1d660 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  nt that occurs a
1d670 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
1d680 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20  ach record.  ** 
1d690 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
1d6a0 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31   byte (i.e. is 1
1d6b0 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72  27 or less). var
1d6c0 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
1d6d0 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20  Int().  ** also 
1d6e0 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20  assumes that it 
1d6f0 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72  is safe to overr
1d700 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79 20  ead a buffer by 
1d710 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20  at least the .  
1d720 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69  ** maximum possi
1d730 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72  ble legal header
1d740 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74   size plus 8 byt
1d750 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 72  es. Because ther
1d760 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e  e is.  ** guaran
1d770 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65  teed to be at le
1d780 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20  ast 74 (but not 
1d790 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70 61  136) bytes of pa
1d7a0 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20  dding following 
1d7b0 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72  each.  ** buffer
1d7c0 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e   passed to varin
1d7d0 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
1d7e0 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69  t() this makes i
1d7f0 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a  t convenient to.
1d800 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73    ** limit the s
1d810 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
1d820 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e  r to 64 bytes in
1d830 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
1d840 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a   first field.  *
1d850 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  * is an integer.
1d860 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65  .  **.  ** The e
1d870 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e  asiest way to en
1d880 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74  force this limit
1d890 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20   is to consider 
1d8a0 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74  only records wit
1d8b0 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73  h.  ** 13 fields
1d8c0 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65   or less. If the
1d8d0 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73 20   first field is 
1d8e0 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20  an integer, the 
1d8f0 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20  maximum legal.  
1d900 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20 69  ** header size i
1d910 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29  s (12*5 + 1 + 1)
1d920 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66   bytes.  */.  if
1d930 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  ( (p->pKeyInfo->
1d940 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79  nField + p->pKey
1d950 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d  Info->nXField)<=
1d960 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c  13 ){.    int fl
1d970 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d  ags = p->aMem[0]
1d980 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20  .flags;.    if( 
1d990 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  p->pKeyInfo->aSo
1d9a0 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20  rtOrder[0] ){.  
1d9b0 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20      p->r1 = 1;. 
1d9c0 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b       p->r2 = -1;
1d9d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d9e0 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20    p->r1 = -1;.  
1d9f0 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20      p->r2 = 1;. 
1da00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
1da10 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29  ags & MEM_Int) )
1da20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  {.      return v
1da30 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1da40 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  Int;.    }.    t
1da50 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
1da60 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20   MEM_Real );.   
1da70 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
1da80 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20   & MEM_Null );. 
1da90 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
1daa0 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
1dab0 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
1dac0 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  & (MEM_Real|MEM_
1dad0 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d  Null|MEM_Blob))=
1dae0 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66  =0 && p->pKeyInf
1daf0 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29  o->aColl[0]==0 )
1db00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1db10 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
1db20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1db30 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1db40 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20  eString;.    }. 
1db50 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   }..  return sql
1db60 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1db70 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mpare;.}../*.** 
1db80 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
1db90 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
1dba0 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
1dbb0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
1dbc0 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
1dbd0 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
1dbe0 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
1dbf0 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
1dc00 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
1dc10 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1dc20 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
1dc30 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
1dc40 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
1dc50 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d  se..**.** pCur m
1dc60 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  ight be pointing
1dc70 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65   to text obtaine
1dc80 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74  d from a corrupt
1dc90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1dca0 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ** So the conten
1dcb0 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  t cannot be trus
1dcc0 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72  ted.  Do appropr
1dcd0 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74  iate checks on t
1dce0 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  he content..*/.i
1dcf0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
1dd00 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  xRowid(BtCursor 
1dd10 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
1dd20 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
1dd30 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
1dd40 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
1dd50 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1dd60 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
1dd70 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
1dd80 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
1dd90 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
1dda0 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
1ddb0 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
1ddc0 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
1ddd0 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20  Mem m, v;..  /* 
1dde0 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  Get the size of 
1ddf0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e  the index entry.
1de00 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65    Only indices e
1de10 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20  ntries of less. 
1de20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72   ** than 2GiB ar
1de30 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74  e support - anyt
1de40 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20  hing large must 
1de50 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  be database corr
1de60 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79  uption..  ** Any
1de70 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
1de80 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74  etected in sqlit
1de90 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
1dea0 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73  Ptr(), though, s
1deb0 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65  o.  ** this code
1dec0 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75   can safely assu
1ded0 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79  me that nCellKey
1dee0 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20   is 32-bits  .  
1def0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
1df00 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
1df10 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
1df20 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29    VVA_ONLY(rc =)
1df30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1df40 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
1df50 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
1df60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1df70 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  ;     /* pCur is
1df80 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
1df90 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
1dfa0 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  fail */.  assert
1dfb0 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51  ( (nCellKey & SQ
1dfc0 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28  LITE_MAX_U32)==(
1dfd0 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a  u64)nCellKey );.
1dfe0 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
1dff0 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
1e000 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nt of the index 
1e010 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65  entry */.  memse
1e020 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&m, 0, sizeof(
1e030 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  m));.  rc = sqli
1e040 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
1e050 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33  ree(pCur, 0, (u3
1e060 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  2)nCellKey, 1, &
1e070 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
1e080 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e090 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64   }..  /* The ind
1e0a0 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65  ex entry must be
1e0b0 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65  gin with a heade
1e0c0 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69  r size */.  (voi
1e0d0 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
1e0e0 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
1e0f0 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
1e100 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  r==3 );.  testca
1e110 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29  se( szHdr==m.n )
1e120 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
1e130 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74  (szHdr<3 || (int
1e140 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20  )szHdr>m.n) ){. 
1e150 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
1e160 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
1e170 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74  }..  /* The last
1e180 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e   field of the in
1e190 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  dex should be an
1e1a0 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52   integer - the R
1e1b0 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66  OWID..  ** Verif
1e1c0 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  y that the last 
1e1d0 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20  entry really is 
1e1e0 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  an integer. */. 
1e1f0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
1e200 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
1e210 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
1e220 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1e230 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20  ypeRowid==1 );. 
1e240 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1e250 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73  owid==2 );.  tes
1e260 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1e270 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
1e280 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20  e( typeRowid==4 
1e290 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1e2a0 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20  ypeRowid==5 );. 
1e2b0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1e2c0 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73  owid==6 );.  tes
1e2d0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1e2e0 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==8 );.  testcas
1e2f0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20  e( typeRowid==9 
1e300 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
1e310 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c  y(typeRowid<1 ||
1e320 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20   typeRowid>9 || 
1e330 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b  typeRowid==7) ){
1e340 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
1e350 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
1e360 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
1e370 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1e380 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f  alTypeLen(typeRo
1e390 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
1e3a0 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64  ( (u32)m.n==szHd
1e3b0 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
1e3c0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33  if( unlikely((u3
1e3d0 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  2)m.n<szHdr+lenR
1e3e0 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
1e3f0 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
1e400 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
1e410 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
1e420 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
1e430 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
1e440 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
1e450 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
1e460 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
1e470 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
1e480 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
1e490 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
1e4a0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1e4b0 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
1e4c0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
1e4d0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
1e4e0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1e4f0 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
1e500 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
1e510 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
1e520 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
1e530 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1e540 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
1e550 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
1e560 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
1e570 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b   m.zMalloc!=0 );
1e580 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
1e590 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
1e5a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e5b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f  RRUPT_BKPT;.}../
1e5c0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
1e5d0 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65   key of the inde
1e5e0 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  x entry that cur
1e5f0 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69  sor pC is pointi
1e600 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a  ng to against.**
1e610 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20   the key string 
1e620 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57  in pUnpacked.  W
1e630 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20  rite into *pRes 
1e640 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74  a number.** that
1e650 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65   is negative, ze
1e660 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1e670 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68  if pC is less th
1e680 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a  an, equal to,.**
1e690 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1e6a0 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74   pUnpacked.  Ret
1e6b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
1e6c0 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
1e6d0 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74  pUnpacked is eit
1e6e0 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68  her created with
1e6f0 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69  out a rowid or i
1e700 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74  s truncated so t
1e710 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20  hat it.** omits 
1e720 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  the rowid at the
1e730 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64   end.  The rowid
1e740 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1e750 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a  he index entry.*
1e760 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20  * is ignored as 
1e770 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68  well.  Hence, th
1e780 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
1e790 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65  compares the pre
1e7a0 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65  fixes .** of the
1e7b0 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74   keys prior to t
1e7c0 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20  he final rowid, 
1e7d0 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b  not the entire k
1e7e0 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
1e7f0 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70  e3VdbeIdxKeyComp
1e800 61 72 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f  are(.  VdbeCurso
1e810 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
1e820 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
1e830 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
1e840 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e   against */.  Un
1e850 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
1e860 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f  npacked,       /
1e870 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69  * Unpacked versi
1e880 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69  on of key */.  i
1e890 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8b0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
1e8c0 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
1e8d0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
1e8e0 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
1e8f0 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
1e900 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70  or *pCur = pC->p
1e910 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b  Cursor;.  Mem m;
1e920 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1e930 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
1e940 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
1e950 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
1e960 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
1e970 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
1e980 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
1e990 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
1e9a0 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
1e9b0 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
1e9c0 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
1e9d0 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c  il */.  /* nCell
1e9e0 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  Key will always 
1e9f0 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
1ea00 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61   0xffffffff beca
1ea10 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20  use of the way. 
1ea20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61   ** that btreePa
1ea30 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
1ea40 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
1ea50 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d  t32() are implem
1ea60 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e  ented */.  if( n
1ea70 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43  CellKey<=0 || nC
1ea80 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ellKey>0x7ffffff
1ea90 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  f ){.    *res = 
1eaa0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
1eab0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1eac0 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  T;.  }.  memset(
1ead0 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29  &m, 0, sizeof(m)
1eae0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1eaf0 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
1eb00 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30  e(pC->pCursor, 0
1eb10 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
1eb20 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
1eb30 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1eb40 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d  rc;.  }.  *res =
1eb50 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1eb60 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
1eb70 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
1eb80 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1eb90 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
1eba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ebb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1ebc0 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
1ebd0 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
1ebe0 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
1ebf0 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
1ec00 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
1ec10 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1ec20 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
1ec30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
1ec40 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
1ec50 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
1ec60 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
1ec70 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1ec80 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
1ec90 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
1eca0 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
1ecb0 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
1ecc0 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
1ecd0 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
1ece0 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
1ecf0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
1ed00 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
1ed10 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
1ed20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
1ed30 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
1ed40 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
1ed50 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
1ed60 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
1ed70 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
1ed80 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
1ed90 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1eda0 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
1edb0 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
1edc0 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
1edd0 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
1ede0 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
1edf0 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
1ee00 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
1ee10 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
1ee20 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
1ee30 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
1ee40 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
1ee50 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
1ee60 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
1ee70 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
1ee80 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
1ee90 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
1eea0 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
1eeb0 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
1eec0 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
1eed0 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
1eee0 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
1eef0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
1ef00 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
1ef10 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
1ef20 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
1ef30 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
1ef40 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
1ef50 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
1ef60 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
1ef70 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
1ef80 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
1ef90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1efa0 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
1efb0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
1efc0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
1efd0 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
1efe0 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
1eff0 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
1f000 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1f010 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
1f020 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
1f030 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
1f040 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
1f050 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
1f060 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
1f070 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
1f080 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
1f090 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
1f0a0 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
1f0b0 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
1f0c0 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
1f0d0 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
1f0e0 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
1f0f0 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
1f100 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
1f110 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
1f120 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
1f130 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
1f140 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
1f150 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
1f160 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
1f170 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
1f180 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  ndValue(Vdbe *v,
1f190 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
1f1a0 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
1f1b0 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
1f1c0 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
1f1d0 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
1f1e0 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
1f1f0 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
1f200 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
1f210 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1f220 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
1f230 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
1f240 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
1f250 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1f260 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
1f270 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
1f280 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f290 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
1f2a0 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
1f2b0 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
1f2c0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1f2d0 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
1f2e0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1f2f0 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
1f300 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
1f310 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
1f320 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
1f330 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
1f340 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
1f350 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
1f360 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
1f370 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
1f380 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
1f390 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
1f3a0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1f3b0 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
1f3c0 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
1f3d0 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
1f3e0 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
1f3f0 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
1f400 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
1f410 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
1f420 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
1f430 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
1f440 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
1f450 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1f460 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
1f470 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
1f480 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
1f490 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
1f4a0 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
1f4b0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
1f4c0 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
1f4d0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
1f4e0 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
1f4f0 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
1f500 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
1f510 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
1f520 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
1f530 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
1f540 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
1f550 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
1f560 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
1f570 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1f580 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >db;.  sqlite3Db
1f590 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
1f5a0 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
1f5b0 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
1f5c0 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e  rDup(db, pVtab->
1f5d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
1f5e0 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
1f5f0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
1f600 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
1f610 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1f620 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1f630 41 42 4c 45 20 2a 2f 0a                          ABLE */.