/ Hex Artifact Content
Login

Artifact b9a36e530e6525ca9d9a685bc7b1d01fa77b5cf8:


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 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 61  se = pParse;.  a
03e0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
03f0: 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  Label==0 );.  as
0400: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4c  sert( pParse->nL
0410: 61 62 65 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  abel==0 );.  ass
0420: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4f 70  ert( pParse->nOp
0430: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73  Alloc==0 );.  as
0440: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a  sert( pParse->sz
0450: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  OpAlloc==0 );.  
0460: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0470: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 72  ** Change the er
0480: 72 6f 72 20 73 74 72 69 6e 67 20 73 74 6f 72 65  ror string store
0490: 64 20 69 6e 20 56 64 62 65 2e 7a 45 72 72 4d 73  d in Vdbe.zErrMs
04a0: 67 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  g.*/.void sqlite
04b0: 33 56 64 62 65 45 72 72 6f 72 28 56 64 62 65 20  3VdbeError(Vdbe 
04c0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
04d0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
04e0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 73   va_list ap;.  s
04f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
0500: 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
0510: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
0520: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a  zFormat);.  p->z
0530: 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
0540: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
0550: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
0560: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f  va_end(ap);.}../
0570: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
0580: 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72  e SQL string for
0590: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
05a0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
05b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c  qlite3VdbeSetSql
05c0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
05d0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
05e0: 69 6e 74 20 69 73 50 72 65 70 61 72 65 56 32 29  int isPrepareV2)
05f0: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 50 72  {.  assert( isPr
0600: 65 70 61 72 65 56 32 3d 3d 31 20 7c 7c 20 69 73  epareV2==1 || is
0610: 50 72 65 70 61 72 65 56 32 3d 3d 30 20 29 3b 0a  PrepareV2==0 );.
0620: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
0630: 75 72 6e 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  urn;.#if defined
0640: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
0650: 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
0660: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
0670: 4c 4c 4f 47 29 0a 20 20 69 66 28 20 21 69 73 50  LLOG).  if( !isP
0680: 72 65 70 61 72 65 56 32 20 29 20 72 65 74 75 72  repareV2 ) retur
0690: 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  n;.#endif.  asse
06a0: 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29  rt( p->zSql==0 )
06b0: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71  ;.  p->zSql = sq
06c0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
06d0: 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70  ->db, z, n);.  p
06e0: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d 20  ->isPrepareV2 = 
06f0: 28 75 38 29 69 73 50 72 65 70 61 72 65 56 32 3b  (u8)isPrepareV2;
0700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 61  .}../*.** Swap a
0710: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74 77 65  ll content betwe
0720: 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74 72 75  en two VDBE stru
0730: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
0740: 73 71 6c 69 74 65 33 56 64 62 65 53 77 61 70 28  sqlite3VdbeSwap(
0750: 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65 20 2a  Vdbe *pA, Vdbe *
0760: 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d 70 2c  pB){.  Vdbe tmp,
0770: 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72 20 2a   *pTmp;.  char *
0780: 7a 54 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20  zTmp;.  assert( 
0790: 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e 64 62 20 29  pA->db==pB->db )
07a0: 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20  ;.  tmp = *pA;. 
07b0: 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70   *pA = *pB;.  *p
07c0: 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20  B = tmp;.  pTmp 
07d0: 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pA->pNext;.  p
07e0: 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70  A->pNext = pB->p
07f0: 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78  Next;.  pB->pNex
0800: 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70  t = pTmp;.  pTmp
0810: 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20   = pA->pPrev;.  
0820: 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e  pA->pPrev = pB->
0830: 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72  pPrev;.  pB->pPr
0840: 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d  ev = pTmp;.  zTm
0850: 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20  p = pA->zSql;.  
0860: 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a  pA->zSql = pB->z
0870: 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20  Sql;.  pB->zSql 
0880: 3d 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73  = zTmp;.  pB->is
0890: 50 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e  PrepareV2 = pA->
08a0: 69 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a  isPrepareV2;.}..
08b0: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65  /*.** Resize the
08c0: 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20   Vdbe.aOp array 
08d0: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74  so that it is at
08e0: 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65   least nOp eleme
08f0: 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74  nts larger .** t
0900: 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20  han its current 
0910: 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61  size. nOp is gua
0920: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65  ranteed to be le
0930: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
0940: 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65  .** to 1024/size
0950: 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  of(Op)..**.** If
0960: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
0970: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
0980: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
0990: 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a  e array, return.
09a0: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
09b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64   In this case Vd
09c0: 62 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65  be.aOp and Parse
09d0: 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e  .nOpAlloc remain
09e0: 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28   .** unchanged (
09f0: 74 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20  this is so that 
0a00: 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65  any opcodes alre
0a10: 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61  ady allocated ca
0a20: 6e 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74  n be .** correct
0a30: 6c 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61  ly deallocated a
0a40: 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65  long with the re
0a50: 73 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e  st of the Vdbe).
0a60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
0a70: 72 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20  rowOpArray(Vdbe 
0a80: 2a 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  *v, int nOp){.  
0a90: 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20  VdbeOp *pNew;.  
0aa0: 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50  Parse *p = v->pP
0ab0: 61 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  arse;..  /* The 
0ac0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0ad0: 4c 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69  LOC_STRESS compi
0ae0: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
0af0: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f  s designed to fo
0b00: 72 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72  rce.  ** more fr
0b10: 65 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20  equent reallocs 
0b20: 61 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64  and hence provid
0b30: 65 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  e more opportuni
0b40: 74 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73  ties for .  ** s
0b50: 69 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75  imulated OOM fau
0b60: 6c 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53  lts.  SQLITE_TES
0b70: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
0b80: 20 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73   is generally us
0b90: 65 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74  ed.  ** during t
0ba0: 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69  esting only.  Wi
0bb0: 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  th SQLITE_TEST_R
0bc0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72  EALLOC_STRESS gr
0bd0: 6f 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a  ow the op array.
0be0: 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69    ** by the mini
0bf0: 6d 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75  mum* amount requ
0c00: 69 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73  ired until the s
0c10: 69 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e  ize reaches 512.
0c20: 20 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70    Normal.  ** op
0c30: 65 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74  eration (without
0c40: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0c50: 4c 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20  LLOC_STRESS) is 
0c60: 74 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75  to double the cu
0c70: 72 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20  rrent.  ** size 
0c80: 6f 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20  of the op array 
0c90: 6f 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70  or add 1KB of sp
0ca0: 61 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69  ace, whichever i
0cb0: 73 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69  s smaller. */.#i
0cc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
0cd0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a  _REALLOC_STRESS.
0ce0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0cf0: 3e 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f  >nOpAlloc>=512 ?
0d00: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a   p->nOpAlloc*2 :
0d10: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70   p->nOpAlloc+nOp
0d20: 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e  );.#else.  int n
0d30: 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c  New = (p->nOpAll
0d40: 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  oc ? p->nOpAlloc
0d50: 2a 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f  *2 : (int)(1024/
0d60: 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20  sizeof(Op)));.  
0d70: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
0d80: 28 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  (nOp);.#endif.. 
0d90: 20 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31   assert( nOp<=(1
0da0: 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20  024/sizeof(Op)) 
0db0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
0dc0: 77 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b  w>=(p->nOpAlloc+
0dd0: 6e 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d  nOp) );.  pNew =
0de0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
0df0: 63 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c  c(p->db, v->aOp,
0e00: 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29   nNew*sizeof(Op)
0e10: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  );.  if( pNew ){
0e20: 0a 20 20 20 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f  .    p->szOpAllo
0e30: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
0e40: 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70  locSize(p->db, p
0e50: 4e 65 77 29 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70  New);.    p->nOp
0e60: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 73 7a 4f 70 41  Alloc = p->szOpA
0e70: 6c 6c 6f 63 2f 73 69 7a 65 6f 66 28 4f 70 29 3b  lloc/sizeof(Op);
0e80: 0a 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e  .    v->aOp = pN
0e90: 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ew;.  }.  return
0ea0: 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f   (pNew ? SQLITE_
0eb0: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  OK : SQLITE_NOME
0ec0: 4d 5f 42 4b 50 54 29 3b 0a 7d 0a 0a 23 69 66 64  M_BKPT);.}..#ifd
0ed0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0ee0: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
0ef0: 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e  is just a conven
0f00: 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65  ient place to se
0f10: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 74  t a breakpoint t
0f20: 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 66 69 72 65  hat will.** fire
0f30: 20 61 66 74 65 72 20 65 61 63 68 20 6f 70 63 6f   after each opco
0f40: 64 65 20 69 73 20 69 6e 73 65 72 74 65 64 20 61  de is inserted a
0f50: 6e 64 20 64 69 73 70 6c 61 79 65 64 20 75 73 69  nd displayed usi
0f60: 6e 67 0a 2a 2a 20 22 50 52 41 47 4d 41 20 76 64  ng.** "PRAGMA vd
0f70: 62 65 5f 61 64 64 6f 70 74 72 61 63 65 3d 6f 6e  be_addoptrace=on
0f80: 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  "..*/.static voi
0f90: 64 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65  d test_addop_bre
0fa0: 61 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20  akpoint(void){. 
0fb0: 20 73 74 61 74 69 63 20 69 6e 74 20 6e 20 3d 20   static int n = 
0fc0: 30 3b 0a 20 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64  0;.  n++;.}.#end
0fd0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  if../*.** Add a 
0fe0: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  new instruction 
0ff0: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
1000: 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72  nstructions curr
1010: 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44  ent in the.** VD
1020: 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  BE.  Return the 
1030: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
1040: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ew instruction..
1050: 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73  **.** Parameters
1060: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20  :.**.**    p    
1070: 20 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74             Point
1080: 65 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a  er to the VDBE.*
1090: 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20  *.**    op      
10a0: 20 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f          The opco
10b0: 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74  de for this inst
10c0: 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  ruction.**.**   
10d0: 20 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20   p1, p2, p3     
10e0: 20 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20   Operands.**.** 
10f0: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56  Use the sqlite3V
1100: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1110: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69  ) function to fi
1120: 78 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64  x an address and
1130: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56  .** the sqlite3V
1140: 64 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75  dbeChangeP4() fu
1150: 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65  nction to change
1160: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1170: 65 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e  e P4.** operand.
1180: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
1190: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 67  E_NOINLINE int g
11a0: 72 6f 77 4f 70 33 28 56 64 62 65 20 2a 70 2c 20  rowOp3(Vdbe *p, 
11b0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20  int op, int p1, 
11c0: 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b  int p2, int p3){
11d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
11e0: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d  arse->nOpAlloc<=
11f0: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20  p->nOp );.  if( 
1200: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31  growOpArray(p, 1
1210: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
1220: 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 72 73  assert( p->pPars
1230: 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 70 2d 3e 6e  e->nOpAlloc>p->n
1240: 4f 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  Op );.  return s
1250: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1260: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1270: 70 33 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  p3);.}.int sqlit
1280: 65 33 56 64 62 65 41 64 64 4f 70 33 28 56 64 62  e3VdbeAddOp3(Vdb
1290: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
12a0: 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e  t p1, int p2, in
12b0: 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t p3){.  int i;.
12c0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a    VdbeOp *pOp;..
12d0: 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20    i = p->nOp;.  
12e0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
12f0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
1300: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  T );.  assert( o
1310: 70 3e 3d 30 20 26 26 20 6f 70 3c 30 78 66 66 20  p>=0 && op<0xff 
1320: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 61 72  );.  if( p->pPar
1330: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20  se->nOpAlloc<=i 
1340: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 67 72  ){.    return gr
1350: 6f 77 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  owOp3(p, op, p1,
1360: 20 70 32 2c 20 70 33 29 3b 0a 20 20 7d 0a 20 20   p2, p3);.  }.  
1370: 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20  p->nOp++;.  pOp 
1380: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
1390: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75  pOp->opcode = (u
13a0: 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20  8)op;.  pOp->p5 
13b0: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d  = 0;.  pOp->p1 =
13c0: 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d   p1;.  pOp->p2 =
13d0: 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d   p2;.  pOp->p3 =
13e0: 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70   p3;.  pOp->p4.p
13f0: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74   = 0;.  pOp->p4t
1400: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
1410: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1420: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
1430: 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a  OMMENTS.  pOp->z
1440: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e  Comment = 0;.#en
1450: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1460: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d  E_DEBUG.  if( p-
1470: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1480: 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
1490: 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a  ce ){.    int jj
14a0: 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65 20  , kk;.    Parse 
14b0: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
14c0: 72 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d  rse;.    for(jj=
14d0: 6b 6b 3d 30 3b 20 6a 6a 3c 70 50 61 72 73 65 2d  kk=0; jj<pParse-
14e0: 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 6a 6a 2b 2b  >nColCache; jj++
14f0: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1500: 79 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20 70  yColCache *x = p
1510: 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1520: 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 70 72 69   + jj;.      pri
1530: 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b 25 64 3a  ntf(" r[%d]={%d:
1540: 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67 2c 20 78  %d}", x->iReg, x
1550: 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e 69 43 6f  ->iTable, x->iCo
1560: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 6b 6b 2b  lumn);.      kk+
1570: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
1580: 20 6b 6b 20 29 20 70 72 69 6e 74 66 28 22 5c 6e   kk ) printf("\n
1590: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ");.    sqlite3V
15a0: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c  dbePrintOp(0, i,
15b0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
15c0: 20 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65    test_addop_bre
15d0: 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a 23  akpoint();.  }.#
15e0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42  endif.#ifdef VDB
15f0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d  E_PROFILE.  pOp-
1600: 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70  >cycles = 0;.  p
1610: 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e  Op->cnt = 0;.#en
1620: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1630: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
1640: 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65 20    pOp->iSrcLine 
1650: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  = 0;.#endif.  re
1660: 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71  turn i;.}.int sq
1670: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
1680: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29  Vdbe *p, int op)
1690: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
16a0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
16b0: 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a  op, 0, 0, 0);.}.
16c0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
16d0: 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69  ddOp1(Vdbe *p, i
16e0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a  nt op, int p1){.
16f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1700: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
1710: 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69  , p1, 0, 0);.}.i
1720: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1730: 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp2(Vdbe *p, in
1740: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
1750: 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20  t p2){.  return 
1760: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1770: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1780: 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72   0);.}../* Gener
1790: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
17a0: 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a 75  unconditional ju
17b0: 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f  mp to instructio
17c0: 6e 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73  n iDest.*/.int s
17d0: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 56  qlite3VdbeGoto(V
17e0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73  dbe *p, int iDes
17f0: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  t){.  return sql
1800: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1810: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 44  , OP_Goto, 0, iD
1820: 65 73 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47  est, 0);.}../* G
1830: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1840: 63 61 75 73 65 20 74 68 65 20 73 74 72 69 6e 67  cause the string
1850: 20 7a 53 74 72 20 74 6f 20 62 65 20 6c 6f 61 64   zStr to be load
1860: 65 64 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73  ed into.** regis
1870: 74 65 72 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74  ter iDest.*/.int
1880: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
1890: 53 74 72 69 6e 67 28 56 64 62 65 20 2a 70 2c 20  String(Vdbe *p, 
18a0: 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74  int iDest, const
18b0: 20 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20 20   char *zStr){.  
18c0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
18d0: 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f 53  beAddOp4(p, OP_S
18e0: 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73 74  tring8, 0, iDest
18f0: 2c 20 30 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 7d  , 0, zStr, 0);.}
1900: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1910: 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69   code that initi
1920: 61 6c 69 7a 65 73 20 6d 75 6c 74 69 70 6c 65 20  alizes multiple 
1930: 72 65 67 69 73 74 65 72 73 20 74 6f 20 73 74 72  registers to str
1940: 69 6e 67 20 6f 72 20 69 6e 74 65 67 65 72 0a 2a  ing or integer.*
1950: 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68  * constants.  Th
1960: 65 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  e registers begi
1970: 6e 20 77 69 74 68 20 69 44 65 73 74 20 61 6e 64  n with iDest and
1980: 20 69 6e 63 72 65 61 73 65 20 63 6f 6e 73 65 63   increase consec
1990: 75 74 69 76 65 6c 79 2e 0a 2a 2a 20 4f 6e 65 20  utively..** One 
19a0: 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74  register is init
19b0: 69 61 6c 69 7a 65 64 20 66 6f 72 20 65 61 63 68  ialized for each
19c0: 20 63 68 61 72 61 63 67 74 65 72 20 69 6e 20 7a   characgter in z
19d0: 54 79 70 65 73 5b 5d 2e 20 20 46 6f 72 20 65 61  Types[].  For ea
19e0: 63 68 0a 2a 2a 20 22 73 22 20 63 68 61 72 61 63  ch.** "s" charac
19f0: 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c  ter in zTypes[],
1a00: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
1a10: 20 61 20 73 74 72 69 6e 67 20 69 66 20 74 68 65   a string if the
1a20: 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20   argument is.** 
1a30: 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 72 20 4f 50 5f  not NULL, or OP_
1a40: 4e 75 6c 6c 20 69 66 20 74 68 65 20 76 61 6c 75  Null if the valu
1a50: 65 20 69 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  e is a null poin
1a60: 74 65 72 2e 20 20 46 6f 72 20 65 61 63 68 20 22  ter.  For each "
1a70: 69 22 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  i" character.** 
1a80: 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65  in zTypes[], the
1a90: 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
1aa0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6e 20 69  tialized to an i
1ab0: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20  nteger..*/.void 
1ac0: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
1ad0: 4c 6f 61 64 28 56 64 62 65 20 2a 70 2c 20 69 6e  Load(Vdbe *p, in
1ae0: 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63  t iDest, const c
1af0: 68 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e  har *zTypes, ...
1b00: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
1b10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
1b20: 20 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61   c;.  va_start(a
1b30: 70 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20 66 6f  p, zTypes);.  fo
1b40: 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54 79 70  r(i=0; (c = zTyp
1b50: 65 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  es[i])!=0; i++){
1b60: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 73 27 20  .    if( c=='s' 
1b70: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
1b80: 68 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72 67 28  har *z = va_arg(
1b90: 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  ap, const char*)
1ba0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1bb0: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 7a 3d 3d  dbeAddOp4(p, z==
1bc0: 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50  0 ? OP_Null : OP
1bd0: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65  _String8, 0, iDe
1be0: 73 74 2b 2b 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a  st++, 0, z, 0);.
1bf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c00: 20 61 73 73 65 72 74 28 20 63 3d 3d 27 69 27 20   assert( c=='i' 
1c10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c20: 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50  VdbeAddOp2(p, OP
1c30: 5f 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67  _Integer, va_arg
1c40: 28 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74  (ap, int), iDest
1c50: 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ++);.    }.  }. 
1c60: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a   va_end(ap);.}..
1c70: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63  /*.** Add an opc
1c80: 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65  ode that include
1c90: 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61  s the p4 value a
1ca0: 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  s a pointer..*/.
1cb0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1cc0: 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70  ddOp4(.  Vdbe *p
1cd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1ce0: 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74  Add the opcode t
1cf0: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
1d00: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
1d10: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70     /* The new op
1d20: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31  code */.  int p1
1d30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1d40: 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20   The P1 operand 
1d50: 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20  */.  int p2,    
1d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d70: 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P2 operand */.  
1d80: 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20  int p3,         
1d90: 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70      /* The P3 op
1da0: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
1db0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f   char *zP4,    /
1dc0: 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64  * The P4 operand
1dd0: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65   */.  int p4type
1de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20            /* P4 
1df0: 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a  operand type */.
1e00: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  ){.  int addr = 
1e10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e20: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1e30: 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   p3);.  sqlite3V
1e40: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
1e50: 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65  ddr, zP4, p4type
1e60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1e70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1e80: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
1e90: 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61  cludes the p4 va
1ea0: 6c 75 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e  lue with a P4_IN
1eb0: 54 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45 41  T64 or.** P4_REA
1ec0: 4c 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73  L type..*/.int s
1ed0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1ee0: 44 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c  Dup8(.  Vdbe *p,
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1f00: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
1f10: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
1f20: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
1f30: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
1f40: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f60: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1f70: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1f80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1f90: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1fa0: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1fb0: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1fc0: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1fd0: 75 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a  u8 *zP4,      /*
1fe0: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1ff0: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
2000: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
2010: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
2020: 7b 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79  {.  char *p4copy
2030: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2040: 6f 63 52 61 77 4e 4e 28 73 71 6c 69 74 65 33 56  ocRawNN(sqlite3V
2050: 64 62 65 44 62 28 70 29 2c 20 38 29 3b 0a 20 20  dbeDb(p), 8);.  
2060: 69 66 28 20 70 34 63 6f 70 79 20 29 20 6d 65 6d  if( p4copy ) mem
2070: 63 70 79 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c  cpy(p4copy, zP4,
2080: 20 38 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71   8);.  return sq
2090: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
20a0: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
20b0: 33 2c 20 70 34 63 6f 70 79 2c 20 70 34 74 79 70  3, p4copy, p4typ
20c0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  e);.}../*.** Add
20d0: 20 61 6e 20 4f 50 5f 50 61 72 73 65 53 63 68 65   an OP_ParseSche
20e0: 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  ma opcode.  This
20f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 62 72 6f 6b   routine is brok
2100: 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73  en out from.** s
2110: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2120: 28 29 20 73 69 6e 63 65 20 69 74 20 6e 65 65 64  () since it need
2130: 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20  s to also needs 
2140: 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65  to mark all btre
2150: 65 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67 20  es.** as having 
2160: 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  been used..**.**
2170: 20 54 68 65 20 7a 57 68 65 72 65 20 73 74 72 69   The zWhere stri
2180: 6e 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ng must have bee
2190: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  n obtained from 
21a0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
21b0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
21c0: 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65  e will take owne
21d0: 72 73 68 69 70 20 6f 66 20 74 68 65 20 61 6c 6c  rship of the all
21e0: 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a  ocated memory..*
21f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
2200: 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61  beAddParseSchema
2210: 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Op(Vdbe *p, int 
2220: 69 44 62 2c 20 63 68 61 72 20 2a 7a 57 68 65 72  iDb, char *zWher
2230: 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 73  e){.  int j;.  s
2240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2250: 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (p, OP_ParseSche
2260: 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 7a  ma, iDb, 0, 0, z
2270: 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d 49  Where, P4_DYNAMI
2280: 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  C);.  for(j=0; j
2290: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b  <p->db->nDb; j++
22a0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  ) sqlite3VdbeUse
22b0: 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d 0a  sBtree(p, j);.}.
22c0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
22d0: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
22e0: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
22f0: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  as an integer..*
2300: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2310: 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56 64  eAddOp4Int(.  Vd
2320: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
2330: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63    /* Add the opc
2340: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a  ode to this VM *
2350: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
2360: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
2370: 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  ew opcode */.  i
2380: 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20  nt p1,          
2390: 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65     /* The P1 ope
23a0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32  rand */.  int p2
23b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
23c0: 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   The P2 operand 
23d0: 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20  */.  int p3,    
23e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23f0: 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P3 operand */.  
2400: 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20 20  int p4          
2410: 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70      /* The P4 op
2420: 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74 65  erand as an inte
2430: 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ger */.){.  int 
2440: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2450: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
2460: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 69  p1, p2, p3);.  i
2470: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
2480: 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
2490: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
24a0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
24b0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
24c0: 50 34 5f 49 4e 54 33 32 3b 0a 20 20 20 20 70 4f  P4_INT32;.    pO
24d0: 70 2d 3e 70 34 2e 69 20 3d 20 70 34 3b 0a 20 20  p->p4.i = p4;.  
24e0: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
24f0: 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74 20 74 68  .}../* Insert th
2500: 65 20 65 6e 64 20 6f 66 20 61 20 63 6f 2d 72 6f  e end of a co-ro
2510: 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20 73 71  utine.*/.void sq
2520: 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
2530: 75 74 69 6e 65 28 56 64 62 65 20 2a 76 2c 20 69  utine(Vdbe *v, i
2540: 6e 74 20 72 65 67 59 69 65 6c 64 29 7b 0a 20 20  nt regYield){.  
2550: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2560: 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75  1(v, OP_EndCorou
2570: 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b  tine, regYield);
2580: 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65  ..  /* Clear the
2590: 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
25a0: 74 65 72 20 63 61 63 68 65 2c 20 74 68 65 72 65  ter cache, there
25b0: 62 79 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74  by ensuring that
25c0: 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f 2d 72 6f   each.  ** co-ro
25d0: 75 74 69 6e 65 20 68 61 73 20 69 74 73 20 6f 77  utine has its ow
25e0: 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65  n independent se
25f0: 74 20 6f 66 20 72 65 67 69 73 74 65 72 73 2c 20  t of registers, 
2600: 62 65 63 61 75 73 65 20 63 6f 2d 72 6f 75 74 69  because co-routi
2610: 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68 74 20 65  nes.  ** might e
2620: 78 70 65 63 74 20 74 68 65 69 72 20 72 65 67 69  xpect their regi
2630: 73 74 65 72 73 20 74 6f 20 62 65 20 70 72 65 73  sters to be pres
2640: 65 72 76 65 64 20 61 63 72 6f 73 73 20 61 6e 20  erved across an 
2650: 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64 0a 20 20  OP_Yield, and.  
2660: 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64 20 63 61  ** that could ca
2670: 75 73 65 20 70 72 6f 62 6c 65 6d 73 20 69 66 20  use problems if 
2680: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 2d 72  two or more co-r
2690: 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 69 6e  outines are usin
26a0: 67 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20  g the same.  ** 
26b0: 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
26c0: 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d 3e 70 50  er..  */.  v->pP
26d0: 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d  arse->nTempReg =
26e0: 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72 73 65 2d   0;.  v->pParse-
26f0: 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a  >nRangeReg = 0;.
2700: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2710: 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c  a new symbolic l
2720: 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74  abel for an inst
2730: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  ruction that has
2740: 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f   yet to be.** co
2750: 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c  ded.  The symbol
2760: 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c  ic label is real
2770: 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69  ly just a negati
2780: 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a  ve number.  The.
2790: 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20  ** label can be 
27a0: 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76  used as the P2 v
27b0: 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61  alue of an opera
27c0: 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68  tion.  Later, wh
27d0: 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  en.** the label 
27e0: 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61  is resolved to a
27f0: 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73   specific addres
2800: 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c  s, the VDBE will
2810: 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68   scan.** through
2820: 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c   its operation l
2830: 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61  ist and change a
2840: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20  ll values of P2 
2850: 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74  which match.** t
2860: 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68  he label into th
2870: 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65  e resolved addre
2880: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  ss..**.** The VD
2890: 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20  BE knows that a 
28a0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
28b0: 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65  bel because labe
28c0: 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73  ls are.** always
28d0: 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32   negative and P2
28e0: 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70   values are supp
28f0: 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65  ose to be non-ne
2900: 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65  gative..** Hence
2910: 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  , a negative P2 
2920: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
2930: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
2940: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a   be resolved..**
2950: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
2960: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2970: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74  () fails..*/.int
2980: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2990: 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29 7b 0a  Label(Vdbe *v){.
29a0: 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e    Parse *p = v->
29b0: 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 20  pParse;.  int i 
29c0: 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20  = p->nLabel++;. 
29d0: 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69   assert( v->magi
29e0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
29f0: 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69 20 26  IT );.  if( (i &
2a00: 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20   (i-1))==0 ){.  
2a10: 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71    p->aLabel = sq
2a20: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
2a30: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Free(p->db, p->a
2a40: 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20  Label, .        
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2a70: 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d  i*2+1)*sizeof(p-
2a80: 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20  >aLabel[0]));.  
2a90: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  }.  if( p->aLabe
2aa0: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
2ab0: 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a  el[i] = -1;.  }.
2ac0: 20 20 72 65 74 75 72 6e 20 41 44 44 52 28 69 29    return ADDR(i)
2ad0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
2ae0: 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20  ve label "x" to 
2af0: 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
2b00: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
2b10: 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20  uction to.** be 
2b20: 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70  inserted.  The p
2b30: 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73  arameter "x" mus
2b40: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
2b50: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  ined from.** a p
2b60: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
2b70: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2b80: 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  l()..*/.void sql
2b90: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2ba0: 61 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e  abel(Vdbe *v, in
2bb0: 74 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  t x){.  Parse *p
2bc0: 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = v->pParse;.  
2bd0: 69 6e 74 20 6a 20 3d 20 41 44 44 52 28 78 29 3b  int j = ADDR(x);
2be0: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
2bf0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2c00: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
2c10: 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  ( j<p->nLabel );
2c20: 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20  .  assert( j>=0 
2c30: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62  );.  if( p->aLab
2c40: 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61  el ){.    p->aLa
2c50: 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b  bel[j] = v->nOp;
2c60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
2c70: 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f  rk the VDBE as o
2c80: 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79  ne that can only
2c90: 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65   be run one time
2ca0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2cb0: 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65  3VdbeRunOnlyOnce
2cc0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
2cd0: 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b  runOnlyOnce = 1;
2ce0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74  .}../*.** Mark t
2cf0: 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74  he VDBE as one t
2d00: 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  hat can only be 
2d10: 72 75 6e 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  run multiple tim
2d20: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
2d30: 74 65 33 56 64 62 65 52 65 75 73 61 62 6c 65 28  te3VdbeReusable(
2d40: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
2d50: 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 30 3b 0a  unOnlyOnce = 0;.
2d60: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2d70: 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65  _DEBUG /* sqlite
2d80: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
2d90: 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a  ) logic */../*.*
2da0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2db0: 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f  type and functio
2dc0: 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74  n are used to it
2dd0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
2de0: 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20  l opcodes.** in 
2df0: 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67  a Vdbe main prog
2e00: 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20  ram and each of 
2e10: 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73  the sub-programs
2e20: 20 28 74 72 69 67 67 65 72 73 29 20 69 74 20 6d   (triggers) it m
2e30: 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69  ay .** invoke di
2e40: 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65  rectly or indire
2e50: 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20  ctly. It should 
2e60: 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  be used as follo
2e70: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a  ws:.**.**   Op *
2e80: 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70  pOp;.**   VdbeOp
2e90: 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a  Iter sIter;.**.*
2ea0: 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65  *   memset(&sIte
2eb0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74  r, 0, sizeof(sIt
2ec0: 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72  er));.**   sIter
2ed0: 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20  .v = v;         
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef0: 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79     // v is of ty
2f00: 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77  pe Vdbe* .**   w
2f10: 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49  hile( (pOp = opI
2f20: 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29  terNext(&sIter))
2f30: 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f   ){.**     // Do
2f40: 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20   something with 
2f50: 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20  pOp.**   }.**   
2f60: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
2f70: 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62  >db, sIter.apSub
2f80: 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65  );.** .*/.typede
2f90: 66 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 49  f struct VdbeOpI
2fa0: 74 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a  ter VdbeOpIter;.
2fb0: 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65  struct VdbeOpIte
2fc0: 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20  r {.  Vdbe *v;  
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72   /* Vdbe to iter
2ff0: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
3000: 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20  opcodes of */.  
3010: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53  SubProgram **apS
3020: 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72  ub;        /* Ar
3030: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
3040: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  ms */.  int nSub
3050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3060: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3070: 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 62  entries in apSub
3080: 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b   */.  int iAddr;
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
30b0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
30c0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
30d0: 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 20  nt iSub;        
30e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d            /* 0 =
30f0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31   main program, 1
3100: 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f   = first sub-pro
3110: 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a  gram etc. */.};.
3120: 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65  static Op *opIte
3130: 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 72  rNext(VdbeOpIter
3140: 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20   *p){.  Vdbe *v 
3150: 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52  = p->v;.  Op *pR
3160: 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f  et = 0;.  Op *aO
3170: 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20  p;.  int nOp;.. 
3180: 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d   if( p->iSub<=p-
3190: 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66  >nSub ){..    if
31a0: 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a  ( p->iSub==0 ){.
31b0: 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61        aOp = v->a
31c0: 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20  Op;.      nOp = 
31d0: 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73  v->nOp;.    }els
31e0: 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70  e{.      aOp = p
31f0: 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d  ->apSub[p->iSub-
3200: 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e  1]->aOp;.      n
3210: 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d  Op = p->apSub[p-
3220: 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20  >iSub-1]->nOp;. 
3230: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
3240: 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b   p->iAddr<nOp );
3250: 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f  ..    pRet = &aO
3260: 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20  p[p->iAddr];.   
3270: 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20   p->iAddr++;.   
3280: 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e   if( p->iAddr==n
3290: 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  Op ){.      p->i
32a0: 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e  Sub++;.      p->
32b0: 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d  iAddr = 0;.    }
32c0: 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 74  .  .    if( pRet
32d0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
32e0: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
32f0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d   int nByte = (p-
3300: 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28  >nSub+1)*sizeof(
3310: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
3320: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
3330: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
3340: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
3350: 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b     if( p->apSub[
3360: 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72  j]==pRet->p4.pPr
3370: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
3380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3390: 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20   j==p->nSub ){. 
33a0: 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20         p->apSub 
33b0: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
33c0: 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20  ocOrFree(v->db, 
33d0: 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29  p->apSub, nByte)
33e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
33f0: 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20  ->apSub ){.     
3400: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
3410: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
3420: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62          p->apSub
3430: 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52  [p->nSub++] = pR
3440: 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b  et->p4.pProgram;
3450: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3460: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
3470: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
3480: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74  /*.** Check if t
3490: 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65  he program store
34a0: 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f  d in the VM asso
34b0: 63 69 61 74 65 64 20 77 69 74 68 20 70 50 61 72  ciated with pPar
34c0: 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20  se may.** throw 
34d0: 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69  an ABORT excepti
34e0: 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 20  on (causing the 
34f0: 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e  statement, but n
3500: 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  ot entire transa
3510: 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72  ction.** to be r
3520: 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69  olled back). Thi
3530: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74  s condition is t
3540: 72 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  rue if the main 
3550: 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a  program or any.*
3560: 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63  * sub-programs c
3570: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74  ontains any of t
3580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
3590: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
35a0: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
35b0: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
35c0: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
35d0: 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c   *  OP_HaltIfNul
35e0: 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45  l with P1=SQLITE
35f0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
3600: 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20  P2=OE_Abort..** 
3610: 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a    *  OP_Destroy.
3620: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61  **   *  OP_VUpda
3630: 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52  te.**   *  OP_VR
3640: 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  ename.**   *  OP
3650: 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20  _FkCounter with 
3660: 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65  P2==0 (immediate
3670: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
3680: 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20 2a 20  straint).**   * 
3690: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20   OP_CreateTable 
36a0: 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  and OP_InitCorou
36b0: 74 69 6e 65 20 28 66 6f 72 20 43 52 45 41 54 45  tine (for CREATE
36c0: 20 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43 54   TABLE AS SELECT
36d0: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e   ...).**.** Then
36e0: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
36f0: 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d  value of Parse.m
3700: 61 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20  ayAbort is true 
3710: 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d  if an.** ABORT m
3720: 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72  ay be thrown, or
3730: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
3740: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  . Return true if
3750: 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63   it does.** matc
3760: 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  h, or false othe
3770: 72 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63  rwise. This func
3780: 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64  tion is intended
3790: 20 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a   to be used as.*
37a0: 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  * part of an ass
37b0: 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ert statement in
37c0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53   the compiler. S
37d0: 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a  imilar to:.**.**
37e0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
37f0: 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41  e3VdbeAssertMayA
3800: 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64  bort(pParse->pVd
3810: 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41  be, pParse->mayA
3820: 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20  bort) );.*/.int 
3830: 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72  sqlite3VdbeAsser
3840: 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a  tMayAbort(Vdbe *
3850: 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29  v, int mayAbort)
3860: 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74  {.  int hasAbort
3870: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 46   = 0;.  int hasF
3880: 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20  kCounter = 0;.  
3890: 69 6e 74 20 68 61 73 43 72 65 61 74 65 54 61 62  int hasCreateTab
38a0: 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61  le = 0;.  int ha
38b0: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d  sInitCoroutine =
38c0: 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20   0;.  Op *pOp;. 
38d0: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
38e0: 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74  r;.  memset(&sIt
38f0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49  er, 0, sizeof(sI
3900: 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76  ter));.  sIter.v
3910: 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = v;..  while( 
3920: 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78  (pOp = opIterNex
3930: 74 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b  t(&sIter))!=0 ){
3940: 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20  .    int opcode 
3950: 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pOp->opcode;. 
3960: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
3970: 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63  P_Destroy || opc
3980: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20  ode==OP_VUpdate 
3990: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52  || opcode==OP_VR
39a0: 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20 28  ename .     || (
39b0: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74  (opcode==OP_Halt
39c0: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48   || opcode==OP_H
39d0: 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20  altIfNull) .    
39e0: 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30    && ((pOp->p1&0
39f0: 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
3a00: 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
3a10: 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20  p2==OE_Abort)). 
3a20: 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41     ){.      hasA
3a30: 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  bort = 1;.      
3a40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3a50: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
3a60: 43 72 65 61 74 65 54 61 62 6c 65 20 29 20 68 61  CreateTable ) ha
3a70: 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 31  sCreateTable = 1
3a80: 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  ;.    if( opcode
3a90: 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  ==OP_InitCorouti
3aa0: 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f 72 6f  ne ) hasInitCoro
3ab0: 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66 6e 64  utine = 1;.#ifnd
3ac0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
3ad0: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 69  OREIGN_KEY.    i
3ae0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b  f( opcode==OP_Fk
3af0: 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d 3e  Counter && pOp->
3b00: 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32  p1==0 && pOp->p2
3b10: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68 61 73  ==1 ){.      has
3b20: 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b 0a 20  FkCounter = 1;. 
3b30: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
3b40: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3b50: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
3b60: 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  ub);..  /* Retur
3b70: 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f  n true if hasAbo
3b80: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72  rt==mayAbort. Or
3b90: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
3ba0: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
3bb0: 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61   ** If malloc fa
3bc0: 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77  iled, then the w
3bd0: 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76  hile() loop abov
3be0: 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69  e may not have i
3bf0: 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72  terated.  ** thr
3c00: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
3c10: 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61   and hasAbort ma
3c20: 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65  y be set incorre
3c30: 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a  ctly. Return.  *
3c40: 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20  * true for this 
3c50: 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20  case to prevent 
3c60: 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20  the assert() in 
3c70: 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d  the callers fram
3c80: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c  e.  ** from fail
3c90: 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  ing.  */.  retur
3ca0: 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  n ( v->db->mallo
3cb0: 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62  cFailed || hasAb
3cc0: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 7c 7c  ort==mayAbort ||
3cd0: 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a 20 20   hasFkCounter.  
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
3cf0: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 26  hasCreateTable &
3d00: 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69  & hasInitCorouti
3d10: 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ne) );.}.#endif 
3d20: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
3d30: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73  - the sqlite3Ass
3d40: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75  ertMayAbort() fu
3d50: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  nction */../*.**
3d60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3d70: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c   called after al
3d80: 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62  l opcodes have b
3d90: 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 49  een inserted.  I
3da0: 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72 6f 75  t loops.** throu
3db0: 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63 6f 64  gh all the opcod
3dc0: 65 73 20 61 6e 64 20 66 69 78 65 73 20 75 70 20  es and fixes up 
3dd0: 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  some details..**
3de0: 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61 63 68  .** (1) For each
3df0: 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   jump instructio
3e00: 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74 69 76  n with a negativ
3e10: 65 20 50 32 20 76 61 6c 75 65 20 28 61 20 6c 61  e P2 value (a la
3e20: 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65 73 6f  bel).**     reso
3e30: 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c 75 65  lve the P2 value
3e40: 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20 61 64   to an actual ad
3e50: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29  dress..**.** (2)
3e60: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 78   Compute the max
3e70: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61  imum number of a
3e80: 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20 62 79  rguments used by
3e90: 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74 69 6f   any SQL functio
3ea0: 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73 74 6f  n.**     and sto
3eb0: 72 65 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e  re that value in
3ec0: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2e 0a   *pMaxFuncArgs..
3ed0: 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61 74 65  **.** (3) Update
3ee0: 20 74 68 65 20 56 64 62 65 2e 72 65 61 64 4f 6e   the Vdbe.readOn
3ef0: 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49 73 52  ly and Vdbe.bIsR
3f00: 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f 20 61  eader flags to a
3f10: 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20 20 20  ccurately.**    
3f20: 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74   indicate what t
3f30: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
3f40: 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79 20 64  ement actually d
3f50: 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20 49  oes..**.** (4) I
3f60: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 34  nitialize the p4
3f70: 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65  .xAdvance pointe
3f80: 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74 68 61  r on opcodes tha
3f90: 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  t use it..**.** 
3fa0: 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68 65 20  (5) Reclaim the 
3fb0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64  memory allocated
3fc0: 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c 61 62   for storing lab
3fd0: 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  els..**.** This 
3fe0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
3ff0: 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72 72 65  y function corre
4000: 63 74 6c 79 20 69 66 20 74 68 65 20 6d 6b 6f 70  ctly if the mkop
4010: 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61  codeh.tcl genera
4020: 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20 6e 75  tor.** script nu
4030: 6d 62 65 72 73 20 74 68 65 20 6f 70 63 6f 64 65  mbers the opcode
4040: 73 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 43 68  s correctly.  Ch
4050: 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20 72 6f  anges to this ro
4060: 75 74 69 6e 65 20 6d 75 73 74 20 62 65 0a 2a 2a  utine must be.**
4070: 20 63 6f 6f 72 64 69 6e 61 74 65 64 20 77 69 74   coordinated wit
4080: 68 20 63 68 61 6e 67 65 73 20 74 6f 20 6d 6b 6f  h changes to mko
4090: 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f 0a 73  pcodeh.tcl..*/.s
40a0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c  tatic void resol
40b0: 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20  veP2Values(Vdbe 
40c0: 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e  *p, int *pMaxFun
40d0: 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 6e 4d  cArgs){.  int nM
40e0: 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75  axArgs = *pMaxFu
40f0: 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f  ncArgs;.  Op *pO
4100: 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p;.  Parse *pPar
4110: 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a  se = p->pParse;.
4120: 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20    int *aLabel = 
4130: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a  pParse->aLabel;.
4140: 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20    p->readOnly = 
4150: 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 64 65  1;.  p->bIsReade
4160: 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d 20 26  r = 0;.  pOp = &
4170: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
4180: 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 0a 20  ;.  while(1){.. 
4190: 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d 50 20     /* Only JUMP 
41a0: 6f 70 63 6f 64 65 73 20 61 6e 64 20 74 68 65 20  opcodes and the 
41b0: 73 68 6f 72 74 20 6c 69 73 74 20 6f 66 20 73 70  short list of sp
41c0: 65 63 69 61 6c 20 6f 70 63 6f 64 65 73 20 69 6e  ecial opcodes in
41d0: 20 74 68 65 20 73 77 69 74 63 68 0a 20 20 20 20   the switch.    
41e0: 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20 74 6f  ** below need to
41f0: 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   be considered. 
4200: 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74   The mkopcodeh.t
4210: 63 6c 20 67 65 6e 65 72 61 74 6f 72 20 73 63 72  cl generator scr
4220: 69 70 74 20 67 72 6f 75 70 73 0a 20 20 20 20 2a  ipt groups.    *
4230: 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f 70 63 6f  * all these opco
4240: 64 65 73 20 74 6f 67 65 74 68 65 72 20 6e 65 61  des together nea
4250: 72 20 74 68 65 20 66 72 6f 6e 74 20 6f 66 20 74  r the front of t
4260: 68 65 20 6f 70 63 6f 64 65 20 6c 69 73 74 2e 20  he opcode list. 
4270: 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61 6e 79   Skip.    ** any
4280: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 6f 65   opcode that doe
4290: 73 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f 63 65  s not need proce
42a0: 73 73 69 6e 67 20 62 79 20 76 69 72 74 75 61 6c  ssing by virtual
42b0: 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61   of the fact tha
42c0: 74 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6c  t.    ** it is l
42d0: 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54  arger than SQLIT
42e0: 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45  E_MX_JUMP_OPCODE
42f0: 2c 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  , as a performan
4300: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ce optimization.
4310: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
4320: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53 51 4c  pOp->opcode<=SQL
4330: 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f  ITE_MX_JUMP_OPCO
4340: 44 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  DE ){.      /* N
4350: 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f 20  OTE: Be sure to 
4360: 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65 68  update mkopcodeh
4370: 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69 6e 67  .tcl when adding
4380: 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20 20   or removing.   
4390: 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d     ** cases from
43a0: 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f   this switch! */
43b0: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
43c0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20  Op->opcode ){.  
43d0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72        case OP_Tr
43e0: 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20  ansaction: {.   
43f0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
4400: 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f  p2!=0 ) p->readO
4410: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nly = 0;.       
4420: 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20     /* fall thru 
4430: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
4440: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74       case OP_Aut
4450: 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 20  oCommit:.       
4460: 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69   case OP_Savepoi
4470: 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  nt: {.          
4480: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31  p->bIsReader = 1
4490: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
44a0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66  k;.        }.#if
44b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
44c0: 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 63 61 73  _WAL.        cas
44d0: 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a  e OP_Checkpoint:
44e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
44f0: 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a  case OP_Vacuum:.
4500: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
4510: 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20  JournalMode: {. 
4520: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64           p->read
4530: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
4540: 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72      p->bIsReader
4550: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
4560: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4570: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4580: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
4590: 45 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  E.        case O
45a0: 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20  P_VUpdate: {.   
45b0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
45c0: 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p2>nMaxArgs ) nM
45d0: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32  axArgs = pOp->p2
45e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
45f0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
4600: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69       case OP_VFi
4610: 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20  lter: {.        
4620: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
4630: 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 70 20     assert( (pOp 
4640: 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d 20 33 20 29  - p->aOp) >= 3 )
4650: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
4660: 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f  rt( pOp[-1].opco
4670: 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29  de==OP_Integer )
4680: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20  ;.          n = 
4690: 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20  pOp[-1].p1;.    
46a0: 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78        if( n>nMax
46b0: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
46c0: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = n;.          b
46d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
46e0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 63  #endif.        c
46f0: 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20  ase OP_Next:.   
4700: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78       case OP_Nex
4710: 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20 20  tIfOpen:.       
4720: 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e   case OP_SorterN
4730: 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ext: {.         
4740: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
4750: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
4760: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
4770: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
4780: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
4790: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
47a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
47b0: 65 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20  e OP_Prev:.     
47c0: 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49     case OP_PrevI
47d0: 66 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20  fOpen: {.       
47e0: 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61     pOp->p4.xAdva
47f0: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  nce = sqlite3Btr
4800: 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20  eePrevious;.    
4810: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
4820: 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a  e = P4_ADVANCE;.
4830: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
4840: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4850: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 73 71   }.      if( (sq
4860: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
4870: 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d  rty[pOp->opcode]
4880: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d   & OPFLG_JUMP)!=
4890: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29  0 && pOp->p2<0 )
48a0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
48b0: 28 20 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 3c  ( ADDR(pOp->p2)<
48c0: 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29  pParse->nLabel )
48d0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
48e0: 32 20 3d 20 61 4c 61 62 65 6c 5b 41 44 44 52 28  2 = aLabel[ADDR(
48f0: 70 4f 70 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 20  pOp->p2)];.     
4900: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
4910: 20 70 4f 70 3d 3d 70 2d 3e 61 4f 70 20 29 20 62   pOp==p->aOp ) b
4920: 72 65 61 6b 3b 0a 20 20 20 20 70 4f 70 2d 2d 3b  reak;.    pOp--;
4930: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
4940: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72  Free(p->db, pPar
4950: 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70  se->aLabel);.  p
4960: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20  Parse->aLabel = 
4970: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61  0;.  pParse->nLa
4980: 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78  bel = 0;.  *pMax
4990: 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41  FuncArgs = nMaxA
49a0: 72 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rgs;.  assert( p
49b0: 2d 3e 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c  ->bIsReader!=0 |
49c0: 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  | DbMaskAllZero(
49d0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b  p->btreeMask) );
49e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
49f0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
4a00: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
4a10: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72  tion to be inser
4a20: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
4a30: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
4a40: 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61  dr(Vdbe *p){.  a
4a50: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
4a60: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
4a70: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
4a80: 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65  nOp;.}../*.** Ve
4a90: 72 69 66 79 20 74 68 61 74 20 61 74 20 6c 65 61  rify that at lea
4aa0: 73 74 20 4e 20 6f 70 63 6f 64 65 20 73 6c 6f 74  st N opcode slot
4ab0: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
4ac0: 69 6e 20 70 20 77 69 74 68 6f 75 74 0a 2a 2a 20  in p without.** 
4ad0: 68 61 76 69 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63  having to malloc
4ae0: 20 66 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 20   for more space 
4af0: 28 65 78 63 65 70 74 20 77 68 65 6e 20 63 6f 6d  (except when com
4b00: 70 69 6c 65 64 20 75 73 69 6e 67 0a 2a 2a 20 53  piled using.** S
4b10: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
4b20: 4f 43 5f 53 54 52 45 53 53 29 2e 20 20 54 68 69  OC_STRESS).  Thi
4b30: 73 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 75  s interface is u
4b40: 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69  sed during testi
4b50: 6e 67 0a 2a 2a 20 74 6f 20 76 65 72 69 66 79 20  ng.** to verify 
4b60: 74 68 61 74 20 63 65 72 74 61 69 6e 20 63 61 6c  that certain cal
4b70: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
4b80: 65 41 64 64 4f 70 4c 69 73 74 28 29 20 63 61 6e  eAddOpList() can
4b90: 20 6e 65 76 65 72 0a 2a 2a 20 66 61 69 6c 20 64   never.** fail d
4ba0: 75 65 20 74 6f 20 61 20 4f 4f 4d 20 66 61 75 6c  ue to a OOM faul
4bb0: 74 20 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74  t and hence that
4bc0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
4bd0: 65 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  e from.** sqlite
4be0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29  3VdbeAddOpList()
4bf0: 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
4c00: 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66  non-NULL..*/.#if
4c10: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4c20: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
4c30: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ed(SQLITE_TEST_R
4c40: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76  EALLOC_STRESS).v
4c50: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56  oid sqlite3VdbeV
4c60: 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71  erifyNoMallocReq
4c70: 75 69 72 65 64 28 56 64 62 65 20 2a 70 2c 20 69  uired(Vdbe *p, i
4c80: 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt N){.  assert(
4c90: 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70   p->nOp + N <= p
4ca0: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  ->pParse->nOpAll
4cb0: 6f 63 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  oc );.}.#endif..
4cc0: 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  /*.** Verify tha
4cd0: 74 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  t the VM passed 
4ce0: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
4cf0: 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ment does not co
4d00: 6e 74 61 69 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52  ntain.** an OP_R
4d10: 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 2e  esultRow opcode.
4d20: 20 46 61 69 6c 20 61 6e 20 61 73 73 65 72 74 28   Fail an assert(
4d30: 29 20 69 66 20 69 74 20 64 6f 65 73 2e 20 54 68  ) if it does. Th
4d40: 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 62 79  is is used.** by
4d50: 20 63 6f 64 65 20 69 6e 20 70 72 61 67 6d 61 2e   code in pragma.
4d60: 63 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  c to ensure that
4d70: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
4d80: 69 6f 6e 20 6f 66 20 63 65 72 74 61 69 6e 0a 2a  ion of certain.*
4d90: 2a 20 70 72 61 67 6d 61 73 20 63 6f 6d 70 6f 72  * pragmas compor
4da0: 74 73 20 77 69 74 68 20 74 68 65 20 66 6c 61 67  ts with the flag
4db0: 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  s specified in t
4dc0: 68 65 20 6d 6b 70 72 61 67 6d 61 74 61 62 2e 74  he mkpragmatab.t
4dd0: 63 6c 0a 2a 2a 20 73 63 72 69 70 74 2e 0a 2a 2f  cl.** script..*/
4de0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4df0: 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 21 64  ITE_DEBUG) && !d
4e00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
4e10: 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  ST_REALLOC_STRES
4e20: 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  S).void sqlite3V
4e30: 64 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75 6c  dbeVerifyNoResul
4e40: 74 52 6f 77 28 56 64 62 65 20 2a 70 29 7b 0a 20  tRow(Vdbe *p){. 
4e50: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
4e60: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
4e70: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4e80: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21  ->aOp[i].opcode!
4e90: 3d 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 29 3b  =OP_ResultRow );
4ea0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
4eb0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4ec0: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
4ed0: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61  nter to the arra
4ee0: 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73  y of opcodes ass
4ef0: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
4f00: 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
4f10: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
4f20: 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65  ument. It is the
4f30: 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
4f40: 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72  ibility.** to ar
4f50: 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65  range for the re
4f60: 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20  turned array to 
4f70: 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
4f80: 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a  eed using the .*
4f90: 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  * vdbeFreeOpArra
4fa0: 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  y() function..**
4fb0: 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
4fc0: 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73  ning, *pnOp is s
4fd0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
4fe0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
4ff0: 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  he returned.** a
5000: 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d  rray. Also, *pnM
5010: 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20  axArg is set to 
5020: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74  the larger of it
5030: 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
5040: 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  and .** the numb
5050: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
5060: 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b   the Vdbe.apArg[
5070: 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64  ] array required
5080: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
5090: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f  .** returned pro
50a0: 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  gram..*/.VdbeOp 
50b0: 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65  *sqlite3VdbeTake
50c0: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c  OpArray(Vdbe *p,
50d0: 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20   int *pnOp, int 
50e0: 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64  *pnMaxArg){.  Vd
50f0: 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61  beOp *aOp = p->a
5100: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f  Op;.  assert( aO
5110: 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c  p && !p->db->mal
5120: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
5130: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71  /* Check that sq
5140: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
5150: 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  ee() was not cal
5160: 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a  led on this VM *
5170: 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61  /.  assert( DbMa
5180: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72  skAllZero(p->btr
5190: 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65  eeMask) );..  re
51a0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
51b0: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
51c0: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
51d0: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
51e0: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
51f0: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
5200: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
5210: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
5220: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
5230: 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  n a.** pointer t
5240: 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  o the first oper
5250: 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a  ation inserted..
5260: 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50  **.** Non-zero P
5270: 32 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 6a  2 arguments to j
5280: 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
5290: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
52a0: 6c 79 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 73  ly adjusted.** s
52b0: 6f 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20  o that the jump 
52c0: 74 61 72 67 65 74 20 69 73 20 72 65 6c 61 74 69  target is relati
52d0: 76 65 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ve to the first 
52e0: 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74  operation insert
52f0: 65 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  ed..*/.VdbeOp *s
5300: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
5310: 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ist(.  Vdbe *p, 
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5330: 20 20 20 20 2f 2a 20 41 64 64 20 6f 70 63 6f 64      /* Add opcod
5340: 65 73 20 74 6f 20 74 68 65 20 70 72 65 70 61 72  es to the prepar
5350: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
5360: 20 20 69 6e 74 20 6e 4f 70 2c 20 20 20 20 20 20    int nOp,      
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5380: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70 63 6f  * Number of opco
5390: 64 65 73 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  des to add */.  
53a0: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
53b0: 20 2a 61 4f 70 2c 20 20 20 20 20 20 20 2f 2a 20   *aOp,       /* 
53c0: 54 68 65 20 6f 70 63 6f 64 65 73 20 74 6f 20 62  The opcodes to b
53d0: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
53e0: 20 69 4c 69 6e 65 6e 6f 20 20 20 20 20 20 20 20   iLineno        
53f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
5400: 72 63 65 2d 66 69 6c 65 20 6c 69 6e 65 20 6e 75  rce-file line nu
5410: 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 6f 70  mber of first op
5420: 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  code */.){.  int
5430: 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f   i;.  VdbeOp *pO
5440: 75 74 2c 20 2a 70 46 69 72 73 74 3b 0a 20 20 61  ut, *pFirst;.  a
5450: 73 73 65 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a  ssert( nOp>0 );.
5460: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
5470: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
5480: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  NIT );.  if( p->
5490: 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70  nOp + nOp > p->p
54a0: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  Parse->nOpAlloc 
54b0: 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  && growOpArray(p
54c0: 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65  , nOp) ){.    re
54d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46  turn 0;.  }.  pF
54e0: 69 72 73 74 20 3d 20 70 4f 75 74 20 3d 20 26 70  irst = pOut = &p
54f0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20  ->aOp[p->nOp];. 
5500: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
5510: 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75   i++, aOp++, pOu
5520: 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  t++){.    pOut->
5530: 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70  opcode = aOp->op
5540: 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  code;.    pOut->
5550: 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20  p1 = aOp->p1;.  
5560: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70    pOut->p2 = aOp
5570: 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73 65 72 74  ->p2;.    assert
5580: 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a  ( aOp->p2>=0 );.
5590: 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 33      if( (sqlite3
55a0: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 61  OpcodeProperty[a
55b0: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  Op->opcode] & OP
55c0: 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20  FLG_JUMP)!=0 && 
55d0: 61 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20  aOp->p2>0 ){.   
55e0: 20 20 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70     pOut->p2 += p
55f0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20  ->nOp;.    }.   
5600: 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d   pOut->p3 = aOp-
5610: 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  >p3;.    pOut->p
5620: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
5630: 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34  ED;.    pOut->p4
5640: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74  .p = 0;.    pOut
5650: 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66  ->p5 = 0;.#ifdef
5660: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
5670: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
5680: 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65      pOut->zComme
5690: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  nt = 0;.#endif.#
56a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
56b0: 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70  E_COVERAGE.    p
56c0: 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  Out->iSrcLine = 
56d0: 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65  iLineno+i;.#else
56e0: 0a 20 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65  .    (void)iLine
56f0: 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  no;.#endif.#ifde
5700: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
5710: 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c     if( p->db->fl
5720: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
5730: 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
5740: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5750: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e  PrintOp(0, i+p->
5760: 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70  nOp, &p->aOp[i+p
5770: 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23  ->nOp]);.    }.#
5780: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e  endif.  }.  p->n
5790: 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74  Op += nOp;.  ret
57a0: 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23  urn pFirst;.}..#
57b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
57c0: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
57d0: 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20  ANSTATUS)./*.** 
57e0: 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  Add an entry to 
57f0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75  the array of cou
5800: 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79  nters managed by
5810: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
5820: 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76  anstatus()..*/.v
5830: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
5840: 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62  canStatus(.  Vdb
5850: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5870: 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74  VM to add scanst
5880: 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69  atus() to */.  i
5890: 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  nt addrExplain, 
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
58b0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
58c0: 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a  Explain (or 0) *
58d0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70  /.  int addrLoop
58e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
58f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
5900: 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  f loop counter *
5910: 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73  / .  int addrVis
5920: 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  it,             
5930: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
5940: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
5950: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67  counter */.  Log
5960: 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20  Est nEst,       
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5980: 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  Estimated number
5990: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
59a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
59b0: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  *zName          
59c0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
59d0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62  table or index b
59e0: 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  eing scanned */.
59f0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
5a00: 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20   (p->nScan+1) * 
5a10: 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74 75  sizeof(ScanStatu
5a20: 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75 73  s);.  ScanStatus
5a30: 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d   *aNew;.  aNew =
5a40: 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73 71   (ScanStatus*)sq
5a50: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
5a60: 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20  ->db, p->aScan, 
5a70: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 4e  nByte);.  if( aN
5a80: 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53 74  ew ){.    ScanSt
5a90: 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e  atus *pNew = &aN
5aa0: 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a  ew[p->nScan++];.
5ab0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45 78      pNew->addrEx
5ac0: 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70 6c  plain = addrExpl
5ad0: 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ain;.    pNew->a
5ae0: 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f  ddrLoop = addrLo
5af0: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  op;.    pNew->ad
5b00: 64 72 56 69 73 69 74 20 3d 20 61 64 64 72 56 69  drVisit = addrVi
5b10: 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  sit;.    pNew->n
5b20: 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20  Est = nEst;.    
5b30: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pNew->zName = sq
5b40: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 2d  lite3DbStrDup(p-
5b50: 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
5b60: 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77   p->aScan = aNew
5b70: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
5b80: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
5b90: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f  e value of the o
5ba0: 70 63 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50 32  pcode, or P1, P2
5bb0: 2c 20 50 33 2c 20 6f 72 20 50 35 20 6f 70 65 72  , P3, or P5 oper
5bc0: 61 6e 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70  ands.** for a sp
5bd0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
5be0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
5bf0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
5c00: 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 33 32  ode(Vdbe *p, u32
5c10: 20 61 64 64 72 2c 20 75 38 20 69 4e 65 77 4f 70   addr, u8 iNewOp
5c20: 63 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  code){.  sqlite3
5c30: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
5c40: 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77  )->opcode = iNew
5c50: 4f 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73  Opcode;.}.void s
5c60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5c70: 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P1(Vdbe *p, u32 
5c80: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
5c90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
5ca0: 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d  Op(p,addr)->p1 =
5cb0: 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c   val;.}.void sql
5cc0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
5cd0: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
5ce0: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
5cf0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
5d00: 28 70 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20 76  (p,addr)->p2 = v
5d10: 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  al;.}.void sqlit
5d20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
5d30: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
5d40: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71  , int val){.  sq
5d50: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
5d60: 2c 61 64 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c  ,addr)->p3 = val
5d70: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
5d80: 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62  VdbeChangeP5(Vdb
5d90: 65 20 2a 70 2c 20 75 31 36 20 70 35 29 7b 0a 20  e *p, u16 p5){. 
5da0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
5db0: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
5dc0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
5dd0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e  ( p->nOp>0 ) p->
5de0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35  aOp[p->nOp-1].p5
5df0: 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   = p5;.}../*.** 
5e00: 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70  Change the P2 op
5e10: 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63  erand of instruc
5e20: 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61  tion addr so tha
5e30: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
5e40: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
5e50: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
5e60: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65  ction to be code
5e70: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
5e80: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56  e3VdbeJumpHere(V
5e90: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
5ea0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
5eb0: 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72  ChangeP2(p, addr
5ec0: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f  , p->nOp);.}.../
5ed0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75  *.** If the inpu
5ee0: 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  t FuncDef struct
5ef0: 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ure is ephemeral
5f00: 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20  , then free it. 
5f10: 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44   If.** the FuncD
5f20: 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d  ef is not epherm
5f30: 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  al, then do noth
5f40: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
5f50: 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61  oid freeEphemera
5f60: 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65  lFunction(sqlite
5f70: 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a  3 *db, FuncDef *
5f80: 70 44 65 66 29 7b 0a 20 20 69 66 28 20 28 70 44  pDef){.  if( (pD
5f90: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
5fa0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45  SQLITE_FUNC_EPHE
5fb0: 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  M)!=0 ){.    sql
5fc0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5fd0: 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  Def);.  }.}..sta
5fe0: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
5ff0: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
6000: 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a   *, Op *, int);.
6010: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
6020: 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65  P4 value if nece
6030: 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssary..*/.static
6040: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
6050: 20 76 6f 69 64 20 66 72 65 65 50 34 4d 65 6d 28   void freeP4Mem(
6060: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d 65 6d  sqlite3 *db, Mem
6070: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73   *p){.  if( p->s
6080: 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
6090: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
60a0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69 74  Malloc);.  sqlit
60b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
60c0: 0a 7d 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  .}.static SQLITE
60d0: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66  _NOINLINE void f
60e0: 72 65 65 50 34 46 75 6e 63 43 74 78 28 73 71 6c  reeP4FuncCtx(sql
60f0: 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74 65  ite3 *db, sqlite
6100: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20  3_context *p){. 
6110: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
6120: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e 70 46  nction(db, p->pF
6130: 75 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  unc);.  sqlite3D
6140: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
6150: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
6160: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
6170: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
6180: 20 2a 70 34 29 7b 0a 20 20 61 73 73 65 72 74 28   *p4){.  assert(
6190: 20 64 62 20 29 3b 0a 20 20 73 77 69 74 63 68 28   db );.  switch(
61a0: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63   p4type ){.    c
61b0: 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20  ase P4_FUNCCTX: 
61c0: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 46 75  {.      freeP4Fu
61d0: 6e 63 43 74 78 28 64 62 2c 20 28 73 71 6c 69 74  ncCtx(db, (sqlit
61e0: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34 29 3b  e3_context*)p4);
61f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6200: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6210: 52 45 41 4c 3a 0a 20 20 20 20 63 61 73 65 20 50  REAL:.    case P
6220: 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 63 61 73  4_INT64:.    cas
6230: 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20  e P4_DYNAMIC:.  
6240: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
6250: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
6260: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34  te3DbFree(db, p4
6270: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6280: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6290: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
62a0: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
62b0: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
62c0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
62d0: 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a  ((KeyInfo*)p4);.
62e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
62f0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
6300: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
6310: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
6320: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73  _EXPR: {.      s
6330: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6340: 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b  (db, (Expr*)p4);
6350: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6360: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
6370: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
6380: 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65  {.      freeEphe
6390: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
63a0: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b  , (FuncDef*)p4);
63b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
63c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
63d0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  MEM: {.      if(
63e0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
63f0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
6400: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
6410: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
6420: 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  )p4);.      }els
6430: 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50  e{.        freeP
6440: 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70  4Mem(db, (Mem*)p
6450: 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
6460: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6470: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20     case P4_VTAB 
6480: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
6490: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
64a0: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
64b0: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
64c0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
64d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
64e0: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70  *.** Free the sp
64f0: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
6500: 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34  r aOp and any p4
6510: 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65   values allocate
6520: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63  d for the.** opc
6530: 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  odes contained w
6540: 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73  ithin. If aOp is
6550: 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20   not NULL it is 
6560: 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
6570: 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69  in .** nOp entri
6580: 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  es. .*/.static v
6590: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
65a0: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ray(sqlite3 *db,
65b0: 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f   Op *aOp, int nO
65c0: 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b  p){.  if( aOp ){
65d0: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
65e0: 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70    for(pOp=aOp; p
65f0: 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f  Op<&aOp[nOp]; pO
6600: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p++){.      if( 
6610: 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 20 66 72  pOp->p4type ) fr
6620: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
6630: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
6640: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6650: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
6660: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71  OMMENTS.      sq
6670: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
6680: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
6690: 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20  #endif     .    
66a0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
66b0: 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a  bFree(db, aOp);.
66c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68  }../*.** Link th
66d0: 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a  e SubProgram obj
66e0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
66f0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
6700: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  t into the linke
6710: 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62  d.** list at Vdb
6720: 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54  e.pSubProgram. T
6730: 68 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64  his list is used
6740: 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73   to delete all s
6750: 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62  ub-program.** ob
6760: 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56  jects when the V
6770: 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72  M is no longer r
6780: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64  equired..*/.void
6790: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b   sqlite3VdbeLink
67a0: 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20  SubProgram(Vdbe 
67b0: 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72  *pVdbe, SubProgr
67c0: 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65  am *p){.  p->pNe
67d0: 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f  xt = pVdbe->pPro
67e0: 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70  gram;.  pVdbe->p
67f0: 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a  Program = p;.}..
6800: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
6810: 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20   opcode at addr 
6820: 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a  into OP_Noop.*/.
6830: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
6840: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65  hangeToNoop(Vdbe
6850: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
6860: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
6870: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
6880: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
6890: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61  n 0;.  assert( a
68a0: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
68b0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d  ->nOp );.  pOp =
68c0: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
68d0: 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20    freeP4(p->db, 
68e0: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
68f0: 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e  ->p4.p);.  pOp->
6900: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
6910: 53 45 44 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a  SED;.  pOp->p4.z
6920: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63   = 0;.  pOp->opc
6930: 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
6940: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
6950: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20  .** If the last 
6960: 6f 70 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61  opcode is "op" a
6970: 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a  nd it is not a j
6980: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c  ump destination,
6990: 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  .** then remove 
69a0: 69 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  it.  Return true
69b0: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
69c0: 61 6e 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65  an opcode was re
69d0: 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
69e0: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50  lite3VdbeDeleteP
69f0: 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20  riorOpcode(Vdbe 
6a00: 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66  *p, u8 op){.  if
6a10: 28 20 70 2d 3e 6e 4f 70 3e 30 20 26 26 20 70 2d  ( p->nOp>0 && p-
6a20: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f  >aOp[p->nOp-1].o
6a30: 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20  pcode==op ){.   
6a40: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
6a50: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
6a60: 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20  p, p->nOp-1);.  
6a70: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
6a80: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
6a90: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
6aa0: 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65  ue of the P4 ope
6ab0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
6ac0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
6ad0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6ae0: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
6af0: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
6b00: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
6b10: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
6b20: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
6b30: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
6b40: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
6b50: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
6b60: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
6b70: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
6b80: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34  n>=0 then the P4
6b90: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
6ba0: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
6bb0: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
6bc0: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
6bd0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
6be0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
6bf0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
6c00: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30   A value of n==0
6c10: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65   means copy byte
6c20: 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61  s of zP4 up to a
6c30: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  nd including the
6c40: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62  .** first null b
6c50: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65  yte.  If n>0 the
6c60: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73  n copy n+1 bytes
6c70: 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20   of zP4..** .** 
6c80: 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  Other values of 
6c90: 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34  n (P4_STATIC, P4
6ca0: 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69  _COLLSEQ etc.) i
6cb0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34  ndicate that zP4
6cc0: 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20   points.** to a 
6cd0: 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74  string or struct
6ce0: 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72  ure that is guar
6cf0: 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
6d00: 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65  for the lifetime
6d10: 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e   of.** the Vdbe.
6d20: 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20   In these cases 
6d30: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
6d40: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a   the pointer..**
6d50: 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68  .** If addr<0 th
6d60: 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20  en change P4 on 
6d70: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
6d80: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
6d90: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uction..*/.stati
6da0: 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f  c void SQLITE_NO
6db0: 49 4e 4c 49 4e 45 20 76 64 62 65 43 68 61 6e 67  INLINE vdbeChang
6dc0: 65 50 34 46 75 6c 6c 28 0a 20 20 56 64 62 65 20  eP4Full(.  Vdbe 
6dd0: 2a 70 2c 0a 20 20 4f 70 20 2a 70 4f 70 2c 0a 20  *p,.  Op *pOp,. 
6de0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
6df0: 2c 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 69  ,.  int n.){.  i
6e00: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  f( pOp->p4type )
6e10: 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e  {.    freeP4(p->
6e20: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
6e30: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20   pOp->p4.p);.   
6e40: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 30   pOp->p4type = 0
6e50: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  ;.    pOp->p4.p 
6e60: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  = 0;.  }.  if( n
6e70: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
6e80: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c  3VdbeChangeP4(p,
6e90: 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 70 2d 3e   (int)(pOp - p->
6ea0: 61 4f 70 29 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20  aOp), zP4, n);. 
6eb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
6ec0: 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74  n==0 ) n = sqlit
6ed0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b  e3Strlen30(zP4);
6ee0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d  .    pOp->p4.z =
6ef0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
6f00: 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29  p(p->db, zP4, n)
6f10: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
6f20: 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a  e = P4_DYNAMIC;.
6f30: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
6f40: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56  e3VdbeChangeP4(V
6f50: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
6f60: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
6f70: 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20  4, int n){.  Op 
6f80: 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  *pOp;.  sqlite3 
6f90: 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  *db;.  assert( p
6fa0: 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  !=0 );.  db = p-
6fb0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
6fc0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
6fd0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
6fe0: 73 65 72 74 28 20 70 2d 3e 61 4f 70 21 3d 30 20  sert( p->aOp!=0 
6ff0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
7000: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  led );.  if( db-
7010: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
7020: 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56  .    if( n!=P4_V
7030: 54 41 42 20 29 20 66 72 65 65 50 34 28 64 62 2c  TAB ) freeP4(db,
7040: 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61   n, (void*)*(cha
7050: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 72  r**)&zP4);.    r
7060: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
7070: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
7080: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c  .  assert( addr<
7090: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20  p->nOp );.  if( 
70a0: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
70b0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
70c0: 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d  .  }.  pOp = &p-
70d0: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66  >aOp[addr];.  if
70e0: 28 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70  ( n>=0 || pOp->p
70f0: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 76 64 62  4type ){.    vdb
7100: 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 70 2c  eChangeP4Full(p,
7110: 20 70 4f 70 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20   pOp, zP4, n);. 
7120: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
7130: 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32   if( n==P4_INT32
7140: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a   ){.    /* Note:
7150: 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61   this cast is sa
7160: 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  fe, because the 
7170: 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e  origin data poin
7180: 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20  t was an int.   
7190: 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73   ** that was cas
71a0: 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68  t to a (const ch
71b0: 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f  ar *). */.    pO
71c0: 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45  p->p4.i = SQLITE
71d0: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29  _PTR_TO_INT(zP4)
71e0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
71f0: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
7200: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 21 3d 30  }else if( zP4!=0
7210: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7220: 6e 3c 30 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 );.    pOp->
7230: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
7240: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
7250: 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  pe = (signed cha
7260: 72 29 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  r)n;.    if( n==
7270: 50 34 5f 56 54 41 42 20 29 20 73 71 6c 69 74 65  P4_VTAB ) sqlite
7280: 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c  3VtabLock((VTabl
7290: 65 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a 7d 0a 0a  e*)zP4);.  }.}..
72a0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
72b0: 20 50 34 20 6f 70 65 72 61 6e 64 20 6f 66 20 74   P4 operand of t
72c0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
72d0: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
72e0: 6f 6e 20 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61  on .** to the va
72f0: 6c 75 65 20 64 65 66 69 6e 65 64 20 62 79 20 74  lue defined by t
7300: 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  he arguments.  T
7310: 68 69 73 20 69 73 20 61 20 68 69 67 68 2d 73 70  his is a high-sp
7320: 65 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f  eed.** version o
7330: 66 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  f sqlite3VdbeCha
7340: 6e 67 65 50 34 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  ngeP4()..**.** T
7350: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6d 75  he P4 operand mu
7360: 73 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  st not have been
7370: 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 66 69   previously defi
7380: 6e 65 64 2e 20 20 41 6e 64 20 74 68 65 20 6e 65  ned.  And the ne
7390: 77 0a 2a 2a 20 50 34 20 6d 75 73 74 20 6e 6f 74  w.** P4 must not
73a0: 20 62 65 20 50 34 5f 49 4e 54 33 32 2e 20 20 55   be P4_INT32.  U
73b0: 73 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  se sqlite3VdbeCh
73c0: 61 6e 67 65 50 34 28 29 20 69 6e 20 65 69 74 68  angeP4() in eith
73d0: 65 72 20 6f 66 0a 2a 2a 20 74 68 6f 73 65 20 63  er of.** those c
73e0: 61 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ases..*/.void sq
73f0: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
7400: 34 28 56 64 62 65 20 2a 70 2c 20 76 6f 69 64 20  4(Vdbe *p, void 
7410: 2a 70 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  *pP4, int n){.  
7420: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 61  VdbeOp *pOp;.  a
7430: 73 73 65 72 74 28 20 6e 21 3d 50 34 5f 49 4e 54  ssert( n!=P4_INT
7440: 33 32 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42  32 && n!=P4_VTAB
7450: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3c   );.  assert( n<
7460: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  =0 );.  if( p->d
7470: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7480: 29 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d  ){.    freeP4(p-
7490: 3e 64 62 2c 20 6e 2c 20 70 50 34 29 3b 0a 20 20  >db, n, pP4);.  
74a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
74b0: 74 28 20 70 50 34 21 3d 30 20 29 3b 0a 20 20 20  t( pP4!=0 );.   
74c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
74d0: 30 20 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 26  0 );.    pOp = &
74e0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
74f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
7500: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f  p->p4type==P4_NO
7510: 54 55 53 45 44 20 29 3b 0a 20 20 20 20 70 4f 70  TUSED );.    pOp
7520: 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20  ->p4type = n;.  
7530: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 70 50    pOp->p4.p = pP
7540: 34 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  4;.  }.}../*.** 
7550: 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68  Set the P4 on th
7560: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
7570: 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20  added opcode to 
7580: 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20  the KeyInfo for 
7590: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76  the.** index giv
75a0: 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  en..*/.void sqli
75b0: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
75c0: 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
75d0: 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
75e0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
75f0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 4b 65  rse->pVdbe;.  Ke
7600: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
7610: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
7620: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
7630: 78 21 3d 30 20 29 3b 0a 20 20 70 4b 65 79 49 6e  x!=0 );.  pKeyIn
7640: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
7650: 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
7660: 65 2c 20 70 49 64 78 29 3b 0a 20 20 69 66 28 20  e, pIdx);.  if( 
7670: 70 4b 65 79 49 6e 66 6f 20 29 20 73 71 6c 69 74  pKeyInfo ) sqlit
7680: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
7690: 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  , pKeyInfo, P4_K
76a0: 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64  EYINFO);.}..#ifd
76b0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
76c0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
76d0: 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  S./*.** Change t
76e0: 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
76f0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
7700: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
7710: 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74  n.  Or.** insert
7720: 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64   a No-op and add
7730: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20   the comment to 
7740: 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63  that new instruc
7750: 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  tion.  This.** m
7760: 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61  akes the code ea
7770: 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72  sier to read dur
7780: 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20  ing debugging.  
7790: 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70  None of this hap
77a0: 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f  pens.** in a pro
77b0: 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a  duction build..*
77c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
77d0: 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  beVComment(Vdbe 
77e0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
77f0: 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74  zFormat, va_list
7800: 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   ap){.  assert( 
7810: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
7820: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
7830: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
7840: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
7850: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
7860: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
7870: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
7880: 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nOp ){.    asser
7890: 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20  t( p->aOp );.   
78a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
78b0: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ->db, p->aOp[p->
78c0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29  nOp-1].zComment)
78d0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ;.    p->aOp[p->
78e0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20  nOp-1].zComment 
78f0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
7900: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
7910: 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  , ap);.  }.}.voi
7920: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  d sqlite3VdbeCom
7930: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
7940: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
7950: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
7960: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29  st ap;.  if( p )
7970: 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  {.    va_start(a
7980: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
7990: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c   vdbeVComment(p,
79a0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
79b0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
79c0: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
79d0: 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74  3VdbeNoopComment
79e0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
79f0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
7a00: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
7a10: 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  p;.  if( p ){.  
7a20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7a30: 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(p, OP_Noop);
7a40: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
7a50: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
7a60: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
7a70: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
7a80: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
7a90: 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e  }.}.#endif  /* N
7aa0: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
7ab0: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
7ac0: 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ERAGE./*.** Set 
7ad0: 74 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65  the value if the
7ae0: 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20   iSrcLine field 
7af0: 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
7b00: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
7b10: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
7b20: 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65  lite3VdbeSetLine
7b30: 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20  Number(Vdbe *v, 
7b40: 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71  int iLine){.  sq
7b50: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
7b60: 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  ,-1)->iSrcLine =
7b70: 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66   iLine;.}.#endif
7b80: 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f   /* SQLITE_VDBE_
7b90: 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a  COVERAGE */../*.
7ba0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
7bb0: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
7bc0: 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68   address.  If th
7bd0: 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c  e address is -1,
7be0: 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20   then.** return 
7bf0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
7c00: 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64  y inserted opcod
7c10: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  e..**.** If a me
7c20: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
7c30: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
7c40: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
7c50: 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a  calling of this.
7c60: 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  ** routine, then
7c70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
7c80: 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c  dummy VdbeOp wil
7c90: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  l be returned.  
7ca0: 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69  That opcode.** i
7cb0: 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e  s readable but n
7cc0: 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f  ot writable, tho
7cd0: 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74  ugh it is cast t
7ce0: 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c  o a writable val
7cf0: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ue..** The retur
7d00: 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63  n of a dummy opc
7d10: 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ode allows the c
7d20: 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  all to continue 
7d30: 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61  functioning.** a
7d40: 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  fter an OOM faul
7d50: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
7d60: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65   to check to see
7d70: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66   if the return f
7d80: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  rom .** this rou
7d90: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20  tine is a valid 
7da0: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65  pointer.  But be
7db0: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e  cause the dummy.
7dc0: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20  opcode is 0,.** 
7dd0: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72  dummy will never
7de0: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
7df0: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65   This is verifie
7e00: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63  d by code inspec
7e10: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72  tion and.** by r
7e20: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67  unning with Valg
7e30: 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  rind..*/.VdbeOp 
7e40: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
7e50: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
7e60: 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73  ddr){.  /* C89 s
7e70: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68  pecifies that th
7e80: 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d  e constant "dumm
7e90: 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69  y" will be initi
7ea0: 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20  alized to all.  
7eb0: 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20  ** zeros, which 
7ec0: 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56  is correct.  MSV
7ed0: 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61  C generates a wa
7ee0: 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c  rning, neverthel
7ef0: 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ess. */.  static
7f00: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20   VdbeOp dummy;  
7f10: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53  /* Ignore the MS
7f20: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  VC warning about
7f30: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20   no initializer 
7f40: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
7f50: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
7f60: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
7f70: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
7f80: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
7f90: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
7fa0: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
7fb0: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
7fc0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7fd0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
7fe0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
7ff0: 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f     return (VdbeO
8000: 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c  p*)&dummy;.  }el
8010: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
8020: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
8030: 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
8040: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45  (SQLITE_ENABLE_E
8050: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29  XPLAIN_COMMENTS)
8060: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
8070: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
8080: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61  or one of the pa
8090: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20  rameters to the 
80a0: 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65  opcode pOp.** de
80b0: 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72  termined by char
80c0: 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74  acter c..*/.stat
80d0: 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65  ic int translate
80e0: 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20  P(char c, const 
80f0: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20  Op *pOp){.  if( 
8100: 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20  c=='1' ) return 
8110: 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63  pOp->p1;.  if( c
8120: 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70  =='2' ) return p
8130: 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d  Op->p2;.  if( c=
8140: 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='3' ) return pO
8150: 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p3;.  if( c==
8160: 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '4' ) return pOp
8170: 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e  ->p4.i;.  return
8180: 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a   pOp->p5;.}../*.
8190: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
81a0: 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d  ing for the "com
81b0: 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61  ment" field of a
81c0: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73   VDBE opcode lis
81d0: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
81e0: 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20  Synopsis: field 
81f0: 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  in comments in t
8200: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
8210: 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65   file gets conve
8220: 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78  rted.** to an ex
8230: 74 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  tra string that 
8240: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
8250: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
8260: 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a  Name().  In the.
8270: 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74  ** absence of ot
8280: 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68  her comments, th
8290: 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f  is synopsis beco
82a0: 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  mes the comment 
82b0: 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a  on the opcode..*
82c0: 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69  * Some translati
82d0: 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a  on occurs:.**.**
82e0: 20 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20         "PX"     
82f0: 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20   ->  "r[X]".**  
8300: 20 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d       "PX@PY"   -
8310: 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22  >  "r[X..X+Y-1]"
8320: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
8330: 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20   is 0 or 1.**   
8340: 20 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e      "PX@PY+1" ->
8350: 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20    "r[X..X+Y]"   
8360: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
8370: 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50  is 0.**       "P
8380: 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58  Y..PY"  ->  "r[X
8390: 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72  ..Y]"      or "r
83a0: 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a  [x]" if y<=x.*/.
83b0: 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
83c0: 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e  ayComment(.  con
83d0: 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20  st Op *pOp,     
83e0: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f  /* The opcode to
83f0: 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f   be commented */
8400: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8410: 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  P4,   /* Previou
8420: 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c  sly obtained val
8430: 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63  ue for P4 */.  c
8440: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20  har *zTemp,     
8450: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
8460: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
8470: 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f  nTemp          /
8480: 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c  * Space availabl
8490: 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a  e in zTemp[] */.
84a0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
84b0: 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  *zOpName;.  cons
84c0: 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69  t char *zSynopsi
84d0: 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65  s;.  int nOpName
84e0: 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a  ;.  int ii, jj;.
84f0: 20 20 63 68 61 72 20 7a 41 6c 74 5b 35 30 5d 3b    char zAlt[50];
8500: 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c  .  zOpName = sql
8510: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
8520: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e  Op->opcode);.  n
8530: 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  OpName = sqlite3
8540: 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65  Strlen30(zOpName
8550: 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65  );.  if( zOpName
8560: 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20  [nOpName+1] ){. 
8570: 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d     int seenCom =
8580: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a   0;.    char c;.
8590: 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20      zSynopsis = 
85a0: 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61  zOpName += nOpNa
85b0: 6d 65 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20  me + 1;.    if( 
85c0: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
85d0: 73 2c 22 49 46 20 22 2c 33 29 3d 3d 30 20 29 7b  s,"IF ",3)==0 ){
85e0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
85f0: 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52  p5 & SQLITE_STOR
8600: 45 50 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73  EP2 ){.        s
8610: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8620: 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41  sizeof(zAlt), zA
8630: 6c 74 2c 20 22 72 5b 50 32 5d 20 3d 20 28 25 73  lt, "r[P2] = (%s
8640: 29 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29  )", zSynopsis+3)
8650: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8670: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
8680: 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 69 66 20  Alt), zAlt, "if 
8690: 25 73 20 67 6f 74 6f 20 50 32 22 2c 20 7a 53 79  %s goto P2", zSy
86a0: 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20  nopsis+3);.     
86b0: 20 7d 0a 20 20 20 20 20 20 7a 53 79 6e 6f 70 73   }.      zSynops
86c0: 69 73 20 3d 20 7a 41 6c 74 3b 0a 20 20 20 20 7d  is = zAlt;.    }
86d0: 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30  .    for(ii=jj=0
86e0: 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20  ; jj<nTemp-1 && 
86f0: 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69  (c = zSynopsis[i
8700: 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20  i])!=0; ii++){. 
8710: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20       if( c=='P' 
8720: 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  ){.        c = z
8730: 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a  Synopsis[++ii];.
8740: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
8750: 34 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  4' ){.          
8760: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8770: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
8780: 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b  +jj, "%s", zP4);
8790: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
87a0: 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20  f( c=='X' ){.   
87b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
87c0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
87d0: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22  , zTemp+jj, "%s"
87e0: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
87f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e  ;.          seen
8800: 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Com = 1;.       
8810: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8820: 20 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73    int v1 = trans
8830: 6c 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20  lateP(c, pOp);. 
8840: 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b           int v2;
8850: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8860: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8870: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
8880: 22 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20  "%d", v1);.     
8890: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
88a0: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
88b0: 20 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a   "@P", 2)==0 ){.
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
88d0: 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 3;.           
88e0: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
88f0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
8900: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32  ;.            v2
8910: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53   = translateP(zS
8920: 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70  ynopsis[ii], pOp
8930: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
8940: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
8950: 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32  psis+ii+1,"+1",2
8960: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8970: 20 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20        ii += 2;. 
8980: 20 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b               v2+
8990: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
89a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
89b0: 20 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20   v2>1 ){.       
89c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
89d0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
89e0: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25  , zTemp+jj, "..%
89f0: 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20  d", v1+v2-1);.  
8a00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8a10: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8a20: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
8a30: 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20  s+ii+1, "..P3", 
8a40: 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33  4)==0 && pOp->p3
8a50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8a60: 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20     ii += 4;.    
8a70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8a80: 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20  }.        jj += 
8a90: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8aa0: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20  zTemp+jj);.     
8ab0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8ac0: 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b  zTemp[jj++] = c;
8ad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8ae0: 20 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20     if( !seenCom 
8af0: 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26  && jj<nTemp-5 &&
8b00: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29   pOp->zComment )
8b10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8b20: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
8b30: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20  j, zTemp+jj, "; 
8b40: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  %s", pOp->zComme
8b50: 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d  nt);.      jj +=
8b60: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
8b70: 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20  (zTemp+jj);.    
8b80: 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65  }.    if( jj<nTe
8b90: 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d  mp ) zTemp[jj] =
8ba0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
8bb0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
8bc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
8bd0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
8be0: 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  mp, "%s", pOp->z
8bf0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a  Comment);.    jj
8c00: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
8c10: 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c  30(zTemp);.  }el
8c20: 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d  se{.    zTemp[0]
8c30: 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30   = 0;.    jj = 0
8c40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
8c50: 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  j;.}.#endif /* S
8c60: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
8c70: 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59  #if VDBE_DISPLAY
8c80: 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53  _P4 && defined(S
8c90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
8ca0: 53 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a  SOR_HINTS)./*.**
8cb0: 20 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 50   Translate the P
8cc0: 34 2e 70 45 78 70 72 20 76 61 6c 75 65 20 66 6f  4.pExpr value fo
8cd0: 72 20 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69  r an OP_CursorHi
8ce0: 6e 74 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74  nt opcode into t
8cf0: 65 78 74 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20  ext.** that can 
8d00: 62 65 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20  be displayed in 
8d10: 74 68 65 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66  the P4 column of
8d20: 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e   EXPLAIN output.
8d30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8d40: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 53 74  displayP4Expr(St
8d50: 72 41 63 63 75 6d 20 2a 70 2c 20 45 78 70 72 20  rAccum *p, Expr 
8d60: 2a 70 45 78 70 72 29 7b 0a 20 20 63 6f 6e 73 74  *pExpr){.  const
8d70: 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a   char *zOp = 0;.
8d80: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
8d90: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
8da0: 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20  TK_STRING:.     
8db0: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
8dc0: 70 2c 20 22 25 51 22 2c 20 70 45 78 70 72 2d 3e  p, "%Q", pExpr->
8dd0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
8de0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8df0: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
8e00: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
8e10: 66 28 70 2c 20 22 25 64 22 2c 20 70 45 78 70 72  f(p, "%d", pExpr
8e20: 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20  ->u.iValue);.   
8e30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8e40: 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20  se TK_NULL:.    
8e50: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
8e60: 28 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  (p, "NULL");.   
8e70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8e80: 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
8e90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  {.      sqlite3X
8ea0: 50 72 69 6e 74 66 28 70 2c 20 22 72 5b 25 64 5d  Printf(p, "r[%d]
8eb0: 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ", pExpr->iTable
8ec0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8ed0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
8ee0: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
8ef0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
8f00: 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
8f10: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
8f20: 28 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20 20  (p, "rowid");.  
8f30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8f40: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
8f50: 66 28 70 2c 20 22 63 25 64 22 2c 20 28 69 6e 74  f(p, "c%d", (int
8f60: 29 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29  )pExpr->iColumn)
8f70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8f80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8f90: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20   case TK_LT:    
8fa0: 20 20 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20    zOp = "LT";   
8fb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8fc0: 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a  se TK_LE:      z
8fd0: 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 20  Op = "LE";      
8fe0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8ff0: 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70 20  TK_GT:      zOp 
9000: 3d 20 22 47 54 22 3b 20 20 20 20 20 20 62 72 65  = "GT";      bre
9010: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9020: 47 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  GE:      zOp = "
9030: 47 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  GE";      break;
9040: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
9050: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22        zOp = "NE"
9060: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9070: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20    case TK_EQ:   
9080: 20 20 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20     zOp = "EQ";  
9090: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
90a0: 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20  ase TK_IS:      
90b0: 7a 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20  zOp = "IS";     
90c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
90d0: 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70   TK_ISNOT:   zOp
90e0: 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20 20 62 72   = "ISNOT";   br
90f0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9100: 5f 41 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20  _AND:     zOp = 
9110: 22 41 4e 44 22 3b 20 20 20 20 20 62 72 65 61 6b  "AND";     break
9120: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  ;.    case TK_OR
9130: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52  :      zOp = "OR
9140: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
9150: 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
9160: 20 20 20 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b      zOp = "ADD";
9170: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9180: 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20  case TK_STAR:   
9190: 20 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20   zOp = "MUL";   
91a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
91b0: 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f  e TK_MINUS:   zO
91c0: 70 20 3d 20 22 53 55 42 22 3b 20 20 20 20 20 62  p = "SUB";     b
91d0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
91e0: 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d  K_REM:     zOp =
91f0: 20 22 52 45 4d 22 3b 20 20 20 20 20 62 72 65 61   "REM";     brea
9200: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
9210: 49 54 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42  ITAND:  zOp = "B
9220: 49 54 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a  ITAND";  break;.
9230: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
9240: 52 3a 20 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f  R:   zOp = "BITO
9250: 52 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  R";   break;.   
9260: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20   case TK_SLASH: 
9270: 20 20 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20 20    zOp = "DIV";  
9280: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9290: 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a  se TK_LSHIFT:  z
92a0: 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 20  Op = "LSHIFT";  
92b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
92c0: 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70 20  TK_RSHIFT:  zOp 
92d0: 3d 20 22 52 53 48 49 46 54 22 3b 20 20 62 72 65  = "RSHIFT";  bre
92e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
92f0: 43 4f 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22  CONCAT:  zOp = "
9300: 43 4f 4e 43 41 54 22 3b 20 20 62 72 65 61 6b 3b  CONCAT";  break;
9310: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
9320: 4e 55 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e  NUS:  zOp = "MIN
9330: 55 53 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  US";   break;.  
9340: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
9350: 20 20 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b     zOp = "PLUS";
9360: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9370: 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20  ase TK_BITNOT:  
9380: 7a 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20  zOp = "BITNOT"; 
9390: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
93a0: 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70   TK_NOT:     zOp
93b0: 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20 20 62 72   = "NOT";     br
93c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
93d0: 5f 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20  _ISNULL:  zOp = 
93e0: 22 49 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b  "ISNULL";  break
93f0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
9400: 54 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f  TNULL: zOp = "NO
9410: 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a  TNULL"; break;..
9420: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
9430: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9440: 66 28 70 2c 20 22 25 73 22 2c 20 22 65 78 70 72  f(p, "%s", "expr
9450: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
9460: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 4f 70 20  .  }..  if( zOp 
9470: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50  ){.    sqlite3XP
9480: 72 69 6e 74 66 28 70 2c 20 22 25 73 28 22 2c 20  rintf(p, "%s(", 
9490: 7a 4f 70 29 3b 0a 20 20 20 20 64 69 73 70 6c 61  zOp);.    displa
94a0: 79 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72  yP4Expr(p, pExpr
94b0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  ->pLeft);.    if
94c0: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
94d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
94e0: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
94f0: 2c 20 22 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20  , ",", 1);.     
9500: 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 70   displayP4Expr(p
9510: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
9520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
9530: 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
9540: 64 28 70 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  d(p, ")", 1);.  
9550: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44  }.}.#endif /* VD
9560: 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26  BE_DISPLAY_P4 &&
9570: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
9580: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
9590: 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69 66 20 56 44  NTS) */...#if VD
95a0: 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 0a 2f 2a  BE_DISPLAY_P4./*
95b0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  .** Compute a st
95c0: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
95d0: 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d  bes the P4 param
95e0: 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f  eter for an opco
95f0: 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70  de..** Use zTemp
9600: 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65   for any require
9610: 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  d temporary buff
9620: 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  er space..*/.sta
9630: 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61  tic char *displa
9640: 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61  yP4(Op *pOp, cha
9650: 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54  r *zTemp, int nT
9660: 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  emp){.  char *zP
9670: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 53 74 72  4 = zTemp;.  Str
9680: 41 63 63 75 6d 20 78 3b 0a 20 20 61 73 73 65 72  Accum x;.  asser
9690: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
96a0: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
96b0: 6d 49 6e 69 74 28 26 78 2c 20 30 2c 20 7a 54 65  mInit(&x, 0, zTe
96c0: 6d 70 2c 20 6e 54 65 6d 70 2c 20 30 29 3b 0a 20  mp, nTemp, 0);. 
96d0: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34   switch( pOp->p4
96e0: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
96f0: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20   P4_KEYINFO: {. 
9700: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
9710: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
9720: 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
9730: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73  eyInfo;.      as
9740: 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
9750: 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
9760: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
9770: 72 69 6e 74 66 28 26 78 2c 20 22 6b 28 25 64 22  rintf(&x, "k(%d"
9780: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
9790: 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ld);.      for(j
97a0: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
97b0: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
97c0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
97d0: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
97e0: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
97f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9800: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70  Coll = pColl ? p
9810: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22  Coll->zName : ""
9820: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  ;.        if( st
9830: 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e  rcmp(zColl, "BIN
9840: 41 52 59 22 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c  ARY")==0 ) zColl
9850: 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20 20   = "B";.        
9860: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
9870: 78 2c 20 22 2c 25 73 25 73 22 2c 20 70 4b 65 79  x, ",%s%s", pKey
9880: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
9890: 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20  [j] ? "-" : "", 
98a0: 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  zColl);.      }.
98b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
98c0: 41 63 63 75 6d 41 70 70 65 6e 64 28 26 78 2c 20  AccumAppend(&x, 
98d0: 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  ")", 1);.      b
98e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64  reak;.    }.#ifd
98f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
9900: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20  _CURSOR_HINTS.  
9910: 20 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20    case P4_EXPR: 
9920: 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79 50  {.      displayP
9930: 34 45 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e 70  4Expr(&x, pOp->p
9940: 34 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  4.pExpr);.      
9950: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
9960: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
9970: 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20  COLLSEQ: {.     
9980: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
9990: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b  = pOp->p4.pColl;
99a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
99b0: 72 69 6e 74 66 28 26 78 2c 20 22 28 25 2e 32 30  rintf(&x, "(%.20
99c0: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
99d0: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
99e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
99f0: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
9a00: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
9a10: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  f = pOp->p4.pFun
9a20: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
9a30: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 73 28  XPrintf(&x, "%s(
9a40: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
9a50: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
9a60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9a70: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53   }.#if defined(S
9a80: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
9a90: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
9aa0: 46 49 4c 45 29 0a 20 20 20 20 63 61 73 65 20 50  FILE).    case P
9ab0: 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20  4_FUNCCTX: {.   
9ac0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
9ad0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d   = pOp->p4.pCtx-
9ae0: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  >pFunc;.      sq
9af0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9b00: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
9b10: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
9b20: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
9b30: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
9b40: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
9b50: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
9b60: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 6c  3XPrintf(&x, "%l
9b70: 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49  ld", *pOp->p4.pI
9b80: 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  64);.      break
9b90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9ba0: 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20   P4_INT32: {.   
9bb0: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9bc0: 66 28 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d  f(&x, "%d", pOp-
9bd0: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
9be0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
9bf0: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
9c00: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
9c10: 6e 74 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c  ntf(&x, "%.16g",
9c20: 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29   *pOp->p4.pReal)
9c30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9c40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
9c50: 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65  _MEM: {.      Me
9c60: 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70  m *pMem = pOp->p
9c70: 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66  4.pMem;.      if
9c80: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
9c90: 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  MEM_Str ){.     
9ca0: 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a     zP4 = pMem->z
9cb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9cc0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
9cd0: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  MEM_Int ){.     
9ce0: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9cf0: 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 70 4d  f(&x, "%lld", pM
9d00: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20  em->u.i);.      
9d10: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
9d20: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
9d30: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9d40: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
9d50: 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e  %.16g", pMem->u.
9d60: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
9d70: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
9d80: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
9d90: 20 20 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c        zP4 = "NUL
9da0: 4c 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  L";.      }else{
9db0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9dc0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
9dd0: 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20  EM_Blob );.     
9de0: 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29     zP4 = "(blob)
9df0: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
9e00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
9e10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9e20: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
9e30: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a     case P4_VTAB:
9e40: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9e50: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70  _vtab *pVtab = p
9e60: 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56  Op->p4.pVtab->pV
9e70: 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tab;.      sqlit
9e80: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 76  e3XPrintf(&x, "v
9e90: 74 61 62 3a 25 70 22 2c 20 70 56 74 61 62 29 3b  tab:%p", pVtab);
9ea0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9eb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
9ec0: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
9ed0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a   {.      int i;.
9ee0: 20 20 20 20 20 20 69 6e 74 20 2a 61 69 20 3d 20        int *ai = 
9ef0: 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20  pOp->p4.ai;.    
9f00: 20 20 69 6e 74 20 6e 20 3d 20 61 69 5b 30 5d 3b    int n = ai[0];
9f10: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
9f20: 65 6c 65 6d 65 6e 74 20 6f 66 20 61 6e 20 49 4e  element of an IN
9f30: 54 41 52 52 41 59 20 69 73 20 61 6c 77 61 79 73  TARRAY is always
9f40: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
9f60: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
9f70: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 74  er of elements t
9f80: 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  o follow */.    
9f90: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20    for(i=1; i<n; 
9fa0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
9fb0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9fc0: 20 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29 3b 0a   ",%d", ai[i]);.
9fd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
9fe0: 65 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a 20 20  emp[0] = '[';.  
9ff0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
a000: 63 75 6d 41 70 70 65 6e 64 28 26 78 2c 20 22 5d  cumAppend(&x, "]
a010: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  ", 1);.      bre
a020: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a030: 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  se P4_SUBPROGRAM
a040: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
a050: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 70 72  3XPrintf(&x, "pr
a060: 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62  ogram");.      b
a070: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
a080: 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a  case P4_ADVANCE:
a090: 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30   {.      zTemp[0
a0a0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  ] = 0;.      bre
a0b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a0c0: 73 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a 20  se P4_TABLE: {. 
a0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
a0e0: 6e 74 66 28 26 78 2c 20 22 25 73 22 2c 20 70 4f  ntf(&x, "%s", pO
a0f0: 70 2d 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d  p->p4.pTab->zNam
a100: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
a110: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
a120: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20  lt: {.      zP4 
a130: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
a140: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b     if( zP4==0 ){
a150: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
a160: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
a170: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
a180: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
a190: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
a1a0: 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 61 73 73  inish(&x);.  ass
a1b0: 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20  ert( zP4!=0 );. 
a1c0: 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23   return zP4;.}.#
a1d0: 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49  endif /* VDBE_DI
a1e0: 53 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a  SPLAY_P4 */../*.
a1f0: 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68  ** Declare to th
a200: 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20  e Vdbe that the 
a210: 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20  BTree object at 
a220: 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73  db->aDb[i] is us
a230: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
a240: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
a250: 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  s need to know i
a260: 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f  n advance the co
a270: 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a  mplete set of.**
a280: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
a290: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ses that will be
a2a0: 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66   use.  A mask of
a2b0: 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73   these databases
a2c0: 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65  .** is maintaine
a2d0: 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  d in p->btreeMas
a2e0: 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d  k.  The p->lockM
a2f0: 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65  ask value is the
a300: 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d   subset of.** p-
a310: 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61  >btreeMask of da
a320: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
a330: 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b  l require a lock
a340: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a350: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56  3VdbeUsesBtree(V
a360: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
a370: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
a380: 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26  & i<p->db->nDb &
a390: 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  & i<(int)sizeof(
a3a0: 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  yDbMask)*8 );.  
a3b0: 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73  assert( i<(int)s
a3c0: 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61  izeof(p->btreeMa
a3d0: 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73  sk)*8 );.  DbMas
a3e0: 6b 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73  kSet(p->btreeMas
a3f0: 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d  k, i);.  if( i!=
a400: 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  1 && sqlite3Btre
a410: 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d  eSharable(p->db-
a420: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a  >aDb[i].pBt) ){.
a430: 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d      DbMaskSet(p-
a440: 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20  >lockMask, i);. 
a450: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
a460: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
a470: 48 41 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a  HARED_CACHE)./*.
a480: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
a490: 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70  compiled to supp
a4a0: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
a4b0: 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20   mode and to be 
a4c0: 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74  threadsafe,.** t
a4d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61  his routine obta
a4e0: 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73  ins the mutex as
a4f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
a500: 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75  ch BtShared stru
a510: 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61  cture.** that ma
a520: 79 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79  y be accessed by
a530: 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
a540: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
a550: 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c  n doing so it al
a560: 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42  so.** sets the B
a570: 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65  tShared.db membe
a580: 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65  r of each of the
a590: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
a5a0: 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a  ures, ensuring.*
a5b0: 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  * that the corre
a5c0: 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ct busy-handler 
a5d0: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
a5e0: 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e  ked if required.
a5f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  .**.** If SQLite
a600: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
a610: 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70  fe but does supp
a620: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
a630: 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73   mode, then.** s
a640: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
a650: 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  () is invoked to
a660: 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65   set the BtShare
a670: 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a  d.db variables.*
a680: 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68  * of all of BtSh
a690: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20  ared structures 
a6a0: 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74  accessible via t
a6b0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
a6c0: 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  le .** associate
a6d0: 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a  d with the VM..*
a6e0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
a6f0: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
a700: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75   and does not su
a710: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
a720: 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a  he mode, this.**
a730: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
a740: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
a750: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65  p->btreeMask fie
a760: 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  ld is a bitmask 
a770: 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68  of all btrees th
a780: 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20  at the prepared 
a790: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20  .** statement p 
a7a0: 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20  will ever use.  
a7b0: 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d  Let N be the num
a7c0: 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70  ber of bits in p
a7d0: 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63  ->btreeMask.** c
a7e0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
a7f0: 62 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20  btrees that use 
a800: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
a810: 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20  hen the runtime 
a820: 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  of.** this routi
a830: 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20  ne is N*N.  But 
a840: 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d  as N is rarely m
a850: 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73  ore than 1, this
a860: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62   should not.** b
a870: 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  e a problem..*/.
a880: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
a890: 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a  Enter(Vdbe *p){.
a8a0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
a8b0: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
a8c0: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
a8d0: 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  if( DbMaskAllZer
a8e0: 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29  o(p->lockMask) )
a8f0: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
a900: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
a910: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
a920: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20  aDb = db->aDb;. 
a930: 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a   nDb = db->nDb;.
a940: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62    for(i=0; i<nDb
a950: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
a960: 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65  i!=1 && DbMaskTe
a970: 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69  st(p->lockMask,i
a980: 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  ) && ALWAYS(aDb[
a990: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
a9a0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
a9b0: 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74  Enter(aDb[i].pBt
a9c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
a9d0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
a9e0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a9f0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
aa00: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
aa10: 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  FE>0./*.** Unloc
aa20: 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72  k all of the btr
aa30: 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  ees previously l
aa40: 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20  ocked by a call 
aa50: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  to sqlite3VdbeEn
aa60: 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ter()..*/.static
aa70: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
aa80: 20 76 6f 69 64 20 76 64 62 65 4c 65 61 76 65 28   void vdbeLeave(
aa90: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
aaa0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
aab0: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
aac0: 6e 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70  nt nDb;.  db = p
aad0: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
aae0: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
aaf0: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
ab00: 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a  0; i<nDb; i++){.
ab10: 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20      if( i!=1 && 
ab20: 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f  DbMaskTest(p->lo
ab30: 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57  ckMask,i) && ALW
ab40: 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d  AYS(aDb[i].pBt!=
ab50: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
ab60: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44  te3BtreeLeave(aD
ab70: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d  b[i].pBt);.    }
ab80: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
ab90: 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62  te3VdbeLeave(Vdb
aba0: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 44 62 4d  e *p){.  if( DbM
abb0: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f  askAllZero(p->lo
abc0: 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e  ckMask) ) return
abd0: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
abe0: 20 63 61 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c   case */.  vdbeL
abf0: 65 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69  eave(p);.}.#endi
ac00: 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56  f..#if defined(V
ac10: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
ac20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
ac30: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  EBUG)./*.** Prin
ac40: 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  t a single opcod
ac50: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
ac60: 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62   is used for deb
ac70: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
ac80: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
ac90: 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f  PrintOp(FILE *pO
aca0: 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a  ut, int pc, Op *
acb0: 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  pOp){.  char *zP
acc0: 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35  4;.  char zPtr[5
acd0: 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b  0];.  char zCom[
ace0: 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63  100];.  static c
acf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
ad00: 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73  at1 = "%4d %-13s
ad10: 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 31   %4d %4d %4d %-1
ad20: 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20  3s %.2X %s\n";. 
ad30: 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70   if( pOut==0 ) p
ad40: 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  Out = stdout;.  
ad50: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
ad60: 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f  pOp, zPtr, sizeo
ad70: 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65 66  f(zPtr));.#ifdef
ad80: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
ad90: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
ada0: 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74    displayComment
adb0: 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c  (pOp, zP4, zCom,
adc0: 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a   sizeof(zCom));.
add0: 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20  #else.  zCom[0] 
ade0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  = 0;.#endif.  /*
adf0: 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74 65   NB:  The sqlite
ae00: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66 75  3OpcodeName() fu
ae10: 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  nction is implem
ae20: 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63 72  ented by code cr
ae30: 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  eated.  ** by th
ae40: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
ae50: 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77  and mkopcodec.aw
ae60: 6b 20 73 63 72 69 70 74 73 20 77 68 69 63 68 20  k scripts which 
ae70: 65 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a 2a  extract the.  **
ae80: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
ae90: 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75  m the vdbe.c sou
aea0: 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66 70  rce text */.  fp
aeb0: 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72  rintf(pOut, zFor
aec0: 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20  mat1, pc, .     
aed0: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
aee0: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c  me(pOp->opcode),
aef0: 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
af00: 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c  2, pOp->p3, zP4,
af10: 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20   pOp->p5,.      
af20: 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75  zCom.  );.  fflu
af30: 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64  sh(pOut);.}.#end
af40: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  if../*.** Initia
af50: 6c 69 7a 65 20 61 6e 20 61 72 72 61 79 20 6f 66  lize an array of
af60: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e 0a   N Mem element..
af70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
af80: 6e 69 74 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20  nitMemArray(Mem 
af90: 2a 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c 69 74  *p, int N, sqlit
afa0: 65 33 20 2a 64 62 2c 20 75 31 36 20 66 6c 61 67  e3 *db, u16 flag
afb0: 73 29 7b 0a 20 20 77 68 69 6c 65 28 20 28 4e 2d  s){.  while( (N-
afc0: 2d 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 64  -)>0 ){.    p->d
afd0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 66  b = db;.    p->f
afe0: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
aff0: 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20    p->szMalloc = 
b000: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
b010: 5f 44 45 42 55 47 0a 20 20 20 20 70 2d 3e 70 53  _DEBUG.    p->pS
b020: 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23 65  copyFrom = 0;.#e
b030: 6e 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a 20 20  ndif.    p++;.  
b040: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  }.}../*.** Relea
b050: 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e  se an array of N
b060: 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f   Mem elements.*/
b070: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
b080: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d  easeMemArray(Mem
b090: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69   *p, int N){.  i
b0a0: 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20  f( p && N ){.   
b0b0: 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 5b   Mem *pEnd = &p[
b0c0: 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  N];.    sqlite3 
b0d0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  *db = p->db;.   
b0e0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
b0f0: 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64  Freed ){.      d
b100: 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  o{.        if( p
b110: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  ->szMalloc ) sql
b120: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
b130: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
b140: 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c    }while( (++p)<
b150: 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65  pEnd );.      re
b160: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
b170: 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  do{.      assert
b180: 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20  ( (&p[1])==pEnd 
b190: 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d  || p[0].db==p[1]
b1a0: 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73  .db );.      ass
b1b0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
b1c0: 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e  CheckMemInvarian
b1d0: 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20  ts(p) );..      
b1e0: 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73  /* This block is
b1f0: 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e   really an inlin
b200: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
b210: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
b220: 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74  ase().      ** t
b230: 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74  hat takes advant
b240: 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20  age of the fact 
b250: 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  that the memory 
b260: 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20  cell value is . 
b270: 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65       ** being se
b280: 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20  t to NULL after 
b290: 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79  releasing any dy
b2a0: 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e  namic resources.
b2b0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
b2c0: 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61  ** The justifica
b2d0: 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
b2e0: 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61  ting code is tha
b2f0: 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a  t according to .
b300: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69        ** callgri
b310: 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20  nd, this causes 
b320: 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63  a certain test c
b330: 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43  ase to hit the C
b340: 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a  PU 4.7 .      **
b350: 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78   percent less (x
b360: 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65  86 linux, gcc ve
b370: 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36  rsion 4.1.2, -O6
b380: 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20  ) than if .     
b390: 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65   ** sqlite3MemRe
b3a0: 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c  lease() were cal
b3b0: 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57  led from here. W
b3c0: 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75  ith -O2, this ju
b3d0: 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  mps.      ** to 
b3e0: 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65  6.6 percent. The
b3f0: 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e   test case is in
b400: 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77  serting 1000 row
b410: 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a  s into a table .
b420: 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f        ** with no
b430: 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61   indexes using a
b440: 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64   single prepared
b450: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
b460: 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20  t, bind() .     
b470: 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e   ** and reset().
b480: 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f   Inserts are gro
b490: 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e  uped into a tran
b4a0: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
b4b0: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
b4c0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
b4d0: 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65  _Agg );.      te
b4e0: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
b4f0: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20   & MEM_Dyn );.  
b500: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
b510: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61  >flags & MEM_Fra
b520: 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  me );.      test
b530: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
b540: 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20   MEM_RowSet );. 
b550: 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67       if( p->flag
b560: 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44  s&(MEM_Agg|MEM_D
b570: 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d  yn|MEM_Frame|MEM
b580: 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20  _RowSet) ){.    
b590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
b5a0: 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20  emRelease(p);.  
b5b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
b5c0: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  >szMalloc ){.   
b5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
b5e0: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
b5f0: 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  c);.        p->s
b600: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
b610: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66     }..      p->f
b620: 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
b630: 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ined;.    }while
b640: 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a  ( (++p)<pEnd );.
b650: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
b660: 65 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20  ete a VdbeFrame 
b670: 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63  object and its c
b680: 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61  ontents. VdbeFra
b690: 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a  me objects are.*
b6a0: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  * allocated by t
b6b0: 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70  he OP_Program op
b6c0: 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56  code in sqlite3V
b6d0: 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f  dbeExec()..*/.vo
b6e0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
b6f0: 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72  ameDelete(VdbeFr
b700: 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ame *p){.  int i
b710: 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20  ;.  Mem *aMem = 
b720: 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b  VdbeFrameMem(p);
b730: 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  .  VdbeCursor **
b740: 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72  apCsr = (VdbeCur
b750: 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e  sor **)&aMem[p->
b760: 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f  nChildMem];.  fo
b770: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69  r(i=0; i<p->nChi
b780: 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ldCsr; i++){.   
b790: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
b7a0: 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43  Cursor(p->v, apC
b7b0: 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  sr[i]);.  }.  re
b7c0: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d  leaseMemArray(aM
b7d0: 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d  em, p->nChildMem
b7e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
b7f0: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2d  DeleteAuxData(p-
b800: 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78  >v->db, &p->pAux
b810: 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  Data, -1, 0);.  
b820: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
b830: 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23  >v->db, p);.}..#
b840: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b850: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
b860: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
b870: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
b880: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
b890: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
b8a0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
b8b0: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
b8c0: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
b8d0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
b8e0: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
b8f0: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
b900: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
b910: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
b920: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
b930: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
b940: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
b950: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  IN"..**.** When 
b960: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65  p->explain==1, e
b970: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
b980: 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e  is listed.  When
b990: 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  .** p->explain==
b9a0: 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61  2, only OP_Expla
b9b0: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  in instructions 
b9c0: 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74  are listed and t
b9d0: 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77  hese.** are show
b9e0: 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n in a different
b9f0: 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70   format.  p->exp
ba00: 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20  lain==2 is used 
ba10: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
ba20: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
ba30: 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  AN..**.** When p
ba40: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69  ->explain==1, fi
ba50: 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  rst the main pro
ba60: 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20  gram is listed, 
ba70: 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20  then each of.** 
ba80: 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70  the trigger subp
ba90: 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74  rograms are list
baa0: 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a  ed one by one..*
bab0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
bac0: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bae0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
baf0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  /.){.  int nRow;
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bb20: 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75  top when row cou
bb30: 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20  nt reaches this 
bb40: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
bb50: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
bb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
bb70: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
bb80: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
bb90: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
bba0: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
bbb0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
bbc0: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
bbd0: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
bc00: 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79   cell hold array
bc10: 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a   of subprogs */.
bc20: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bc30: 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
bc40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
bc50: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
bc60: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
bc90: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
bca0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
bcb0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
bcc0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
bcd0: 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  code */.  Mem *p
bce0: 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Mem = &p->aMem[1
bcf0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
bd00: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
bd10: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
bd20: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
bd30: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
bd40: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
bd50: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
bd60: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
bd70: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
bd80: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
bd90: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
bda0: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
bdb0: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
bdc0: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
bdd0: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
bde0: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
bdf0: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
be00: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
be10: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
be20: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
be30: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
be40: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
be50: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
be60: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
be70: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
be80: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
be90: 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74  8);.  p->pResult
bea0: 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Set = 0;..  if( 
beb0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
bec0: 4d 45 4d 5f 42 4b 50 54 20 29 7b 0a 20 20 20 20  MEM_BKPT ){.    
bed0: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
bee0: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e  if a malloc() in
bef0: 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73  side a call to s
bf00: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
bf10: 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  xt() or.    ** s
bf20: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
bf30: 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20  xt16() failed.  
bf40: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  */.    sqlite3Oo
bf50: 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
bf60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
bf70: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  ROR;.  }..  /* W
bf80: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
bf90: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65  f output rows re
bfa0: 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74  aches nRow, that
bfb0: 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20   means the.  ** 
bfc0: 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69  listing has fini
bfd0: 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33  shed and sqlite3
bfe0: 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72  _step() should r
bff0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
c000: 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20  E..  ** nRow is 
c010: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
c020: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
c030: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
c040: 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65  m, plus.  ** the
c050: 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62   sum of the numb
c060: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c  er of rows in al
c070: 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  l trigger subpro
c080: 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65  grams encountere
c090: 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20  d.  ** so far.  
c0a0: 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77  The nRow value w
c0b0: 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20  ill increase as 
c0c0: 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62 70  new trigger subp
c0d0: 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a  rograms are.  **
c0e0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75   encountered, bu
c0f0: 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65  t p->pc will eve
c100: 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70  ntually catch up
c110: 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20   to nRow..  */. 
c120: 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a   nRow = p->nOp;.
c130: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
c140: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==1 ){.    /* Th
c150: 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79  e first 8 memory
c160: 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20   cells are used 
c170: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
c180: 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a  et.  So we will.
c190: 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65      ** commandee
c1a0: 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74  r the 9th cell t
c1b0: 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67 65  o use as storage
c1c0: 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66   for an array of
c1d0: 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a   pointers.    **
c1e0: 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62 70   to trigger subp
c1f0: 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44  rograms.  The VD
c200: 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  BE is guaranteed
c210: 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73   to have at leas
c220: 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73  t 9.    ** cells
c230: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
c240: 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20  ( p->nMem>9 );. 
c250: 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d     pSub = &p->aM
c260: 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70  em[9];.    if( p
c270: 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42  Sub->flags&MEM_B
c280: 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lob ){.      /* 
c290: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  On the first cal
c2a0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  l to sqlite3_ste
c2b0: 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68  p(), pSub will h
c2c0: 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20  old a NULL.  It 
c2d0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74  is.      ** init
c2e0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f  ialized to a BLO
c2f0: 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42 50  B by the P4_SUBP
c300: 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e  ROGRAM processin
c310: 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f  g logic below */
c320: 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53  .      nSub = pS
c330: 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62  ub->n/sizeof(Vdb
c340: 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62  e*);.      apSub
c350: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
c360: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d  *)pSub->z;.    }
c370: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
c380: 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSub; i++){.    
c390: 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b    nRow += apSub[
c3a0: 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20  i]->nOp;.    }. 
c3b0: 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20   }..  do{.    i 
c3c0: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
c3d0: 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70  ile( i<nRow && p
c3e0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20  ->explain==2 && 
c3f0: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
c400: 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a  !=OP_Explain );.
c410: 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b    if( i>=nRow ){
c420: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
c430: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
c440: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
c450: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31  }else if( db->u1
c460: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29  .isInterrupted )
c470: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
c480: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
c490: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c4a0: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
c4b0: 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 73  e3VdbeError(p, s
c4c0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
c4d0: 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rc));.  }else{. 
c4e0: 20 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20     char *zP4;.  
c4f0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69    Op *pOp;.    i
c500: 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20  f( i<p->nOp ){. 
c510: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70       /* The outp
c520: 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  ut line number i
c530: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74  s small enough t
c540: 68 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c  hat we are still
c550: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
c560: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a   main program. *
c570: 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70  /.      pOp = &p
c580: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65  ->aOp[i];.    }e
c590: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65  lse{.      /* We
c5a0: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c   are currently l
c5b0: 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61  isting subprogra
c5c0: 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20  ms.  Figure out 
c5d0: 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20  which one and.  
c5e0: 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74      ** pick up t
c5f0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f  he appropriate o
c600: 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20  pcode. */.      
c610: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d  int j;.      i -
c620: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  = p->nOp;.      
c630: 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75  for(j=0; i>=apSu
c640: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b  b[j]->nOp; j++){
c650: 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70  .        i -= ap
c660: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[j]->nOp;.   
c670: 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d     }.      pOp =
c680: 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b   &apSub[j]->aOp[
c690: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i];.    }.    if
c6a0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
c6b0: 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ){.      pMem->f
c6c0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
c6d0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
c6e0: 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  = i;            
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c700: 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63      /* Program c
c710: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
c720: 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20  pMem++;.  .     
c730: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
c740: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74  EM_Static|MEM_St
c750: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
c760: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
c770: 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  r*)sqlite3Opcode
c780: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
c790: 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a  ); /* Opcode */.
c7a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
c7b0: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
c7c0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
c7d0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
c7e0: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
c7f0: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
c800: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
c810: 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  +;..      /* Whe
c820: 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20  n an OP_Program 
c830: 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e  opcode is encoun
c840: 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70  ter (the only op
c850: 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20  code that has.  
c860: 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50      ** a P4_SUBP
c870: 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29  ROGRAM argument)
c880: 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a  , expand the siz
c890: 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f  e of the array o
c8a0: 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20  f subprograms.  
c8b0: 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70      ** kept in p
c8c0: 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68  ->aMem[9].z to h
c8d0: 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67  old the new prog
c8e0: 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74  ram - assuming t
c8f0: 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20  his subprogram. 
c900: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20       ** has not 
c910: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65  already been see
c920: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
c930: 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
c940: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
c950: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
c960: 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29  nByte = (nSub+1)
c970: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72  *sizeof(SubProgr
c980: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  am*);.        in
c990: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
c9a0: 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b  (j=0; j<nSub; j+
c9b0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
c9c0: 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d  ( apSub[j]==pOp-
c9d0: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
c9e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
c9f0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e          if( j==n
ca00: 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  Sub && SQLITE_OK
ca10: 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ==sqlite3VdbeMem
ca20: 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65  Grow(pSub, nByte
ca30: 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20 20  , nSub!=0) ){.  
ca40: 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20          apSub = 
ca50: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
ca60: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20  Sub->z;.        
ca70: 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20    apSub[nSub++] 
ca80: 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  = pOp->p4.pProgr
ca90: 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  am;.          pS
caa0: 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ub->flags |= MEM
cab0: 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20  _Blob;.         
cac0: 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a   pSub->n = nSub*
cad0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
cae0: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  m*);.        }. 
caf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
cb00: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
cb10: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
cb20: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
cb30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cb40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
cb50: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a   */.    pMem++;.
cb60: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
cb70: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
cb80: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
cb90: 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p2;            
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cbb0: 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b   P2 */.    pMem+
cbc0: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
cbd0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
cbe0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
cbf0: 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20  Op->p3;         
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc10: 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d   /* P3 */.    pM
cc20: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73  em++;..    if( s
cc30: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
cc40: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
cc50: 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34 20  , 100) ){ /* P4 
cc60: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
cc70: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
cc80: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
cc90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
cca0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  R;.    }.    pMe
ccb0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
ccc0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
ccd0: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
cce0: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70  (pOp, pMem->z, p
ccf0: 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a  Mem->szMalloc);.
cd00: 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65      if( zP4!=pMe
cd10: 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 70 4d  m->z ){.      pM
cd20: 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  em->n = 0;.     
cd30: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
cd40: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c  etStr(pMem, zP4,
cd50: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
cd60: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
cd70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cd80: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
cd90: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
cda0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
cdb0: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
cdc0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
cdd0: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
cde0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
cdf0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
ce00: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
ce10: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
ce20: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34  ndResize(pMem, 4
ce30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
ce40: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
ce50: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
ce60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ce70: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
ce80: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
ce90: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
cea0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
ceb0: 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20  m->n = 2;.      
cec0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
ced0: 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e  (3, pMem->z, "%.
cee0: 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20  2x", pOp->p5);  
cef0: 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20   /* P5 */.      
cf00: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
cf10: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
cf20: 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66  Mem++;.  .#ifdef
cf30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
cf40: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
cf50: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
cf60: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
cf70: 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30  Resize(pMem, 500
cf80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
cf90: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
cfa0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
cfb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
cfc0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
cfd0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
cfe0: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
cff0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
d000: 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f  m->n = displayCo
d010: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
d020: 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20  pMem->z, 500);. 
d030: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
d040: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
d050: 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  lse.      pMem->
d060: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
d070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d080: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65          /* Comme
d090: 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  nt */.#endif.   
d0a0: 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43   }..    p->nResC
d0b0: 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70  olumn = 8 - 4*(p
d0c0: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
d0d0: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
d0e0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20  = &p->aMem[1];. 
d0f0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
d100: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
d110: 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20  QLITE_ROW;.  }. 
d120: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
d130: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d140: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
d150: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
d160: 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
d170: 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73  the SQL that was
d180: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
d190: 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  e a VDBE program
d1a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d1b0: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64  3VdbePrintSql(Vd
d1c0: 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20  be *p){.  const 
d1d0: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69  char *z = 0;.  i
d1e0: 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20  f( p->zSql ){.  
d1f0: 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20    z = p->zSql;. 
d200: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f   }else if( p->nO
d210: 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73  p>=1 ){.    cons
d220: 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20  t VdbeOp *pOp = 
d230: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20  &p->aOp[0];.    
d240: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
d250: 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d  =OP_Init && pOp-
d260: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
d270: 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b    z = pOp->p4.z;
d280: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71  .      while( sq
d290: 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29  lite3Isspace(*z)
d2a0: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) z++;.    }.  
d2b0: 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e  }.  if( z ) prin
d2c0: 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  tf("SQL: [%s]\n"
d2d0: 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  , z);.}.#endif..
d2e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
d2f0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
d300: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
d310: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
d320: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e  )./*.** Print an
d330: 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65   IOTRACE message
d340: 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e   showing SQL con
d350: 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tent..*/.void sq
d360: 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65  lite3VdbeIOTrace
d370: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
d380: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
d390: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
d3a0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f  .  if( sqlite3Io
d3b0: 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Trace==0 ) retur
d3c0: 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29  n;.  if( nOp<1 )
d3d0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
d3e0: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69   &p->aOp[0];.  i
d3f0: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
d400: 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e  OP_Init && pOp->
d410: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69  p4.z!=0 ){.    i
d420: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61  nt i, j;.    cha
d430: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73  r z[1000];.    s
d440: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
d450: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
d460: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  s", pOp->p4.z);.
d470: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c      for(i=0; sql
d480: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
d490: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f  ); i++){}.    fo
d4a0: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(j=0; z[i]; i++
d4b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
d4c0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
d4d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
d4e0: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
d4f0: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
d500: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
d510: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
d520: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
d530: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
d540: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
d550: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54  ;.    sqlite3IoT
d560: 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c  race("SQL %s\n",
d570: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
d580: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
d590: 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54  T_TRACE && SQLIT
d5a0: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
d5b0: 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61   */../* An insta
d5c0: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
d5d0: 63 74 20 64 65 73 63 72 69 62 65 73 20 62 75 6c  ct describes bul
d5e0: 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62  k memory availab
d5f0: 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20 62 79  le for use.** by
d600: 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f   subcomponents o
d610: 66 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  f a prepared sta
d620: 74 65 6d 65 6e 74 2e 20 20 53 70 61 63 65 20 69  tement.  Space i
d630: 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 75 74 0a  s allocated out.
d640: 2a 2a 20 6f 66 20 61 20 52 65 75 73 61 62 6c 65  ** of a Reusable
d650: 53 70 61 63 65 20 6f 62 6a 65 63 74 20 62 79 20  Space object by 
d660: 74 68 65 20 61 6c 6c 6f 63 53 70 61 63 65 28 29  the allocSpace()
d670: 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77 2e 0a   routine below..
d680: 2a 2f 0a 73 74 72 75 63 74 20 52 65 75 73 61 62  */.struct Reusab
d690: 6c 65 53 70 61 63 65 20 7b 0a 20 20 75 38 20 2a  leSpace {.  u8 *
d6a0: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
d6b0: 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d 65   /* Available me
d6c0: 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  mory */.  int nF
d6d0: 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ree;           /
d6e0: 2a 20 42 79 74 65 73 20 6f 66 20 61 76 61 69 6c  * Bytes of avail
d6f0: 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  able memory */. 
d700: 20 69 6e 74 20 6e 4e 65 65 64 65 64 3b 20 20 20   int nNeeded;   
d710: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 62        /* Total b
d720: 79 74 65 73 20 74 68 61 74 20 63 6f 75 6c 64 20  ytes that could 
d730: 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  not be allocated
d740: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74   */.};../* Try t
d750: 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  o allocate nByte
d760: 20 62 79 74 65 73 20 6f 66 20 38 2d 62 79 74 65   bytes of 8-byte
d770: 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b 20 6d 65   aligned bulk me
d780: 6d 6f 72 79 20 66 6f 72 20 70 42 75 66 0a 2a 2a  mory for pBuf.**
d790: 20 66 72 6f 6d 20 74 68 65 20 52 65 75 73 61 62   from the Reusab
d7a0: 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2e 20  leSpace object. 
d7b0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
d7c0: 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
d7d0: 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20  ed.** memory on 
d7e0: 73 75 63 63 65 73 73 2e 20 20 49 66 20 69 6e 73  success.  If ins
d7f0: 75 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f 72 79  ufficient memory
d800: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
d810: 20 74 68 65 0a 2a 2a 20 52 65 75 73 61 62 6c 65   the.** Reusable
d820: 53 70 61 63 65 20 6f 62 6a 65 63 74 2c 20 69 6e  Space object, in
d830: 63 72 65 61 73 65 20 74 68 65 20 52 65 75 73 61  crease the Reusa
d840: 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65 64 65 64  bleSpace.nNeeded
d850: 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20 74 68 65  .** value by the
d860: 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65 64 20 61   amount needed a
d870: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
d880: 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66 20 69 73  **.** If pBuf is
d890: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20 4e   not initially N
d8a0: 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ULL, that means 
d8b0: 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  that the memory 
d8c0: 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
d8d0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  een allocated by
d8e0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
d8f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 73   this routine, s
d900: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20  o just return a 
d910: 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 75 66 20  copy.** of pBuf 
d920: 61 6e 64 20 6c 65 61 76 65 20 52 65 75 73 61 62  and leave Reusab
d930: 6c 65 53 70 61 63 65 20 75 6e 63 68 61 6e 67 65  leSpace unchange
d940: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c  d..**.** This al
d950: 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d 70 6c 6f  locator is emplo
d960: 79 65 64 20 74 6f 20 72 65 70 75 72 70 6f 73 65  yed to repurpose
d970: 20 75 6e 75 73 65 64 20 73 6c 6f 74 73 20 61 74   unused slots at
d980: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
d990: 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  ** opcode array 
d9a0: 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74  of prepared stat
d9b0: 65 20 66 6f 72 20 6f 74 68 65 72 20 6d 65 6d 6f  e for other memo
d9c0: 72 79 20 6e 65 65 64 73 20 6f 66 20 74 68 65 20  ry needs of the 
d9d0: 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74  prepared.** stat
d9e0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
d9f0: 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63   void *allocSpac
da00: 65 28 0a 20 20 73 74 72 75 63 74 20 52 65 75 73  e(.  struct Reus
da10: 61 62 6c 65 53 70 61 63 65 20 2a 70 2c 20 20 2f  ableSpace *p,  /
da20: 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76  * Bulk memory av
da30: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f  ailable for allo
da40: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  cation */.  void
da50: 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
da60: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
da70: 20 74 6f 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f   to a prior allo
da80: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  cation */.  int 
da90: 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20  nByte           
daa0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
dab0: 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20  f memory needed 
dac0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
dad0: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
dae0: 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63 65 29 20  MENT(p->pSpace) 
daf0: 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30  );.  if( pBuf==0
db00: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
db10: 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20  ROUND8(nByte);. 
db20: 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c 3d 20     if( nByte <= 
db30: 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  p->nFree ){.    
db40: 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42    p->nFree -= nB
db50: 79 74 65 3b 0a 20 20 20 20 20 20 70 42 75 66 20  yte;.      pBuf 
db60: 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b 70 2d 3e  = &p->pSpace[p->
db70: 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d 65 6c 73  nFree];.    }els
db80: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4e 65 65  e{.      p->nNee
db90: 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  ded += nByte;.  
dba0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
dbb0: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
dbc0: 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29 3b 0a  GNMENT(pBuf) );.
dbd0: 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d    return pBuf;.}
dbe0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74  ../*.** Rewind t
dbf0: 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20  he VDBE back to 
dc00: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e  the beginning in
dc10: 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72   preparation for
dc20: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a  .** running it..
dc30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
dc40: 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a  dbeRewind(Vdbe *
dc50: 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  p){.#if defined(
dc60: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
dc70: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
dc80: 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a  OFILE).  int i;.
dc90: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
dca0: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
dcb0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
dcc0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 7c 7c 20  E_MAGIC_INIT || 
dcd0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
dce0: 41 47 49 43 5f 52 45 53 45 54 20 29 3b 0a 0a 20  AGIC_RESET );.. 
dcf0: 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64   /* There should
dd00: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
dd10: 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20   opcode..  */.  
dd20: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
dd30: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
dd40: 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f  e magic to VDBE_
dd50: 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72  MAGIC_RUN sooner
dd60: 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
dd70: 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69  er. */.  p->magi
dd80: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
dd90: 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  UN;..#ifdef SQLI
dda0: 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69  TE_DEBUG.  for(i
ddb0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69  =0; i<p->nMem; i
ddc0: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
ddd0: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d   p->aMem[i].db==
dde0: 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e  p->db );.  }.#en
ddf0: 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31  dif.  p->pc = -1
de00: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
de10: 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f  TE_OK;.  p->erro
de20: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
de30: 72 74 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65  rt;.  p->nChange
de40: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
de50: 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69  Ctr = 1;.  p->mi
de60: 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74  nWriteFileFormat
de70: 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74   = 255;.  p->iSt
de80: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70  atement = 0;.  p
de90: 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20  ->nFkConstraint 
dea0: 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45  = 0;.#ifdef VDBE
deb0: 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69  _PROFILE.  for(i
dec0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
ded0: 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69  +){.    p->aOp[i
dee0: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  ].cnt = 0;.    p
def0: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20  ->aOp[i].cycles 
df00: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
df10: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
df20: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
df30: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
df40: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
df50: 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65  ime after.** cre
df60: 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61  ating the virtua
df70: 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73  l machine.  This
df80: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73   involves things
df90: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f   such.** as allo
dfa0: 63 61 74 69 6e 67 20 72 65 67 69 73 74 65 72 73  cating registers
dfb0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
dfc0: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
dfd0: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
dfe0: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
dff0: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
e000: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
e010: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
e020: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
e030: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
e040: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e050: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78  may be called ex
e060: 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61  actly once on ea
e070: 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ch virtual machi
e080: 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  ne..** After thi
e090: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e0a0: 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  led the VM has b
e0b0: 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61  een "packaged" a
e0c0: 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74  nd is ready.** t
e0d0: 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68  o run.  After th
e0e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e0f0: 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63 61  lled, further ca
e100: 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  lls to .** sqlit
e110: 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75  e3VdbeAddOp() fu
e120: 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68  nctions are proh
e130: 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f  ibited.  This ro
e140: 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74  utine disconnect
e150: 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72  s.** the Vdbe fr
e160: 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  om the Parse obj
e170: 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20  ect that helped 
e180: 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74  generate it so t
e190: 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56  hat the.** the V
e1a0: 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69  dbe becomes an i
e1b0: 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74  ndependent entit
e1c0: 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20  y and the Parse 
e1d0: 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a  object can be.**
e1e0: 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a   destroyed..**.*
e1f0: 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65  * Use the sqlite
e200: 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72  3VdbeRewind() pr
e210: 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f  ocedure to resto
e220: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
e230: 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  hine back.** to 
e240: 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74  its initial stat
e250: 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62  e after it has b
e260: 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64  een run..*/.void
e270: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
e280: 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70  Ready(.  Vdbe *p
e290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e2a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
e2b0: 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  DBE */.  Parse *
e2c0: 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20  pParse          
e2d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e2e0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  ng context */.){
e2f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
e320: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
e330: 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20    int nVar;     
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
e360: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e  rameters */.  in
e370: 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  t nMem;         
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e390: 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d  Number of VM mem
e3a0: 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f  ory registers */
e3b0: 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20  .  int nCursor; 
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
e3e0: 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20  ursors required 
e3f0: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  */.  int nArg;  
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e420: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75   arguments in su
e430: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
e440: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
e450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e460: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
e470: 0a 20 20 73 74 72 75 63 74 20 52 65 75 73 61 62  .  struct Reusab
e480: 6c 65 53 70 61 63 65 20 78 3b 20 20 20 20 20 20  leSpace x;      
e490: 20 20 2f 2a 20 52 65 75 73 61 62 6c 65 20 62 75    /* Reusable bu
e4a0: 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20  lk memory */..  
e4b0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
e4c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
e4d0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
e4e0: 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
e4f0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
e500: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
e510: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
e520: 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20  arse==p->pParse 
e530: 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
e540: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
e550: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
e560: 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73  ;.  nVar = pPars
e570: 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20  e->nVar;.  nMem 
e580: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
e590: 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72    nCursor = pPar
e5a0: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67  se->nTab;.  nArg
e5b0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41   = pParse->nMaxA
e5c0: 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 45 61 63 68  rg;.  .  /* Each
e5d0: 20 63 75 72 73 6f 72 20 75 73 65 73 20 61 20 6d   cursor uses a m
e5e0: 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20 54 68 65  emory cell.  The
e5f0: 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 28 63   first cursor (c
e600: 75 72 73 6f 72 20 30 29 20 63 61 6e 0a 20 20 2a  ursor 0) can.  *
e610: 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d 20 77 68  * use aMem[0] wh
e620: 69 63 68 20 69 73 20 6e 6f 74 20 6f 74 68 65 72  ich is not other
e630: 77 69 73 65 20 75 73 65 64 20 62 79 20 74 68 65  wise used by the
e640: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20   VDBE program.  
e650: 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70  Allocate.  ** sp
e660: 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
e670: 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20 63 75 72  f aMem[] for cur
e680: 73 6f 72 73 20 31 20 61 6e 64 20 67 72 65 61 74  sors 1 and great
e690: 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73  er..  ** See als
e6a0: 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f  o: allocateCurso
e6b0: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d  r()..  */.  nMem
e6c0: 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 69   += nCursor;.  i
e6d0: 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30 20 26 26  f( nCursor==0 &&
e6e0: 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b   nMem>0 ) nMem++
e6f0: 3b 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20  ;  /* Space for 
e700: 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20 69 66 20  aMem[0] even if 
e710: 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f  not used */..  /
e720: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
e730: 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65 20 6d   much reusable m
e740: 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62  emory is availab
e750: 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  le at the end of
e760: 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65   the.  ** opcode
e770: 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 65 78   array.  This ex
e780: 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  tra memory will 
e790: 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 66  be reallocated f
e7a0: 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74  or other element
e7b0: 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72  s.  ** of the pr
e7c0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
e7d0: 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55  ..  */.  n = ROU
e7e0: 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70  ND8(sizeof(Op)*p
e7f0: 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 20 20  ->nOp);         
e800: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
e810: 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75   opcode memory u
e820: 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63  sed */.  x.pSpac
e830: 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f  e = &((u8*)p->aO
e840: 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 20  p)[n];          
e850: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f       /* Unused o
e860: 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  pcode memory */.
e870: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
e880: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78  BYTE_ALIGNMENT(x
e890: 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 78 2e  .pSpace) );.  x.
e8a0: 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57  nFree = ROUNDDOW
e8b0: 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41  N8(pParse->szOpA
e8c0: 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42  lloc - n);  /* B
e8d0: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 6d  ytes of unused m
e8e0: 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72  emory */.  asser
e8f0: 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b  t( x.nFree>=0 );
e900: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
e910: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
e920: 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e 46 72 65  &x.pSpace[x.nFre
e930: 65 5d 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76  e]) );..  resolv
e940: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41  eP2Values(p, &nA
e950: 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74  rg);.  p->usesSt
e960: 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  mtJournal = (u8)
e970: 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69  (pParse->isMulti
e980: 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d  Write && pParse-
e990: 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66  >mayAbort);.  if
e9a0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
e9b0: 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a  n && nMem<10 ){.
e9c0: 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20      nMem = 10;. 
e9d0: 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20   }.  p->expired 
e9e0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72  = 0;..  /* Memor
e9f0: 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c  y for registers,
ea00: 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72   parameters, cur
ea10: 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c  sor, etc, is all
ea20: 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72  ocated in one or
ea30: 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73   two.  ** passes
ea40: 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  .  On the first 
ea50: 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20  pass, we try to 
ea60: 72 65 75 73 65 20 75 6e 75 73 65 64 20 6d 65 6d  reuse unused mem
ea70: 6f 72 79 20 61 74 20 74 68 65 20 0a 20 20 2a 2a  ory at the .  **
ea80: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
ea90: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
eaa0: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
eab0: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
eac0: 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65  y.  ** requireme
ead0: 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74  nts by reusing t
eae0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
eaf0: 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73  tail, then the s
eb00: 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20  econd.  ** pass 
eb10: 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65  will fill in the
eb20: 20 72 65 6d 61 69 6e 64 65 72 20 75 73 69 6e 67   remainder using
eb30: 20 61 20 66 72 65 73 68 20 6d 65 6d 6f 72 79 20   a fresh memory 
eb40: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20  allocation.  .  
eb50: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f  **.  ** This two
eb60: 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74  -pass approach t
eb70: 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75  hat reuses as mu
eb80: 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
eb90: 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20  sible from.  ** 
eba0: 74 68 65 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d  the leftover mem
ebb0: 6f 72 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ory at the end o
ebc0: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
ebd0: 61 79 2e 20 20 54 68 69 73 20 63 61 6e 20 73 69  ay.  This can si
ebe0: 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
ebf0: 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75   reduce the amou
ec00: 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c  nt of memory hel
ec10: 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20  d by a prepared 
ec20: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
ec30: 20 20 64 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e 65    do {.    x.nNe
ec40: 65 64 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 2d  eded = 0;.    p-
ec50: 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61  >aMem = allocSpa
ec60: 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20  ce(&x, p->aMem, 
ec70: 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
ec80: 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d  );.    p->aVar =
ec90: 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
eca0: 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69  p->aVar, nVar*si
ecb0: 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20  zeof(Mem));.    
ecc0: 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63  p->apArg = alloc
ecd0: 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 41  Space(&x, p->apA
ece0: 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28  rg, nArg*sizeof(
ecf0: 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 70 2d 3e 61  Mem*));.    p->a
ed00: 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pCsr = allocSpac
ed10: 65 28 26 78 2c 20 70 2d 3e 61 70 43 73 72 2c 20  e(&x, p->apCsr, 
ed20: 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56  nCursor*sizeof(V
ed30: 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69  dbeCursor*));.#i
ed40: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ed50: 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
ed60: 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65 63  US.    p->anExec
ed70: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
ed80: 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e  , p->anExec, p->
ed90: 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29  nOp*sizeof(i64))
eda0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
edb0: 20 78 2e 6e 4e 65 65 64 65 64 3d 3d 30 20 29 20   x.nNeeded==0 ) 
edc0: 62 72 65 61 6b 3b 0a 20 20 20 20 78 2e 70 53 70  break;.    x.pSp
edd0: 61 63 65 20 3d 20 70 2d 3e 70 46 72 65 65 20 3d  ace = p->pFree =
ede0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
edf0: 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65 65  RawNN(db, x.nNee
ee00: 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72 65  ded);.    x.nFre
ee10: 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a 20  e = x.nNeeded;. 
ee20: 20 7d 77 68 69 6c 65 28 20 21 64 62 2d 3e 6d 61   }while( !db->ma
ee30: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
ee40: 20 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70 50 61   p->pVList = pPa
ee50: 72 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20 20 70  rse->pVList;.  p
ee60: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20  Parse->pVList = 
ee70: 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e   0;.  p->explain
ee80: 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61   = pParse->expla
ee90: 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  in;.  if( db->ma
eea0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
eeb0: 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20    p->nVar = 0;. 
eec0: 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20     p->nCursor = 
eed0: 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  0;.    p->nMem =
eee0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
eef0: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43   p->nCursor = nC
ef00: 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e 56  ursor;.    p->nV
ef10: 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72  ar = (ynVar)nVar
ef20: 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72  ;.    initMemArr
ef30: 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72  ay(p->aVar, nVar
ef40: 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  , db, MEM_Null);
ef50: 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e  .    p->nMem = n
ef60: 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d  Mem;.    initMem
ef70: 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 6e  Array(p->aMem, n
ef80: 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e 64  Mem, db, MEM_Und
ef90: 65 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d 65 6d  efined);.    mem
efa0: 73 65 74 28 70 2d 3e 61 70 43 73 72 2c 20 30 2c  set(p->apCsr, 0,
efb0: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
efc0: 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23  VdbeCursor*));.#
efd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
efe0: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
eff0: 54 55 53 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  TUS.    memset(p
f000: 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70 2d 3e  ->anExec, 0, p->
f010: 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29  nOp*sizeof(i64))
f020: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  ;.#endif.  }.  s
f030: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
f040: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  (p);.}../*.** Cl
f050: 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f  ose a VDBE curso
f060: 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c  r and release al
f070: 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  l the resources 
f080: 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20  that cursor .** 
f090: 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e  happens to hold.
f0a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f0b0: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56  VdbeFreeCursor(V
f0c0: 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73  dbe *p, VdbeCurs
f0d0: 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20  or *pCx){.  if( 
f0e0: 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pCx==0 ){.    re
f0f0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
f100: 72 74 28 20 70 43 78 2d 3e 70 42 74 78 3d 3d 30  rt( pCx->pBtx==0
f110: 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79 70   || pCx->eCurTyp
f120: 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
f130: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 43   );.  switch( pC
f140: 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a 20  x->eCurType ){. 
f150: 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f     case CURTYPE_
f160: 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  SORTER: {.      
f170: 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
f180: 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43  rClose(p->db, pC
f190: 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
f1a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f1b0: 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20 7b  CURTYPE_BTREE: {
f1c0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 78 2d 3e  .      if( pCx->
f1d0: 70 42 74 78 20 29 7b 0a 20 20 20 20 20 20 20 20  pBtx ){.        
f1e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
f1f0: 65 28 70 43 78 2d 3e 70 42 74 78 29 3b 0a 20 20  e(pCx->pBtx);.  
f200: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78        /* The pCx
f210: 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62  ->pCursor will b
f220: 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69  e close automati
f230: 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69  cally, if it exi
f240: 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20 20  sts, by.        
f250: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  ** the call abov
f260: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  e. */.      }els
f270: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
f280: 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73  t( pCx->uc.pCurs
f290: 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  or!=0 );.       
f2a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
f2b0: 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75 63  seCursor(pCx->uc
f2c0: 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .pCursor);.     
f2d0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f2e0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
f2f0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
f300: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
f310: 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a  CURTYPE_VTAB: {.
f320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74        sqlite3_vt
f330: 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72  ab_cursor *pVCur
f340: 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75 72   = pCx->uc.pVCur
f350: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71  ;.      const sq
f360: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
f370: 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70  odule = pVCur->p
f380: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
f390: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 56 43       assert( pVC
f3a0: 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e  ur->pVtab->nRef>
f3b0: 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75 72  0 );.      pVCur
f3c0: 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b  ->pVtab->nRef--;
f3d0: 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e  .      pModule->
f3e0: 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20  xClose(pVCur);. 
f3f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f400: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
f410: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
f420: 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63  cursors in the c
f430: 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f  urrent frame..*/
f440: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
f450: 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65  seCursorsInFrame
f460: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
f470: 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20   p->apCsr ){.   
f480: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
f490: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
f4a0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56  r; i++){.      V
f4b0: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20  dbeCursor *pC = 
f4c0: 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20  p->apCsr[i];.   
f4d0: 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20     if( pC ){.   
f4e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f4f0: 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43  FreeCursor(p, pC
f500: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
f510: 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Csr[i] = 0;.    
f520: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
f530: 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
f540: 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
f550: 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73   the VdbeFrame s
f560: 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
f570: 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73  Vdbe. This.** is
f580: 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70   used, for examp
f590: 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67  le, when a trigg
f5a0: 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69  er sub-program i
f5b0: 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74  s halted to rest
f5c0: 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74  ore.** control t
f5d0: 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  o the main progr
f5e0: 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  am..*/.int sqlit
f5f0: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
f600: 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46  re(VdbeFrame *pF
f610: 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  rame){.  Vdbe *v
f620: 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20   = pFrame->v;.  
f630: 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72  closeCursorsInFr
f640: 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53  ame(v);.#ifdef S
f650: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
f660: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76  T_SCANSTATUS.  v
f670: 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d  ->anExec = pFram
f680: 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69  e->anExec;.#endi
f690: 66 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72  f.  v->aOp = pFr
f6a0: 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e  ame->aOp;.  v->n
f6b0: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70  Op = pFrame->nOp
f6c0: 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46  ;.  v->aMem = pF
f6d0: 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d  rame->aMem;.  v-
f6e0: 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >nMem = pFrame->
f6f0: 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72  nMem;.  v->apCsr
f700: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72   = pFrame->apCsr
f710: 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d  ;.  v->nCursor =
f720: 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72   pFrame->nCursor
f730: 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52  ;.  v->db->lastR
f740: 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c  owid = pFrame->l
f750: 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e  astRowid;.  v->n
f760: 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
f770: 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64  >nChange;.  v->d
f780: 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  b->nChange = pFr
f790: 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a  ame->nDbChange;.
f7a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
f7b0: 65 74 65 41 75 78 44 61 74 61 28 76 2d 3e 64 62  eteAuxData(v->db
f7c0: 2c 20 26 76 2d 3e 70 41 75 78 44 61 74 61 2c 20  , &v->pAuxData, 
f7d0: 2d 31 2c 20 30 29 3b 0a 20 20 76 2d 3e 70 41 75  -1, 0);.  v->pAu
f7e0: 78 44 61 74 61 20 3d 20 70 46 72 61 6d 65 2d 3e  xData = pFrame->
f7f0: 70 41 75 78 44 61 74 61 3b 0a 20 20 70 46 72 61  pAuxData;.  pFra
f800: 6d 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 30  me->pAuxData = 0
f810: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
f820: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
f830: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
f840: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
f850: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
f860: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
f870: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
f880: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
f890: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
f8a0: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
f8b0: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
f8c0: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
f8d0: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
f8e0: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
f8f0: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
f900: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
f910: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
f920: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
f930: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
f940: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
f950: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
f960: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
f970: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
f980: 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  e;.    for(pFram
f990: 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
f9a0: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46  ame->pParent; pF
f9b0: 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
f9c0: 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rent);.    sqlit
f9d0: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
f9e0: 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20  re(pFrame);.    
f9f0: 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20  p->pFrame = 0;. 
fa00: 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30     p->nFrame = 0
fa10: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
fa20: 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a  p->nFrame==0 );.
fa30: 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e    closeCursorsIn
fa40: 46 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20  Frame(p);.  if( 
fa50: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72  p->aMem ){.    r
fa60: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
fa70: 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29  ->aMem, p->nMem)
fa80: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
fa90: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20  ->pDelFrame ){. 
faa0: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44     VdbeFrame *pD
fab0: 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d  el = p->pDelFram
fac0: 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72  e;.    p->pDelFr
fad0: 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72  ame = pDel->pPar
fae0: 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
faf0: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
fb00: 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pDel);.  }..  /*
fb10: 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64   Delete any auxd
fb20: 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ata allocations 
fb30: 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a  made by the VM *
fb40: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44  /.  if( p->pAuxD
fb50: 61 74 61 20 29 20 73 71 6c 69 74 65 33 56 64 62  ata ) sqlite3Vdb
fb60: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70  eDeleteAuxData(p
fb70: 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61  ->db, &p->pAuxDa
fb80: 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73  ta, -1, 0);.  as
fb90: 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74  sert( p->pAuxDat
fba0: 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  a==0 );.}../*.**
fbb0: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
fbc0: 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20   after a single 
fbd0: 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  run..*/.static v
fbe0: 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65  oid Cleanup(Vdbe
fbf0: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
fc00: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69  *db = p->db;..#i
fc10: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
fc20: 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61  G.  /* Execute a
fc30: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
fc40: 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
fc50: 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72  t the Vdbe.apCsr
fc60: 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62  [] and .  ** Vdb
fc70: 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20  e.aMem[] arrays 
fc80: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
fc90: 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a  n cleaned up.  *
fca0: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  /.  int i;.  if(
fcb0: 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28   p->apCsr ) for(
fcc0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
fcd0: 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  r; i++) assert( 
fce0: 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29  p->apCsr[i]==0 )
fcf0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
fd00: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
fd10: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20  i<p->nMem; i++) 
fd20: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
fd30: 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e  i].flags==MEM_Un
fd40: 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23  defined );.  }.#
fd50: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
fd60: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
fd70: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
fd80: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rMsg = 0;.  p->p
fd90: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d  ResultSet = 0;.}
fda0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
fdb0: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
fdc0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
fdd0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
fde0: 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74  y this SQL.** st
fdf0: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
fe00: 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70   now set at comp
fe10: 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72  ile time, rather
fe20: 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20   than during.** 
fe30: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
fe40: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f   vdbe program so
fe50: 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f   that sqlite3_co
fe60: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e  lumn_count() can
fe70: 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  .** be called on
fe80: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
fe90: 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  t before sqlite3
fea0: 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64  _step()..*/.void
feb0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
fec0: 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20  umCols(Vdbe *p, 
fed0: 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b  int nResColumn){
fee0: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
fef0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  ;.  int n;.  sql
ff00: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
ff10: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
ff20: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
ff30: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
ff40: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
ff50: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
ff60: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
ff70: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
ff80: 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
ff90: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
ffa0: 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
ffb0: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
ffc0: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
ffd0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
ffe0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65  NN(db, sizeof(Me
fff0: 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  m)*n );.  if( p-
10000 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72  >aColName==0 ) r
10010 65 74 75 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d  eturn;.  initMem
10020 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
10030 65 2c 20 6e 2c 20 70 2d 3e 64 62 2c 20 4d 45 4d  e, n, p->db, MEM
10040 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _Null);.}../*.**
10050 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
10060 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
10070 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
10080 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
10090 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
100a0 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
100b0 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
100c0 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
100d0 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
100e0 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
100f0 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
10100 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
10110 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  s()..**.** The f
10120 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20  inal parameter, 
10130 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e  xDel, must be on
10140 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41  e of SQLITE_DYNA
10150 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  MIC, SQLITE_STAT
10160 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  IC.** or SQLITE_
10170 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74  TRANSIENT. If it
10180 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   is SQLITE_DYNAM
10190 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  IC, then the buf
101a0 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  fer pointed.** t
101b0 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20  o by zName will 
101c0 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69  be freed by sqli
101d0 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e  te3DbFree() when
101e0 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73   the vdbe is des
101f0 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  troyed..*/.int s
10200 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
10210 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c  Name(.  Vdbe *p,
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10230 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
10240 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65   being configure
10250 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20  d */.  int idx, 
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
10280 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65   of column zName
10290 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20   applies to */. 
102a0 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20   int var,       
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
102d0 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61  COLNAME_* consta
102e0 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
102f0 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
10300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
10310 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
10320 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a  ontaining name *
10330 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
10340 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20  (void*)         
10350 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
10360 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65  anagement strate
10370 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a  gy for zName */.
10380 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
10390 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
103a0 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
103b0 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
103c0 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
103d0 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
103e0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
103f0 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
10400 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21   !zName || xDel!
10410 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20  =SQLITE_DYNAMIC 
10420 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
10430 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
10440 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
10450 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b  ->aColName!=0 );
10460 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28  .  pColName = &(
10470 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b  p->aColName[idx+
10480 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  var*p->nResColum
10490 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n]);.  rc = sqli
104a0 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
104b0 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
104c0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
104d0 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65  8, xDel);.  asse
104e0 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e  rt( rc!=0 || !zN
104f0 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65  ame || (pColName
10500 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d  ->flags&MEM_Term
10510 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )!=0 );.  return
10520 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
10530 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
10540 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
10550 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
10560 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
10570 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
10580 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
10590 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
105a0 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
105b0 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
105c0 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
105d0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
105e0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
105f0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
10600 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
10610 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
10620 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
10630 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
10640 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
10650 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
10660 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20  .  int nTrans = 
10670 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
10680 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
10690 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d  an active write-
106a0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
106b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
106c0 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e 64 69  * that are candi
106d0 64 61 74 65 73 20 66 6f 72 20 61 20 74 77 6f 2d  dates for a two-
106e0 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75 73 69  phase commit usi
106f0 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20 20 20  ng a.           
10700 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65          ** maste
10710 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  r-journal */.  i
10720 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10730 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f  K;.  int needXco
10740 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65  mmit = 0;..#ifde
10750 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10760 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
10770 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e  With this option
10780 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  , sqlite3VtabSyn
10790 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74  c() is defined t
107a0 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a  o be simply .  *
107b0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70  * SQLITE_OK so p
107c0 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20   is not used. . 
107d0 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
107e0 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69  AMETER(p);.#endi
107f0 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  f..  /* Before d
10800 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
10810 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79  se, call the xSy
10820 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f  nc() callback fo
10830 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75  r any.  ** virtu
10840 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73  al module tables
10850 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73   written in this
10860 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
10870 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62  is has to.  ** b
10880 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65  e done before de
10890 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65  termining whethe
108a0 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  r a master journ
108b0 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  al file is .  **
108c0 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e   required, as an
108d0 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
108e0 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74  k may add an att
108f0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20  ached database. 
10900 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73   ** to the trans
10910 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
10920 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
10930 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f  ync(db, p);..  /
10940 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65  * This loop dete
10950 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68  rmines (a) if th
10960 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68  e commit hook sh
10970 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
10980 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77  and.  ** (b) how
10990 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66   many database f
109a0 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77  iles have open w
109b0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
109c0 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63  s, not .  ** inc
109d0 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20  luding the temp 
109e0 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73  database. (b) is
109f0 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75   important becau
10a00 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20  se if more than 
10a10 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61  .  ** one databa
10a20 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f  se file has an o
10a30 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
10a40 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20  ction, a master 
10a50 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
10a60 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
10a70 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d  r an atomic comm
10a80 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  it..  */ .  for(
10a90 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
10aa0 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
10ab0 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65   i++){ .    Btre
10ac0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
10ad0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
10ae0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
10af0 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
10b00 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
10b10 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73  or not a databas
10b20 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 6d  e might need a m
10b30 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65  aster journal de
10b40 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20 20 20  pends upon.     
10b50 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20   ** its journal 
10b60 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74 68 65  mode (among othe
10b70 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68 69 73  r things).  This
10b80 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d 69 6e   matrix determin
10b90 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a  es which.      *
10ba0 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20  * journal modes 
10bb0 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  use a master jou
10bc0 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68 20 64  rnal and which d
10bd0 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 73  o not */.      s
10be0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
10bf0 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b 0a 20  MJNeeded[] = {. 
10c00 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54 45         /* DELETE
10c10 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20 20 20     */  1,.      
10c20 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20 20 2a    /* PERSIST   *
10c30 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  / 1,.        /* 
10c40 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a  OFF       */ 0,.
10c50 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 4e 43          /* TRUNC
10c60 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20  ATE  */ 1,.     
10c70 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20 20 20     /* MEMORY    
10c80 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a  */ 0,.        /*
10c90 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20 30 0a   WAL       */ 0.
10ca0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 50        };.      P
10cb0 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
10cc0 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69 61  /* Pager associa
10cd0 74 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f 0a  ted with pBt */.
10ce0 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69        needXcommi
10cf0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  t = 1;.      sql
10d00 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
10d10 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Bt);.      pPage
10d20 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
10d30 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Pager(pBt);.    
10d40 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
10d50 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d 50  .safety_level!=P
10d60 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
10d70 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26 20 61  _OFF.       && a
10d80 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74 65 33  MJNeeded[sqlite3
10d90 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d  PagerGetJournalM
10da0 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20 20 20  ode(pPager)].   
10db0 20 20 20 29 7b 20 0a 20 20 20 20 20 20 20 20 61     ){ .        a
10dc0 73 73 65 72 74 28 20 69 21 3d 31 20 29 3b 0a 20  ssert( i!=1 );. 
10dd0 20 20 20 20 20 20 20 6e 54 72 61 6e 73 2b 2b 3b         nTrans++;
10de0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
10df0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10e00 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
10e10 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
10e20 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
10e30 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Bt);.    }.  }. 
10e40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10e50 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
10e60 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
10e70 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
10e80 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
10e90 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b  ns at all, invok
10ea0 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  e the commit hoo
10eb0 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58  k */.  if( needX
10ec0 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43  commit && db->xC
10ed0 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b  ommitCallback ){
10ee0 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43  .    rc = db->xC
10ef0 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62  ommitCallback(db
10f00 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20  ->pCommitArg);. 
10f10 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10f20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10f30 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
10f40 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITHOOK;.    }.  
10f50 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
10f60 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
10f70 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
10f80 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
10f90 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
10fa0 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
10fb0 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
10fc0 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
10fd0 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
10fe0 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
10ff0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
11000 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
11010 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
11020 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
11030 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
11040 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
11050 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
11060 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
11070 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
11080 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
11090 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
110a0 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
110b0 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
110c0 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
110d0 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
110e0 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
110f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
11100 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
11110 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
11120 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
11130 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54  ].pBt)).   || nT
11140 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20  rans<=1.  ){.   
11150 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
11160 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
11170 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
11180 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
11190 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
111a0 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
111b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
111c0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
111d0 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
111e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
111f0 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
11200 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
11210 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
11220 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
11230 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
11240 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
11250 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
11260 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
11270 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
11280 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
11290 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
112a0 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
112b0 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
112c0 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
112d0 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
112e0 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
112f0 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
11300 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
11310 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
11320 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
11330 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
11340 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
11350 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
11360 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
11370 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
11380 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
11390 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
113a0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
113b0 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  wo(pBt, 0);.    
113c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
113d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
113e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
113f0 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
11400 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11410 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
11420 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
11430 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
11440 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
11450 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
11460 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
11470 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
11480 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
11490 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
114a0 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c  mmitted atomical
114b0 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
114c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
114d0 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
114e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
114f0 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
11500 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
11510 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
11520 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
11530 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
11540 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
11550 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
11560 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
11570 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
11580 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
11590 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30  ile *pMaster = 0
115a0 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
115b0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
115c0 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79  s;.    int retry
115d0 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  Count = 0;.    i
115e0 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20  nt nMainFile;.. 
115f0 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d     /* Select a m
11600 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11610 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  le name */.    n
11620 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
11630 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e  e3Strlen30(zMain
11640 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74  File);.    zMast
11650 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  er = sqlite3MPri
11660 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58  ntf(db, "%s-mjXX
11670 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e  XXXX9XXz", zMain
11680 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  File);.    if( z
11690 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75  Master==0 ) retu
116a0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
116b0 42 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a 20  BKPT;.    do {. 
116c0 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d       u32 iRandom
116d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 72  ;.      if( retr
116e0 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  yCount ){.      
116f0 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
11700 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >100 ){.        
11710 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
11720 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64  LITE_FULL, "MJ d
11730 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73  elete: %s", zMas
11740 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
11750 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
11760 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
11770 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
11780 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
11790 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74  e if( retryCount
117a0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==1 ){.         
117b0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
117c0 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f  ITE_FULL, "MJ co
117d0 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73  llide: %s", zMas
117e0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ter);.        }.
117f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
11800 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20  tryCount++;.    
11810 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
11820 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e  ness(sizeof(iRan
11830 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b  dom), &iRandom);
11840 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
11850 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61  nprintf(13, &zMa
11860 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c  ster[nMainFile],
11870 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c   "-mj%06X9%02X",
11880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66  (iRandom>>8)&0xf
118b0 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30  fffff, iRandom&0
118c0 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  xff);.      /* T
118d0 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61  he antipenultima
118e0 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  te character of 
118f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11900 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20  al name must.   
11910 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20     ** be "9" to 
11920 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69  avoid name colli
11930 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67  sions when using
11940 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20   8+3 filenames. 
11950 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
11960 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33   zMaster[sqlite3
11970 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72  Strlen30(zMaster
11980 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20  )-3]=='9' );.   
11990 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
119a0 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c  ffix3(zMainFile,
119b0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
119c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
119d0 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
119e0 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
119f0 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
11a00 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
11a10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
11a20 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  es );.    if( rc
11a30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11a40 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
11a50 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
11a60 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
11a70 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c  qlite3OsOpenMall
11a80 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  oc(pVfs, zMaster
11a90 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20  , &pMaster, .   
11aa0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
11ab0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
11ac0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
11ad0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
11ae0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
11af0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
11b00 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20  TER_JOURNAL, 0. 
11b10 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
11b20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11b30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
11b40 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
11b50 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
11b60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
11b70 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
11b80 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20  he name of each 
11b90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
11ba0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
11bb0 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20   into the new.  
11bc0 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
11bd0 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20  nal file. If an 
11be0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20  error occurs at 
11bf0 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65  this point close
11c00 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65  .    ** and dele
11c10 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
11c20 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20  urnal file. All 
11c30 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  the individual j
11c40 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20  ournal files.   
11c50 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27   ** still have '
11c60 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73  null' as the mas
11c70 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
11c80 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c  ter, so they wil
11c90 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61  l roll.    ** ba
11ca0 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
11cb0 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
11cc0 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  curs..    */.   
11cd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
11ce0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
11cf0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
11d00 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
11d10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
11d20 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
11d30 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  t) ){.        ch
11d40 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20  ar const *zFile 
11d50 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
11d60 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74  tJournalname(pBt
11d70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
11d80 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
11d90 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
11da0 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61  /* Ignore TEMP a
11db0 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  nd :memory: data
11dc0 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
11dd0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
11de0 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29  t( zFile[0]!=0 )
11df0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
11e00 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d  qlite3OsWrite(pM
11e10 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71  aster, zFile, sq
11e20 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
11e30 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
11e40 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
11e50 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
11e60 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  30(zFile)+1;.   
11e70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11e80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11e90 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11ea0 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
11eb0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11ec0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
11ed0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
11ee0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
11ef0 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
11f00 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
11f10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
11f20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
11f30 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
11f40 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11f50 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
11f60 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
11f70 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
11f80 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
11f90 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
11fa0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d     */.    if( 0=
11fb0 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  =(sqlite3OsDevic
11fc0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
11fd0 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45  (pMaster)&SQLITE
11fe0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
11ff0 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54  L).     && SQLIT
12000 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
12010 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65  te3OsSync(pMaste
12020 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  r, SQLITE_SYNC_N
12030 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20  ORMAL)).    ){. 
12040 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
12050 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
12060 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
12070 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
12080 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
12090 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
120a0 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
120b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
120c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
120d0 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
120e0 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
120f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
12100 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
12110 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
12120 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
12130 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
12140 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
12150 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
12160 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
12170 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
12180 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
12190 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
121a0 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
121b0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
121c0 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
121d0 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
121e0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
121f0 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72  One(), then ther
12200 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
12210 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61  at the.    ** ma
12220 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12230 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e  e will be orphan
12240 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
12250 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20  t delete it,.   
12260 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
12270 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
12280 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
12290 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
122a0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
122b0 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
122c0 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
122d0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
122e0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
122f0 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
12300 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
12310 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
12320 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
12330 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
12340 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
12350 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
12360 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b  e(pBt, zMaster);
12370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12380 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
12390 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
123a0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
123b0 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20  SQLITE_BUSY );. 
123c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
123d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
123e0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
123f0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
12400 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
12410 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
12420 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
12430 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
12440 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
12450 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
12460 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
12470 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
12480 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
12490 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
124a0 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
124b0 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
124c0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
124d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
124e0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
124f0 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  Master, 1);.    
12500 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12510 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
12520 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
12530 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
12540 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12550 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69  }..    /* All fi
12560 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
12570 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ies have already
12580 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f   been synced, so
12590 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
125a0 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
125b0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
125c0 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20  tPhaseTwo() are 
125d0 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c  only closing fil
125e0 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  es and.    ** de
125f0 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
12600 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49  ting journals. I
12610 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
12620 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20   wrong while.   
12630 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
12640 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72  ening we don't r
12650 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20  eally care. The 
12660 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
12670 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
12680 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67  ion is already g
12690 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73  uaranteed, but s
126a0 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27  ome stray 'cold'
126b0 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a   journals.    **
126c0 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72   may be lying ar
126d0 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20  ound. Returning 
126e0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f  an error code wo
126f0 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73  n't help matters
12700 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73  ..    */.    dis
12710 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
12720 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20  o_errors();.    
12730 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
12740 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
12750 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
12760 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
12770 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
12780 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
12790 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
127a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
127b0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
127c0 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20  o(pBt, 1);.     
127d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
127e0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
127f0 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c  loc();.    enabl
12800 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
12810 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
12820 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
12830 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
12840 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12850 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
12860 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
12870 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64   the sqlite3.nVd
12880 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76  beActive count v
12890 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68  ariable.** match
128a0 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
128b0 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c   vdbe's in the l
128c0 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62  ist sqlite3.pVdb
128d0 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75  e that are.** cu
128e0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20  rrently active. 
128f0 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69  An assertion fai
12900 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f  ls if the two co
12910 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  unts do not matc
12920 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  h..** This is an
12930 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63   internal self-c
12940 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69  heck only - it i
12950 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69  s not an essenti
12960 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a  al processing.**
12970 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   step..**.** Thi
12980 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
12990 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  NDEBUG is define
129a0 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  d..*/.#ifndef ND
129b0 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64  EBUG.static void
129c0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
129d0 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  Cnt(sqlite3 *db)
129e0 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69  {.  Vdbe *p;.  i
129f0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
12a00 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20  t nWrite = 0;.  
12a10 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20  int nRead = 0;. 
12a20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
12a30 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
12a40 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
12a50 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33  mt_busy((sqlite3
12a60 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20  _stmt*)p) ){.   
12a70 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
12a80 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  if( p->readOnly=
12a90 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20  =0 ) nWrite++;. 
12aa0 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52       if( p->bIsR
12ab0 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b  eader ) nRead++;
12ac0 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
12ad0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
12ae0 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
12af0 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20  nVdbeActive );. 
12b00 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d   assert( nWrite=
12b10 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20  =db->nVdbeWrite 
12b20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  );.  assert( nRe
12b30 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61  ad==db->nVdbeRea
12b40 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  d );.}.#else.#de
12b50 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65  fine checkActive
12b60 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69  VdbeCnt(x).#endi
12b70 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
12b80 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
12b90 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
12ba0 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65  t opened a state
12bb0 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
12bc0 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f  ,.** close it no
12bd0 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20  w. Argument eOp 
12be0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
12bf0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12c00 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  K or.** SAVEPOIN
12c10 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74  T_RELEASE. If it
12c20 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
12c30 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65  LLBACK, then the
12c40 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
12c50 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
12c60 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70  led back. If eOp
12c70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   is SAVEPOINT_RE
12c80 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20  LEASE, then the 
12c90 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72  .** statement tr
12ca0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
12cb0 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mitted..**.** If
12cc0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
12cd0 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  urs, an SQLITE_I
12ce0 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
12cf0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
12d00 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53   .** Otherwise S
12d10 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
12d20 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
12d30 49 4e 45 20 69 6e 74 20 76 64 62 65 43 6c 6f 73  INE int vdbeClos
12d40 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20  eStatement(Vdbe 
12d50 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20  *p, int eOp){.  
12d60 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64  sqlite3 *const d
12d70 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
12d80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12d90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
12da0 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  t int iSavepoint
12db0 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74   = p->iStatement
12dc0 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  -1;..  assert( e
12dd0 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
12de0 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53  LLBACK || eOp==S
12df0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
12e00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
12e10 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b  >nStatement>0 );
12e20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53  .  assert( p->iS
12e30 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e  tatement==(db->n
12e40 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53  Statement+db->nS
12e50 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20  avepoint) );..  
12e60 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
12e70 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69  Db; i++){ .    i
12e80 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
12e90 4f 4b 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  OK;.    Btree *p
12ea0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
12eb0 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
12ec0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f   ){.      if( eO
12ed0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
12ee0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
12ef0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
12f00 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
12f10 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
12f20 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
12f30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12f40 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
12f50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
12f60 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
12f70 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
12f80 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
12f90 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
12fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12fb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12fc0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
12fd0 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
12fe0 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 74   }.  }.  db->nSt
12ff0 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 70 2d 3e  atement--;.  p->
13000 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
13010 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13020 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
13030 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
13040 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
13050 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
13060 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
13070 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
13080 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
13090 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
130a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
130b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
130c0 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
130d0 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  b, SAVEPOINT_REL
130e0 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
130f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
13100 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
13110 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
13120 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
13130 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f  back, also resto
13140 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74  re the .  ** dat
13150 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65  abase handles de
13160 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
13170 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65  t counter to the
13180 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68   value it had wh
13190 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  en .  ** the sta
131a0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
131b0 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20  on was opened.  
131c0 2a 2f 0a 20 20 69 66 28 20 65 4f 70 3d 3d 53 41  */.  if( eOp==SA
131d0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
131e0 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66   ){.    db->nDef
131f0 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e  erredCons = p->n
13200 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20  StmtDefCons;.   
13210 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
13220 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  mCons = p->nStmt
13230 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 7d 0a  DefImmCons;.  }.
13240 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
13250 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  nt sqlite3VdbeCl
13260 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62  oseStatement(Vdb
13270 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a  e *p, int eOp){.
13280 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6e 53 74    if( p->db->nSt
13290 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53  atement && p->iS
132a0 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
132b0 72 65 74 75 72 6e 20 76 64 62 65 43 6c 6f 73 65  return vdbeClose
132c0 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 4f 70  Statement(p, eOp
132d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
132e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
132f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
13300 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
13310 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
13320 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61  opened by the da
13330 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c  tabase .** handl
13340 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
13350 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  h the VM passed 
13360 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69  as an argument i
13370 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a  s about to be .*
13380 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20  * committed. If 
13390 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
133a0 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66  nding deferred f
133b0 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
133c0 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69  raint.** violati
133d0 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ons, return SQLI
133e0 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77  TE_ERROR. Otherw
133f0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
13400 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
13410 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46  re outstanding F
13420 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64  K violations and
13430 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
13440 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
13450 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65  E_ERROR, set the
13460 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56   result of the V
13470 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53  M to SQLITE_CONS
13480 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
13490 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61  Y.** and write a
134a0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
134b0 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75  to it. Then retu
134c0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
134d0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
134e0 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
134f0 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  KEY.int sqlite3V
13500 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20  dbeCheckFk(Vdbe 
13510 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64  *p, int deferred
13520 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
13530 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
13540 28 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62  (deferred && (db
13550 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b  ->nDeferredCons+
13560 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
13570 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20  Cons)>0) .   || 
13580 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d  (!deferred && p-
13590 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30  >nFkConstraint>0
135a0 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72  ) .  ){.    p->r
135b0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
135c0 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
135d0 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63  ;.    p->errorAc
135e0 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
135f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13600 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49 47  Error(p, "FOREIG
13610 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
13620 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
13630 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
13640 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
13650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
13660 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
13670 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
13680 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
13690 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
136a0 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
136b0 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
136c0 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
136d0 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
136e0 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
136f0 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
13700 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
13710 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
13720 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
13730 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
13740 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
13750 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
13760 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
13770 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
13780 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
13790 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
137a0 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
137b0 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
137c0 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
137d0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
137e0 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
137f0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
13800 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
13810 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
13820 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
13830 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
13840 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
13850 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
13860 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
13870 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
13880 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
13890 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
138a0 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
138b0 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
138c0 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
138d0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138f0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
13900 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
13910 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
13920 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
13930 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
13940 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
13950 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
13960 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
13970 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
13980 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
13990 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
139a0 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
139b0 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
139c0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
139d0 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
139e0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
139f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
13a00 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
13a10 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
13a20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
13a30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
13a40 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
13a50 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
13a60 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
13a70 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
13a80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
13a90 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
13aa0 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
13ab0 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
13ac0 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
13ad0 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
13ae0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
13af0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
13b00 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
13b10 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
13b20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
13b30 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
13b40 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
13b50 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
13b60 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   */..  if( db->m
13b70 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
13b80 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
13b90 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
13ba0 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  }.  closeAllCurs
13bb0 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ors(p);.  if( p-
13bc0 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
13bd0 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65  IC_RUN ){.    re
13be0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13bf0 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76    }.  checkActiv
13c00 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
13c10 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
13c20 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
13c30 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
13c40 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72  never started or
13c50 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c   if the.  ** SQL
13c60 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20   statement does 
13c70 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74  not read or writ
13c80 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  e a database fil
13c90 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  e.  */.  if( p->
13ca0 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52  pc>=0 && p->bIsR
13cb0 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  eader ){.    int
13cc0 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
13cd0 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
13ce0 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20  om p->rc */.    
13cf0 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  int eStatementOp
13d00 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73   = 0;.    int is
13d10 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
13d20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
13d30 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70  to true if a 'sp
13d40 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a  ecial' error */.
13d50 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c  .    /* Lock all
13d60 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20   btrees used by 
13d70 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
13d80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13d90 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f  Enter(p);..    /
13da0 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20  * Check for one 
13db0 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
13dc0 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63  rrors */.    mrc
13dd0 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b   = p->rc & 0xff;
13de0 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72  .    isSpecialEr
13df0 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54  ror = mrc==SQLIT
13e00 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
13e10 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20  SQLITE_IOERR.   
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e30 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45    || mrc==SQLITE
13e40 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72  _INTERRUPT || mr
13e50 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  c==SQLITE_FULL;.
13e60 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61      if( isSpecia
13e70 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  lError ){.      
13e80 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
13e90 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e  was read-only an
13ea0 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
13eb0 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   is SQLITE_INTER
13ec0 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20  RUPT, .      ** 
13ed0 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e  no rollback is n
13ee0 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77  ecessary. Otherw
13ef0 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20  ise, at least a 
13f00 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
13f10 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
13f20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  must be rolled b
13f30 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ack to restore t
13f40 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61  he database to a
13f50 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69   .      ** consi
13f60 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
13f70 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
13f80 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65  ven if the state
13f90 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ment is read-onl
13fa0 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  y, it is importa
13fb0 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20  nt to perform.  
13fc0 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65      ** a stateme
13fd0 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
13fe0 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61  n rollback opera
13ff0 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72  tion. If the err
14000 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63  or .      ** occ
14010 75 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74  urred while writ
14020 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
14030 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  al, sub-journal 
14040 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  or database.    
14050 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72    ** file as par
14060 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74  t of an effort t
14070 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20  o free up cache 
14080 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74  space (see funct
14090 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ion.      ** pag
140a0 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61  erStress() in pa
140b0 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c  ger.c), the roll
140c0 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  back is required
140d0 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20   to restore .   
140e0 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20     ** the pager 
140f0 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20  to a consistent 
14100 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
14110 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65        if( !p->re
14120 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
14130 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
14140 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
14150 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
14160 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
14170 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65  _FULL) && p->use
14180 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
14190 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
141a0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
141b0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
141c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
141d0 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
141e0 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
141f0 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
14200 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
14210 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
14220 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
14230 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
14240 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
14250 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
14260 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
14270 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
14280 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
14290 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
142a0 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
142b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
142c0 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
142d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
142e0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
142f0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
14300 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
14310 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14320 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
14330 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66   for immediate f
14340 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61  oreign key viola
14350 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66  tions. */.    if
14360 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14370 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
14380 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
14390 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
143a0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
143b0 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
143c0 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
143d0 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
143e0 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20   writer .    ** 
143f0 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65  VM, then we do e
14400 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f  ither a commit o
14410 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68  r rollback of th
14420 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
14430 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20  ction. .    **. 
14440 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73     ** Note: This
14450 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73   block also runs
14460 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   if one of the s
14470 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61  pecial errors ha
14480 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62  ndled .    ** ab
14490 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  ove has occurred
144a0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
144b0 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e  ( !sqlite3VtabIn
144c0 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26  Sync(db) .     &
144d0 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  & db->autoCommit
144e0 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56   .     && db->nV
144f0 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65  dbeWrite==(p->re
14500 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20  adOnly==0) .    
14510 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
14520 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
14530 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
14540 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
14550 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
14560 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
14570 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
14580 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  (p, 1);.        
14590 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
145a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
145b0 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64  f( NEVER(p->read
145c0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
145d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
145e0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
145f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14600 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
14610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14620 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
14630 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
14640 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  EY;.        }els
14650 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  e{ .          /*
14660 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   The auto-commit
14670 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
14680 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
14690 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a  was successful .
146a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
146b0 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27  hit an 'OR FAIL'
146c0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
146d0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66  there are no def
146e0 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20  erred foreign.  
146f0 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63          ** key c
14700 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f  onstraints to ho
14710 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  ld up the transa
14720 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e  ction. This mean
14730 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20  s a commit .    
14740 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
14750 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ired. */.       
14760 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d     rc = vdbeComm
14770 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  it(db, p);.     
14780 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
14790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
147a0 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20   && p->readOnly 
147b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
147c0 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
147d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
147e0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
147f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
14800 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14810 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
14820 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
14830 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
14840 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
14850 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  _OK);.          
14860 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
14870 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14880 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65           db->nDe
14890 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a  ferredCons = 0;.
148a0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
148b0 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
148c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
148d0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
148e0 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20  TE_DeferFKs;.   
148f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
14900 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
14910 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ges(db);.       
14920 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
14930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
14940 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
14950 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
14960 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
14970 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
14980 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
14990 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
149a0 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d  f( eStatementOp=
149b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
149c0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
149d0 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
149e0 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
149f0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
14a00 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
14a10 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d  RELEASE;.      }
14a20 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
14a30 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
14a40 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  t ){.        eSt
14a50 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
14a60 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
14a70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14a80 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
14a90 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
14aa0 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
14ab0 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
14ac0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
14ad0 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
14ae0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
14af0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
14b00 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
14b10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
14b20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e   /* If eStatemen
14b30 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  tOp is non-zero,
14b40 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   then a statemen
14b50 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  t transaction ne
14b60 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
14b70 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
14b80 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20  lled back. Call 
14b90 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
14ba0 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20  Statement() to. 
14bb0 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20     ** do so. If 
14bc0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72  this operation r
14bd0 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c  eturns an error,
14be0 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
14bf0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a   statement.    *
14c00 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
14c10 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c  SQLITE_OK or SQL
14c20 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
14c30 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65  then promote the
14c40 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
14c50 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20  statement error 
14c60 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  code..    */.   
14c70 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
14c80 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  p ){.      rc = 
14c90 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
14ca0 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74  Statement(p, eSt
14cb0 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20  atementOp);.    
14cc0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
14cd0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
14ce0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
14cf0 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
14d00 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20  _CONSTRAINT ){. 
14d10 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
14d20 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
14d30 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14d40 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
14d50 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
14d60 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
14d70 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
14d80 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
14d90 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
14da0 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
14db0 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
14dc0 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
14dd0 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
14de0 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
14df0 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
14e00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14e10 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
14e20 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
14e30 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
14e40 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e   and no statemen
14e50 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  t transaction.  
14e60 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f    ** has been ro
14e70 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74  lled back, updat
14e80 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  e the database c
14e90 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65  onnection change
14ea0 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a  -counter. .    *
14eb0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61  /.    if( p->cha
14ec0 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20  ngeCntOn ){.    
14ed0 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
14ee0 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op!=SAVEPOINT_RO
14ef0 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
14f00 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
14f10 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
14f20 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  Change);.      }
14f30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
14f40 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
14f50 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ges(db, 0);.    
14f60 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68    }.      p->nCh
14f70 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ange = 0;.    }.
14f80 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
14f90 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  the locks */.   
14fa0 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
14fb0 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(p);.  }..  /* 
14fc0 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
14fd0 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
14fe0 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
14ff0 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
15000 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
15010 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  >=0 ){.    db->n
15020 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20  VdbeActive--;.  
15030 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
15040 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72  ly ) db->nVdbeWr
15050 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  ite--;.    if( p
15060 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62  ->bIsReader ) db
15070 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20  ->nVdbeRead--;. 
15080 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
15090 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e  VdbeActive>=db->
150a0 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20  nVdbeRead );.   
150b0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
150c0 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62  beRead>=db->nVdb
150d0 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73  eWrite );.    as
150e0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57  sert( db->nVdbeW
150f0 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20  rite>=0 );.  }. 
15100 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
15110 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
15120 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
15130 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d  t(db);.  if( db-
15140 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
15150 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
15160 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
15170 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
15180 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
15190 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
151a0 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
151b0 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
151c0 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
151d0 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
151e0 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
151f0 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
15200 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
15210 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
15220 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
15230 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
15240 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
15250 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
15260 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
15270 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
15280 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
15290 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
152a0 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  ive>0 || db->aut
152b0 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
152c0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
152d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
152e0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
152f0 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
15300 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a  SQLITE_OK);.}...
15310 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
15320 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
15330 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
15340 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
15350 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
15360 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
15370 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
15380 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
15390 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
153a0 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
153b0 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
153c0 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
153d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
153e0 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72  * Copy the error
153f0 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
15400 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e  message belongin
15410 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61  g to the VDBE pa
15420 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
15430 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
15440 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61   its database ha
15450 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68  ndle (so that th
15460 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72  ey will be .** r
15470 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73  eturned by calls
15480 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63   to sqlite3_errc
15490 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ode() and sqlite
154a0 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a  3_errmsg())..**.
154b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
154c0 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20   does not clear 
154d0 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63  the VDBE error c
154e0 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20  ode or message, 
154f0 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  just.** copies t
15500 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62  hem to the datab
15510 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
15520 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  nt sqlite3VdbeTr
15530 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65  ansferError(Vdbe
15540 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
15550 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
15560 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
15570 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
15580 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69  ){.    db->bBeni
15590 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20  gnMalloc++;.    
155a0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
155b0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
155c0 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20  if( db->pErr==0 
155d0 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c  ) db->pErr = sql
155e0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29  ite3ValueNew(db)
155f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
15600 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
15610 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
15620 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
15630 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
15640 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
15650 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
15660 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e  .    db->bBenign
15670 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 20 20 64 62  Malloc--;.    db
15680 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
15690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
156a0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
156b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
156c0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
156d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
156e0 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53  OG./*.** If an S
156f0 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c  QLITE_CONFIG_SQL
15700 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69  LOG hook is regi
15710 73 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56  stered and the V
15720 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20  M has been run, 
15730 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a  .** invoke it..*
15740 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
15750 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56  beInvokeSqllog(V
15760 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73  dbe *v){.  if( s
15770 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
15780 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d  ig.xSqllog && v-
15790 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
157a0 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e  & v->zSql && v->
157b0 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  pc>=0 ){.    cha
157c0 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73  r *zExpanded = s
157d0 71 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64  qlite3VdbeExpand
157e0 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b  Sql(v, v->zSql);
157f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e  .    assert( v->
15800 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
15810 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70   );.    if( zExp
15820 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73  anded ){.      s
15830 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
15840 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20  ig.xSqllog(.    
15850 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
15860 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
15870 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78  gArg, v->db, zEx
15880 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20  panded, 1.      
15890 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
158a0 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45  DbFree(v->db, zE
158b0 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a  xpanded);.    }.
158c0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
158d0 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53  fine vdbeInvokeS
158e0 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a  qllog(x).#endif.
158f0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
15900 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
15910 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f  cution but do no
15920 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42  t delete the VDB
15930 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57  E just yet..** W
15940 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
15950 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a  essages into *pz
15960 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20  ErrMsg.  Return 
15970 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
15980 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  .**.** After thi
15990 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e  s routine is run
159a0 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c  , the VDBE shoul
159b0 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65  d be ready to be
159c0 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61   executed.** aga
159d0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f  in..**.** To loo
159e0 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20  k at it another 
159f0 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  way, this routin
15a00 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61  e resets the sta
15a10 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72  te of the.** vir
15a20 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f  tual machine fro
15a30 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  m VDBE_MAGIC_RUN
15a40 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48   or VDBE_MAGIC_H
15a50 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56  ALT back to.** V
15a60 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a  DBE_MAGIC_INIT..
15a70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
15a80 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29  beReset(Vdbe *p)
15a90 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
15aa0 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  .  db = p->db;..
15ab0 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64    /* If the VM d
15ac0 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f  id not run to co
15ad0 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69  mpletion or if i
15ae0 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e  t encountered an
15af0 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65  .  ** error, the
15b00 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68  n it might not h
15b10 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20  ave been halted 
15b20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61  properly.  So ha
15b30 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a  lt.  ** it now..
15b40 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
15b50 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a  beHalt(p);..  /*
15b60 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73   If the VDBE has
15b70 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72   be run even par
15b80 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61  tially, then tra
15b90 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20  nsfer the error 
15ba0 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72  code.  ** and er
15bb0 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d  ror message from
15bc0 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74   the VDBE into t
15bd0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
15be0 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74   structure.  But
15bf0 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42  .  ** if the VDB
15c00 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  E has just been 
15c10 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68  set to run but h
15c20 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  as not actually 
15c30 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a  executed any.  *
15c40 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79  * instructions y
15c50 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61  et, leave the ma
15c60 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  in database erro
15c70 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e  r information un
15c80 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20  changed..  */.  
15c90 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
15ca0 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71      vdbeInvokeSq
15cb0 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c  llog(p);.    sql
15cc0 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
15cd0 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71  Error(p);.    sq
15ce0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15cf0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
15d00 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
15d10 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f  .    if( p->runO
15d20 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70  nlyOnce ) p->exp
15d30 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ired = 1;.  }els
15d40 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70  e if( p->rc && p
15d50 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20  ->expired ){.   
15d60 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20   /* The expired 
15d70 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
15d80 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20  the VDBE before 
15d90 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20  the first call. 
15da0 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
15db0 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e  _step(). For con
15dc0 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20  sistency (since 
15dd0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77  sqlite3_step() w
15de0 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  as.    ** called
15df0 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  ), set the datab
15e00 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69  ase error in thi
15e10 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a  s case as well..
15e20 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
15e30 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
15e40 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72  b, p->rc, p->zEr
15e50 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c  rMsg ? "%s" : 0,
15e60 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
15e70 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15e80 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
15e90 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
15ea0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
15eb0 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72  eclaim all memor
15ec0 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44  y used by the VD
15ed0 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75  BE.  */.  Cleanu
15ee0 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65  p(p);..  /* Save
15ef0 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72   profiling infor
15f00 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73  mation from this
15f10 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a   VDBE run..  */.
15f20 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
15f30 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45  ILE.  {.    FILE
15f40 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76   *out = fopen("v
15f50 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22  dbe_profile.out"
15f60 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20  , "a");.    if( 
15f70 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  out ){.      int
15f80 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   i;.      fprint
15f90 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b  f(out, "---- ");
15fa0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
15fb0 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
15fc0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
15fd0 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e  out, "%02x", p->
15fe0 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a  aOp[i].opcode);.
15ff0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
16000 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
16010 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a  ;.      if( p->z
16020 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Sql ){.        c
16030 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20  har c, pc = 0;. 
16040 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
16050 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20  ut, "-- ");.    
16060 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20      for(i=0; (c 
16070 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30  = p->zSql[i])!=0
16080 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
16090 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29    if( pc=='\n' )
160a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
160b0 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  - ");.          
160c0 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20  putc(c, out);.  
160d0 20 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a          pc = c;.
160e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
160f0 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29    if( pc!='\n' )
16100 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
16110 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n");.      }.   
16120 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
16130 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
16140 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30      char zHdr[10
16150 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0];.        sqli
16160 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
16170 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c  eof(zHdr), zHdr,
16180 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c   "%6u %12llu %8l
16190 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  lu ",.          
161a0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
161b0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
161c0 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
161d0 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
161e0 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
161f0 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
16200 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
16210 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
16220 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  fprintf(out, "%s
16230 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20  ", zHdr);.      
16240 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
16250 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d  ntOp(out, i, &p-
16260 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >aOp[i]);.      
16270 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f  }.      fclose(o
16280 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ut);.    }.  }.#
16290 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75 72 72  endif.  p->iCurr
162a0 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70  entTime = 0;.  p
162b0 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
162c0 41 47 49 43 5f 52 45 53 45 54 3b 0a 20 20 72 65  AGIC_RESET;.  re
162d0 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d  turn p->rc & db-
162e0 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a  >errMask;.}. ./*
162f0 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64  .** Clean up and
16300 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61   delete a VDBE a
16310 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20  fter execution. 
16320 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
16330 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74  er which is.** t
16340 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20  he result code. 
16350 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
16360 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e   message text in
16370 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f  to *pzErrMsg..*/
16380 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
16390 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70  Finalize(Vdbe *p
163a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
163b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
163c0 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
163d0 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61  GIC_RUN || p->ma
163e0 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
163f0 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  HALT ){.    rc =
16400 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
16410 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74  t(p);.    assert
16420 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65  ( (rc & p->db->e
16430 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20  rrMask)==rc );. 
16440 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
16450 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74  Delete(p);.  ret
16460 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16470 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f   If parameter iO
16480 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  p is less than z
16490 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ero, then invoke
164a0 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
164b0 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c  for.** all auxil
164c0 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65  iary data pointe
164d0 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63  rs currently cac
164e0 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  hed by the VM pa
164f0 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66  ssed as.** the f
16500 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
16510 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20  *.** Or, if iOp 
16520 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
16530 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
16540 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74 72  , then the destr
16550 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79  uctor is.** only
16560 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f   invoked for tho
16570 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  se auxiliary dat
16580 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74  a pointers creat
16590 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20 0a  ed by the user .
165a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  ** function invo
165b0 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75  ked by the OP_Fu
165c0 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74  nction opcode at
165d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70   instruction iOp
165e0 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65   of .** VM pVdbe
165f0 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20  , and only then 
16600 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74  if:.**.**    * t
16610 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 75  he associated fu
16620 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
16630 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20   is the 32nd or 
16640 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a  later (counting.
16650 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66  **      from lef
16660 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a  t to right), or.
16670 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63  **.**    * the c
16680 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
16690 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73   in argument mas
166a0 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 65 72  k is clear (wher
166b0 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20  e the first.**  
166c0 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72      function par
166d0 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e  ameter correspon
166e0 64 73 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e  ds to bit 0 etc.
166f0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
16700 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
16710 61 74 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ata(sqlite3 *db,
16720 20 41 75 78 44 61 74 61 20 2a 2a 70 70 2c 20 69   AuxData **pp, i
16730 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b  nt iOp, int mask
16740 29 7b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20  ){.  while( *pp 
16750 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a  ){.    AuxData *
16760 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20  pAux = *pp;.    
16770 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20  if( (iOp<0).    
16780 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d   || (pAux->iOp==
16790 69 4f 70 20 26 26 20 28 70 41 75 78 2d 3e 69 41  iOp && (pAux->iA
167a0 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20  rg>31 || !(mask 
167b0 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78  & MASKBIT32(pAux
167c0 2d 3e 69 41 72 67 29 29 29 29 0a 20 20 20 20 29  ->iArg)))).    )
167d0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
167e0 28 20 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31  ( pAux->iArg==31
167f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41   );.      if( pA
16800 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20  ux->xDelete ){. 
16810 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65         pAux->xDe
16820 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29  lete(pAux->pAux)
16830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16840 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78  *pp = pAux->pNex
16850 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
16860 44 62 46 72 65 65 28 64 62 2c 20 70 41 75 78 29  DbFree(db, pAux)
16870 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16880 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e     pp= &pAux->pN
16890 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ext;.    }.  }.}
168a0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
168b0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
168c0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
168d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
168e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
168f0 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62  ** except for ob
16900 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69  ject itself, whi
16910 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e  ch is preserved.
16920 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
16930 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
16940 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
16950 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
16960 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56  e() is that.** V
16970 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f  dbeDelete() also
16980 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62   unlinks the Vdb
16990 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
169a0 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65  of VMs associate
169b0 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61  d with.** the da
169c0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
169d0 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20  n and frees the 
169e0 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a  object itself..*
169f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
16a00 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71  beClearObject(sq
16a10 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
16a20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61  *p){.  SubProgra
16a30 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b  m *pSub, *pNext;
16a40 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
16a50 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62  ==0 || p->db==db
16a60 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   );.  releaseMem
16a70 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
16a80 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
16a90 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66  *COLNAME_N);.  f
16aa0 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67  or(pSub=p->pProg
16ab0 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ram; pSub; pSub=
16ac0 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
16ad0 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b  t = pSub->pNext;
16ae0 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41  .    vdbeFreeOpA
16af0 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61  rray(db, pSub->a
16b00 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a  Op, pSub->nOp);.
16b10 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
16b20 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d  e(db, pSub);.  }
16b30 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
16b40 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
16b50 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
16b60 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
16b70 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 73   p->nVar);.    s
16b80 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16b90 20 70 2d 3e 70 56 4c 69 73 74 29 3b 0a 20 20 20   p->pVList);.   
16ba0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16bb0 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20  b, p->pFree);.  
16bc0 7d 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72  }.  vdbeFreeOpAr
16bd0 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20  ray(db, p->aOp, 
16be0 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74  p->nOp);.  sqlit
16bf0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16c00 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  aColName);.  sql
16c10 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16c20 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66 64 65 66 20  ->zSql);.#ifdef 
16c30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
16c40 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
16c50 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
16c60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
16c70 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Scan; i++){.    
16c80 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16c90 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e  db, p->aScan[i].
16ca0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
16cb0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16cc0 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 20  db, p->aScan);. 
16cd0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
16ce0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
16cf0 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
16d00 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
16d10 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
16d20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
16d30 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
16d40 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
16d50 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
16d60 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16d70 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
16d80 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16d90 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20  ClearObject(db, 
16da0 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p);.  if( p->pPr
16db0 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
16dc0 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
16dd0 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
16de0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
16df0 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
16e00 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
16e10 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
16e20 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
16e30 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
16e40 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
16e50 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
16e60 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70  _MAGIC_DEAD;.  p
16e70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->db = 0;.  sqli
16e80 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
16e90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  ;.}../*.** The c
16ea0 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20  ursor "p" has a 
16eb0 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65  pending seek ope
16ec0 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  ration that has 
16ed0 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20  not yet been.** 
16ee0 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65  carried out.  Se
16ef0 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f  ek the cursor no
16f00 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  w.  If an error 
16f10 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a  occurs, return.*
16f20 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
16f30 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
16f40 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
16f50 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
16f60 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
16f70 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
16f80 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a  .  int res, rc;.
16f90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
16fa0 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ST.  extern int 
16fb0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
16fc0 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ount;.#endif.  a
16fd0 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72  ssert( p->deferr
16fe0 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73  edMoveto );.  as
16ff0 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
17000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
17010 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
17020 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63  PE_BTREE );.  rc
17030 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
17040 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d  ovetoUnpacked(p-
17050 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20  >uc.pCursor, 0, 
17060 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
17070 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28   0, &res);.  if(
17080 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
17090 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20  .  if( res!=0 ) 
170a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
170b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64  RRUPT_BKPT;.#ifd
170c0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
170d0 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
170e0 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
170f0 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
17100 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  eto = 0;.  p->ca
17110 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
17120 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72  E_STALE;.  retur
17130 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17140 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20  /*.** Something 
17150 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72  has moved cursor
17160 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63   "p" out of plac
17170 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f  e.  Maybe the ro
17180 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e  w it was.** poin
17190 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74  ted to was delet
171a0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
171b0 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20  r it.  Or maybe 
171c0 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a  the btree was.**
171d0 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68   rebalanced.  Wh
171e0 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65  atever the cause
171f0 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65  , try to restore
17200 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63   "p" to the plac
17210 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f  e it.** is suppo
17220 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69  sed to be pointi
17230 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20  ng.  If the row 
17240 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
17250 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a  from under the.*
17260 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68  * cursor, set th
17270 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
17280 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  t to a NULL row.
17290 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
172a0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68  QLITE_NOINLINE h
172b0 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
172c0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
172d0 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65  .  int isDiffere
172e0 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73  ntRow, rc;.  ass
172f0 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65  ert( p->eCurType
17300 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
17310 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
17320 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
17330 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17340 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
17350 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  Moved(p->uc.pCur
17360 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  sor) );.  rc = s
17370 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
17380 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70  rRestore(p->uc.p
17390 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65  Cursor, &isDiffe
173a0 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63  rentRow);.  p->c
173b0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
173c0 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20  HE_STALE;.  if( 
173d0 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29  isDifferentRow )
173e0 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b   p->nullRow = 1;
173f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17400 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
17410 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
17420 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  cursor is valid.
17430 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75    Restore the cu
17440 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20  rsor.** if need 
17450 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20  be.  Return any 
17460 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74  I/O error from t
17470 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61  he restore opera
17480 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
17490 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65  ite3VdbeCursorRe
174a0 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72  store(VdbeCursor
174b0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
174c0 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
174d0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
174e0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
174f0 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
17500 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b  ->uc.pCursor) ){
17510 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
17520 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
17530 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
17540 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17550 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
17560 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61   cursor p is rea
17570 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  dy to read or wr
17580 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77  ite the row to w
17590 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c  hich it.** was l
175a0 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20  ast positioned. 
175b0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
175c0 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20   code if an OOM 
175d0 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72  fault or I/O err
175e0 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75  or.** prevents u
175f0 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69  s from positioni
17600 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
17610 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73   its correct pos
17620 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
17630 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
17640 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
17650 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
17660 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
17670 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
17680 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65  If no move is pe
17690 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20  nding, check to 
176a0 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68  see if the row h
176b0 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74  as been.** delet
176c0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
176d0 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  r the cursor and
176e0 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b   if it has, mark
176f0 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61   the row as.** a
17700 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a   NULL row..**.**
17710 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
17720 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
17730 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  ng to the correc
17740 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72  t row and that r
17750 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65  ow has.** not be
17760 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
17770 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
17780 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20  rsor, then this 
17790 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
177a0 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
177b0 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
177c0 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  to(VdbeCursor **
177d0 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b  pp, int *piCol){
177e0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
177f0 20 3d 20 2a 70 70 3b 0a 20 20 69 66 28 20 70 2d   = *pp;.  if( p-
17800 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
17810 50 45 5f 42 54 52 45 45 20 29 7b 0a 20 20 20 20  PE_BTREE ){.    
17820 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  if( p->deferredM
17830 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 20 20 69  oveto ){.      i
17840 6e 74 20 69 4d 61 70 3b 0a 20 20 20 20 20 20 69  nt iMap;.      i
17850 66 28 20 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26  f( p->aAltMap &&
17860 20 28 69 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74   (iMap = p->aAlt
17870 4d 61 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30  Map[1+*piCol])>0
17880 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
17890 3d 20 70 2d 3e 70 41 6c 74 43 75 72 73 6f 72 3b  = p->pAltCursor;
178a0 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20  .        *piCol 
178b0 3d 20 69 4d 61 70 20 2d 20 31 3b 0a 20 20 20 20  = iMap - 1;.    
178c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
178d0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
178e0 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
178f0 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28  eDeferredMoveto(
17900 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
17910 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
17920 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
17930 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  uc.pCursor) ){. 
17940 20 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64       return hand
17950 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
17960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17970 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17980 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
17990 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
179a0 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
179b0 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
179c0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
179d0 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
179e0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
179f0 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
17a00 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
17a10 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
17a20 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
17a30 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
17a40 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
17a50 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
17a60 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
17a70 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
17a80 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
17a90 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
17aa0 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
17ab0 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
17ac0 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
17ad0 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
17ae0 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
17af0 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
17b00 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
17b10 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
17b20 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
17b30 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
17b40 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
17b50 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
17b60 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
17b70 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
17b80 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
17b90 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
17ba0 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
17bb0 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
17bc0 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
17bd0 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
17be0 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
17bf0 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
17c00 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
17c10 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
17c20 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
17c30 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
17c40 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
17c50 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61  data blob separa
17c60 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
17c70 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
17c80 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
17c90 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
17ca0 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
17cb0 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
17cc0 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
17cd0 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
17ce0 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
17cf0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
17d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
17d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
17d20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
17d30 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
17d40 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
17d50 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
17d60 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
17d70 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
17d80 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
17d90 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
17da0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
17db0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
17dc0 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
17df0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17e00 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
17e10 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
17e20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17e30 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e50 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
17e60 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
17e70 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
17e90 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
17ea0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
17eb0 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
17ec0 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
17ed0 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
17ee0 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
17f00 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
17f10 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
17f20 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
17f30 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
17f40 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
17f50 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
17f60 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f80 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
17f90 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
17fa0 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
17fb0 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
17fc0 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
17fd0 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
17fe0 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
17ff0 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
18000 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
18010 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
18020 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
18030 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
18040 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
18050 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
18060 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
18070 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
18080 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
18090 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
180a0 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
180b0 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
180c0 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
180d0 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
180e0 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
180f0 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e  ormat, u32 *pLen
18100 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
18110 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
18120 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74  u32 n;..  assert
18130 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69  ( pLen!=0 );.  i
18140 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
18150 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  l ){.    *pLen =
18160 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   0;.    return 0
18170 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
18180 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  s&MEM_Int ){.   
18190 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
181a0 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c  hether to use 1,
181b0 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79   2, 4, 6 or 8 by
181c0 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69  tes. */.#   defi
181d0 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28  ne MAX_6BYTE (((
181e0 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29  (i64)0x00008000)
181f0 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34  <<32)-1).    i64
18200 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   i = pMem->u.i;.
18210 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69      u64 u;.    i
18220 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
18230 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73  u = ~i;.    }els
18240 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a  e{.      u = i;.
18250 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c      }.    if( u<
18260 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20 69 66  =127 ){.      if
18270 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69  ( (i&1)==i && fi
18280 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
18290 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20          *pLen = 
182a0 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
182b0 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20 20 20  n 8+(u32)u;.    
182c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
182d0 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20 20 20   *pLen = 1;.    
182e0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
182f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
18300 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 7b 20  if( u<=32767 ){ 
18310 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74 75 72  *pLen = 2; retur
18320 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 2; }.    if( u
18330 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a 70 4c  <=8388607 ){ *pL
18340 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e 20 33  en = 3; return 3
18350 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 32  ; }.    if( u<=2
18360 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a 70 4c  147483647 ){ *pL
18370 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e 20 34  en = 4; return 4
18380 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d  ; }.    if( u<=M
18390 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70 4c 65  AX_6BYTE ){ *pLe
183a0 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20 35 3b  n = 6; return 5;
183b0 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38   }.    *pLen = 8
183c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
183d0 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
183e0 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
183f0 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72  *pLen = 8;.    r
18400 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
18410 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
18420 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
18430 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
18440 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61  MEM_Blob) );.  a
18450 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d  ssert( pMem->n>=
18460 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29  0 );.  n = (u32)
18470 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66  pMem->n;.  if( f
18480 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
18490 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d  ){.    n += pMem
184a0 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20  ->u.nZero;.  }. 
184b0 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72 65   *pLen = n;.  re
184c0 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32  turn ((n*2) + 12
184d0 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53   + ((flags&MEM_S
184e0 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a  tr)!=0));.}../*.
184f0 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66 6f 72  ** The sizes for
18500 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 6c 65   serial types le
18510 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73  ss than 128.*/.s
18520 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 73  tatic const u8 s
18530 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
18540 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  izes[] = {.     
18550 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20 20 32     /*  0   1   2
18560 20 20 20 33 20 20 20 34 20 20 20 35 20 20 20 36     3   4   5   6
18570 20 20 20 37 20 20 20 38 20 20 20 39 20 2a 2f 20     7   8   9 */ 
18580 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30    ./*   0 */   0
18590 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34  ,  1,  2,  3,  4
185a0 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20 20 30  ,  6,  8,  8,  0
185b0 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20  ,  0,./*  10 */ 
185c0 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
185d0 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c    1,  1,  2,  2,
185e0 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20    3,  3,./*  20 
185f0 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35 2c 20  */   4,  4,  5, 
18600 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37 2c 20   5,  6,  6,  7, 
18610 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20   7,  8,  8,./*  
18620 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31  30 */   9,  9, 1
18630 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c 20 31  0, 10, 11, 11, 1
18640 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f  2, 12, 13, 13,./
18650 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20 31 34  *  40 */  14, 14
18660 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20 31 36  , 15, 15, 16, 16
18670 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20 31 38  , 17, 17, 18, 18
18680 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c  ,./*  50 */  19,
18690 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c   19, 20, 20, 21,
186a0 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c   21, 22, 22, 23,
186b0 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20   23,./*  60 */  
186c0 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35 2c 20  24, 24, 25, 25, 
186d0 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37 2c 20  26, 26, 27, 27, 
186e0 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a  28, 28,./*  70 *
186f0 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c 20 33  /  29, 29, 30, 3
18700 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c 20 33  0, 31, 31, 32, 3
18710 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38  2, 33, 33,./*  8
18720 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20 33 35  0 */  34, 34, 35
18730 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20 33 37  , 35, 36, 36, 37
18740 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a  , 37, 38, 38,./*
18750 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c    90 */  39, 39,
18760 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c   40, 40, 41, 41,
18770 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c   42, 42, 43, 43,
18780 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34 2c 20  ./* 100 */  44, 
18790 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36 2c 20  44, 45, 45, 46, 
187a0 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38 2c 20  46, 47, 47, 48, 
187b0 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34  48,./* 110 */  4
187c0 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c 20 35  9, 49, 50, 50, 5
187d0 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c 20 35  1, 51, 52, 52, 5
187e0 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f  3, 53,./* 120 */
187f0 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20 35 35    54, 54, 55, 55
18800 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20 35 37  , 56, 56, 57, 57
18810 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .};../*.** Retur
18820 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
18830 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
18840 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
18850 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
18860 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
18870 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
18880 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
18890 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
188a0 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a  al_type>=128 ){.
188b0 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
188c0 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
188d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
188e0 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
188f0 31 32 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  12 .            
18900 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  || sqlite3SmallT
18910 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
18920 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74  type]==(serial_t
18930 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20  ype - 12)/2 );. 
18940 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
18950 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
18960 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
18970 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33 56 64  }.}.u8 sqlite3Vd
18980 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54  beOneByteSerialT
18990 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69 61 6c  ypeLen(u8 serial
189a0 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  _type){.  assert
189b0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
189c0 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  8 );.  return sq
189d0 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
189e0 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
189f0 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ;  .}../*.** If 
18a00 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63  we are on an arc
18a10 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d  hitecture with m
18a20 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61  ixed-endian floa
18a30 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20  ting .** points 
18a40 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20  (ex: ARM7) then 
18a50 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34  swap the lower 4
18a60 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20   bytes with the 
18a70 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65  .** upper 4 byte
18a80 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  s.  Return the r
18a90 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  esult..**.** For
18aa0 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75   most architectu
18ab0 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e  res, this is a n
18ac0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74  o-op..**.** (lat
18ad0 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f  er):  It is repo
18ae0 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20  rted to me that 
18af0 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  the mixed-endian
18b00 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41   problem.** on A
18b10 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20  RM7 is an issue 
18b20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69  with GCC, not wi
18b30 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70  th the ARM7 chip
18b40 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74  .  It seems.** t
18b50 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f  hat early versio
18b60 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64  ns of GCC stored
18b70 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f   the two words o
18b80 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c  f a 64-bit.** fl
18b90 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67  oat in the wrong
18ba0 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61   order.  And tha
18bb0 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  t error has been
18bc0 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65   propagated.** e
18bd0 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20  ver since.  The 
18be0 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63  blame is not nec
18bf0 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43  essarily with GC
18c00 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43  C, though..** GC
18c10 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73  C might have jus
18c20 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72  t copying the pr
18c30 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69  oblem from a pri
18c40 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20  or compiler..** 
18c50 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74  I am also told t
18c60 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f  hat newer versio
18c70 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66  ns of GCC that f
18c80 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e  ollow a differen
18c90 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65  t.** ABI get the
18ca0 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68   byte order righ
18cb0 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70  t..**.** Develop
18cc0 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65  ers using SQLite
18cd0 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75   on an ARM7 shou
18ce0 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72  ld compile and r
18cf0 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c  un their.** appl
18d00 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44  ication using -D
18d10 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61  SQLITE_DEBUG=1 a
18d20 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57  t least once.  W
18d30 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61  ith DEBUG.** ena
18d40 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72  bled, some asser
18d50 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e  ts below will en
18d60 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79  sure that the by
18d70 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66  te order of.** f
18d80 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
18d90 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e  lues is correct.
18da0 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d  .**.** (2007-08-
18db0 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56  30)  Frank van V
18dc0 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20  ugt has studied 
18dd0 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f  this problem clo
18de0 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20  sely.** and has 
18df0 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67  send his finding
18e00 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20  s to the SQLite 
18e10 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61  developers.  Fra
18e20 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61  nk.** writes tha
18e30 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72  t some Linux ker
18e40 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74  nels offer float
18e50 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61  ing point hardwa
18e60 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20  re.** emulation 
18e70 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33  that uses only 3
18e80 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20  2-bit mantissas 
18e90 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c  instead of a ful
18ea0 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73  l .** 48-bits as
18eb0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
18ec0 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20   IEEE standard. 
18ed0 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a   (This is the.**
18ee0 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54   CONFIG_FPE_FAST
18ef0 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e  FPE option.)  On
18f00 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66   such systems, f
18f10 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
18f20 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62   byte swapping b
18f30 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70  ecomes very comp
18f40 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f  licated.  To avo
18f50 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20  id problems,.** 
18f60 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79  the necessary by
18f70 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63  te swapping is c
18f80 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67  arried out using
18f90 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
18fa0 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  r.** rather than
18fb0 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e   a 64-bit float.
18fc0 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20    Frank assures 
18fd0 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  us that the code
18fe0 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66   here.** works f
18ff0 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65  or him.  We, the
19000 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76   developers, hav
19010 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65  e no way to inde
19020 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72  pendently.** ver
19030 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72  ify this, but Fr
19040 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f  ank seems to kno
19050 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c  w what he is tal
19060 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f  king about.** so
19070 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a   we trust him..*
19080 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19090 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
190a0 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20  IT_FLOAT.static 
190b0 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36  u64 floatSwap(u6
190c0 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b  4 in){.  union {
190d0 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
190e0 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b  u32 i[2];.  } u;
190f0 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72  .  u32 t;..  u.r
19100 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69   = in;.  t = u.i
19110 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20  [0];.  u.i[0] = 
19120 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d  u.i[1];.  u.i[1]
19130 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75   = t;.  return u
19140 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73  .r;.}.# define s
19150 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
19160 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61  oat(X)  X = floa
19170 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23  tSwap(X).#else.#
19180 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
19190 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a  dEndianFloat(X).
191a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
191b0 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a  ite the serializ
191c0 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72  ed data blob for
191d0 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
191e0 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a  d in pMem into .
191f0 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73  ** buf. It is as
19200 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
19210 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61  aller has alloca
19220 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73  ted sufficient s
19230 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pace..** Return 
19240 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
19250 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a  tes written..**.
19260 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61  ** nBuf is the a
19270 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c  mount of space l
19280 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54  eft in buf[].  T
19290 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
192a0 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20  ponsible.** for 
192b0 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67  allocating enoug
192c0 68 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d  h space to buf[]
192d0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74   to hold the ent
192e0 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75  ire field, exclu
192f0 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  sive.** of the p
19300 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74  Mem->u.nZero byt
19310 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72  es for a MEM_Zer
19320 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52  o value..**.** R
19330 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
19340 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
19350 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
19360 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
19370 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
19380 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
19390 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
193a0 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
193b0 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
193c0 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
193d0 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
193e0 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69  []..*/ .u32 sqli
193f0 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
19400 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70  (u8 *buf, Mem *p
19410 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f  Mem, u32 serial_
19420 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e  type){.  u32 len
19430 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  ;..  /* Integer 
19440 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66  and Real */.  if
19450 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37  ( serial_type<=7
19460 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e   && serial_type>
19470 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a  0 ){.    u64 v;.
19480 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69      u32 i;.    i
19490 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
194a0 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  7 ){.      asser
194b0 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69  t( sizeof(v)==si
194c0 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20  zeof(pMem->u.r) 
194d0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
194e0 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20  &v, &pMem->u.r, 
194f0 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
19500 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
19510 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
19520 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
19530 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
19540 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
19550 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
19560 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
19570 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ];.    assert( i
19580 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  >0 );.    do{.  
19590 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28      buf[--i] = (
195a0 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
195b0 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
195c0 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20 20  }while( i );.   
195d0 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
195e0 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
195f0 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
19600 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
19610 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
19620 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
19630 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
19640 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a  )?pMem->u.nZero:
19650 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
19660 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56  == (int)sqlite3V
19670 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
19680 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
19690 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d  .    len = pMem-
196a0 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e  >n;.    if( len>
196b0 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66 2c 20  0 ) memcpy(buf, 
196c0 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
196d0 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
196e0 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
196f0 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
19700 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
19710 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22  .}../* Input "x"
19720 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   is a sequence o
19730 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61  f unsigned chara
19740 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65  cters that repre
19750 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e  sent a.** big-en
19760 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52  dian integer.  R
19770 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61  eturn the equiva
19780 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65  lent native inte
19790 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f  ger.*/.#define O
197a0 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  NE_BYTE_INT(x)  
197b0 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23    ((i8)(x)[0]).#
197c0 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f  define TWO_BYTE_
197d0 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28  INT(x)    (256*(
197e0 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b  i8)((x)[0])|(x)[
197f0 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45  1]).#define THRE
19800 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28  E_BYTE_INT(x)  (
19810 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30  65536*(i8)((x)[0
19820 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28  ])|((x)[1]<<8)|(
19830 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[2]).#define F
19840 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29  OUR_BYTE_UINT(x)
19850 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c    (((u32)(x)[0]<
19860 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  <24)|((x)[1]<<16
19870 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
19880 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[3]).#define FO
19890 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28  UR_BYTE_INT(x) (
198a0 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78  16777216*(i8)((x
198b0 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  )[0])|((x)[1]<<1
198c0 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
198d0 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  x)[3])../*.** De
198e0 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
198f0 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
19900 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
19910 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
19920 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
19930 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
19940 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
19950 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
19960 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
19970 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
19980 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77  mplemented as tw
19990 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  o separate routi
199a0 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61  nes for performa
199b0 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20  nce..** The few 
199c0 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69  cases that requi
199d0 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  re local variabl
199e0 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75  es are broken ou
199f0 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74  t into a separat
19a00 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20  e.** routine so 
19a10 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73  that in most cas
19a20 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  es the overhead 
19a30 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74  of moving the st
19a40 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69  ack pointer.** i
19a50 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73  s avoided..*/ .s
19a60 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54 45  tatic u32 SQLITE
19a70 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c  _NOINLINE serial
19a80 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
19a90 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
19aa0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
19ab0 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
19ac0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
19ad0 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
19ae0 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
19af0 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
19b00 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
19b10 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
19b20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
19b30 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
19b40 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
19b50 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
19b60 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20  YTE_UINT(buf);. 
19b70 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59   u32 y = FOUR_BY
19b80 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a  TE_UINT(buf+4);.
19b90 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20    x = (x<<32) + 
19ba0 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  y;.  if( serial_
19bb0 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f  type==6 ){.    /
19bc0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19bd0 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c  -29851-52272 Val
19be0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
19bf0 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  an 64-bit.    **
19c00 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
19c10 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
19c20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
19c30 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d  64*)&x;.    pMem
19c40 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
19c50 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  t;.    testcase(
19c60 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
19c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
19c80 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
19c90 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65  7343-49114 Value
19ca0 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
19cb0 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20 36   IEEE 754-2008 6
19cc0 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f  4-bit.    ** flo
19cd0 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62  ating point numb
19ce0 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  er. */.#if !defi
19cf0 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
19d00 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
19d10 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
19d20 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  NT).    /* Verif
19d30 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
19d40 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
19d50 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
19d60 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79  e same.    ** by
19d70 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
19d80 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
19d90 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
19da0 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a  _FLOAT is.    **
19db0 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
19dc0 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
19dd0 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
19de0 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
19df0 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a  ** endian..    *
19e00 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
19e10 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
19e20 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
19e30 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  2;.    static co
19e40 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
19e50 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20  1.0;.    u64 t2 
19e60 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69  = t1;.    swapMi
19e70 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
19e80 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2);.    assert( 
19e90 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
19ea0 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
19eb0 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
19ec0 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
19ed0 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
19ee0 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
19ef0 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
19f00 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70  )==8 );.    swap
19f10 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
19f20 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (x);.    memcpy(
19f30 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20  &pMem->u.r, &x, 
19f40 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
19f50 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71  pMem->flags = sq
19f60 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d  lite3IsNaN(pMem-
19f70 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  >u.r) ? MEM_Null
19f80 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d   : MEM_Real;.  }
19f90 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75  .  return 8;.}.u
19fa0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
19fb0 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
19fc0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19fd0 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
19fe0 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
19ff0 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
1a000 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
1a010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
1a020 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
1a030 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
1a040 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
1a050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
1a060 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
1a070 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
1a080 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
1a090 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
1a0a0 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
1a0b0 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
1a0c0 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
1a0d0 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
1a0e0 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
1a0f0 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
1a100 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f  0: {  /* Null */
1a110 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1a120 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30  CE-OF: R-24078-0
1a130 39 33 37 35 20 56 61 6c 75 65 20 69 73 20 61 20  9375 Value is a 
1a140 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70  NULL. */.      p
1a150 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1a160 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
1a170 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1a180 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  se 1: {.      /*
1a190 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a1a0 34 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75  44885-25196 Valu
1a1b0 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77  e is an 8-bit tw
1a1c0 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20  os-complement.  
1a1d0 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
1a1e0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1a1f0 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  .i = ONE_BYTE_IN
1a200 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
1a210 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1a220 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1a230 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1a240 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1a250 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
1a260 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
1a270 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1a280 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1a290 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39  DENCE-OF: R-4979
1a2a0 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69 73  4-35026 Value is
1a2b0 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36   a big-endian 16
1a2c0 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
1a2d0 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
1a2e0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1a2f0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f  pMem->u.i = TWO_
1a300 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1a310 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1a320 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1a330 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1a340 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1a350 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
1a360 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
1a370 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
1a380 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1a390 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1a3a0 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56   R-37839-54301 V
1a3b0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1a3c0 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20  dian 24-bit.    
1a3d0 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1a3e0 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1a3f0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1a400 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
1a410 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
1a420 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1a430 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1a440 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1a450 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1a460 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
1a470 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
1a480 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1a490 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1a4a0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34  DENCE-OF: R-0184
1a4b0 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69 73  9-26079 Value is
1a4c0 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32   a big-endian 32
1a4d0 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
1a4e0 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
1a4f0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1a500 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
1a510 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1a520 23 69 66 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a  #ifdef __HP_cc .
1a530 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72        /* Work ar
1a540 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65 78 74 65  ound a sign-exte
1a550 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20 74 68 65  nsion bug in the
1a560 20 48 50 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72   HP compiler for
1a570 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20   HP/UX */.      
1a580 69 66 28 20 62 75 66 5b 30 5d 26 30 78 38 30 20  if( buf[0]&0x80 
1a590 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30  ) pMem->u.i |= 0
1a5a0 78 66 66 66 66 66 66 66 66 38 30 30 30 30 30 30  xffffffff8000000
1a5b0 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  0LL;.#endif.    
1a5c0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1a5d0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
1a5e0 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1a5f0 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1a600 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20  turn 4;.    }.  
1a610 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
1a620 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1a630 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
1a640 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a650 35 30 33 38 35 2d 30 39 36 37 34 20 56 61 6c 75  50385-09674 Valu
1a660 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1a670 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 48-bit.      *
1a680 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1a690 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1a6a0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1a6b0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
1a6c0 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  uf+2) + (((i64)1
1a6d0 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
1a6e0 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
1a6f0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1a700 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
1a710 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
1a720 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
1a730 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
1a740 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
1a750 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1a760 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
1a770 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
1a780 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
1a790 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65      /* These use
1a7a0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
1a7b0 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20  , so do them in 
1a7c0 61 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  a separate routi
1a7d0 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ne.      ** to a
1a7e0 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d  void having to m
1a7f0 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f  ove the frame po
1a800 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d  inter in the com
1a810 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  mon case */.    
1a820 20 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47    return serialG
1a830 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79  et(buf,serial_ty
1a840 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  pe,pMem);.    }.
1a850 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
1a860 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
1a870 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
1a880 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
1a890 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1a8a0 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32 38 39  OF: R-12976-2289
1a8b0 33 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69  3 Value is the i
1a8c0 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20  nteger 0. */.   
1a8d0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a8e0 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31 32 31  F: R-18143-12121
1a8f0 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e   Value is the in
1a900 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20  teger 1. */.    
1a910 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65    pMem->u.i = se
1a920 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20  rial_type-8;.   
1a930 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1a940 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1a950 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1a960 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
1a970 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1a980 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33 31 35  -OF: R-14606-315
1a990 36 34 20 56 61 6c 75 65 20 69 73 20 61 20 42 4c  64 Value is a BL
1a9a0 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d 31 32  OB that is (N-12
1a9b0 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20 20 20  )/2 bytes in.   
1a9c0 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20     ** length..  
1a9d0 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
1a9e0 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30 31 34  OF: R-28401-0014
1a9f0 30 20 56 61 6c 75 65 20 69 73 20 61 20 73 74 72  0 Value is a str
1aa00 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78 74 20  ing in the text 
1aa10 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20  encoding and.   
1aa20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62     ** (N-13)/2 b
1aa30 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
1aa40 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
1aa50 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b  const u16 aFlag[
1aa60 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d  ] = { MEM_Blob|M
1aa70 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74  EM_Ephem, MEM_St
1aa80 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20  r|MEM_Ephem };. 
1aa90 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
1aaa0 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20  char *)buf;.    
1aab0 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72    pMem->n = (ser
1aac0 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
1aad0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1aae0 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c  s = aFlag[serial
1aaf0 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20  _type&1];.      
1ab00 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a  return pMem->n;.
1ab10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1ab20 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68  rn 0;.}./*.** Th
1ab30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1ab40 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
1ab50 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
1ab60 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52  for an UnpackedR
1ab70 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
1ab80 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  re large enough 
1ab90 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20  to be used with 
1aba0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1abb0 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20  dUnpack() if.** 
1abc0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1abd0 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
1abe0 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  to KeyInfo struc
1abf0 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a  ture pKeyInfo..*
1ac00 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69  *.** The space i
1ac10 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74  s either allocat
1ac20 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
1ac30 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72  DbMallocRaw() or
1ac40 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20   from within.** 
1ac50 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75  the unaligned bu
1ac60 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20  ffer passed via 
1ac70 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74  the second and t
1ac80 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28  hird arguments (
1ac90 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74  presumably.** st
1aca0 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74  ack space). If t
1acb0 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20  he former, then 
1acc0 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
1acd0 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74  o a pointer that
1ace0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76   should.** be ev
1acf0 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62  entually freed b
1ad00 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
1ad10 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
1ad20 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a  (). Or, if the .
1ad30 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f  ** allocation co
1ad40 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70  mes from the pSp
1ad50 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66  ace/szSpace buff
1ad60 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73  er, *ppFree is s
1ad70 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65  et to NULL.** be
1ad80 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1ad90 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
1ada0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
1adb0 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
1adc0 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  */.UnpackedRecor
1add0 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c  d *sqlite3VdbeAl
1ade0 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
1adf0 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  d(.  KeyInfo *pK
1ae00 65 79 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20  eyInfo          
1ae10 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
1ae20 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72  ion of the recor
1ae30 64 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b  d */.){.  Unpack
1ae40 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20  edRecord *p;    
1ae50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70            /* Unp
1ae60 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20  acked record to 
1ae70 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
1ae80 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1aea0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
1aeb0 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a  equired for *p *
1aec0 2f 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  /.  nByte = ROUN
1aed0 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
1aee0 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a  edRecord)) + siz
1aef0 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e  eof(Mem)*(pKeyIn
1af00 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20  fo->nField+1);. 
1af10 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
1af20 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62  cord *)sqlite3Db
1af30 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
1af40 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
1af50 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1af60 6e 20 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d  n 0;.  p->aMem =
1af70 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29   (Mem*)&((char*)
1af80 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)[ROUND8(sizeof
1af90 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
1afa0 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  )];.  assert( pK
1afb0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1afc0 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b  er!=0 );.  p->pK
1afd0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
1afe0 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
1aff0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1b000 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d + 1;.  return 
1b010 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
1b020 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20  n the nKey-byte 
1b030 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65  encoding of a re
1b040 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20  cord in pKey[], 
1b050 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a  populate the .**
1b060 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1b070 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61  structure indica
1b080 74 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74  ted by the fourt
1b090 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  h argument with 
1b0a0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1b0b0 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72  of the decoded r
1b0c0 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20  ecord..*/ .void 
1b0d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1b0e0 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
1b0f0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1b100 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1b110 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
1b120 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
1b130 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
1b140 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1b150 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
1b160 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
1b170 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
1b180 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
1b190 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  rd */.  Unpacked
1b1a0 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f  Record *p      /
1b1b0 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20  * Populate this 
1b1c0 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65  structure before
1b1d0 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29   returning. */.)
1b1e0 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
1b1f0 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
1b200 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1b210 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69  char *)pKey;.  i
1b220 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78  nt d; .  u32 idx
1b230 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b240 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1b250 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20  et in aKey[] to 
1b260 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1b270 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  16 u;           
1b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b290 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
1b2a0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
1b2b0 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
1b2c0 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a  Mem = p->aMem;..
1b2d0 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20    p->default_rc 
1b2e0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45  = 0;.  assert( E
1b2f0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
1b300 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
1b310 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1b320 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1b330 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
1b340 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
1b350 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b  x<szHdr && d<=nK
1b360 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ey ){.    u32 se
1b370 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
1b380 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
1b390 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73  32(&aKey[idx], s
1b3a0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1b3b0 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
1b3c0 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
1b3d0 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
1b3e0 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20  nfo->db;.    /* 
1b3f0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  pMem->flags = 0;
1b400 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53   // sqlite3VdbeS
1b410 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20  erialGet() will 
1b420 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20  set this for us 
1b430 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d  */.    pMem->szM
1b440 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70  alloc = 0;.    p
1b450 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20  Mem->z = 0;.    
1b460 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d += sqlite3Vdbe
1b470 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b  SerialGet(&aKey[
1b480 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  d], serial_type,
1b490 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d   pMem);.    pMem
1b4a0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75  ++;.    if( (++u
1b4b0 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62  )>=p->nField ) b
1b4c0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  reak;.  }.  asse
1b4d0 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d  rt( u<=pKeyInfo-
1b4e0 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  >nField + 1 );. 
1b4f0 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
1b500 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  }..#if SQLITE_DE
1b510 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  BUG./*.** This f
1b520 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
1b530 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61   two index or ta
1b540 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20  ble record keys 
1b550 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a  in the same way.
1b560 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  ** as the sqlite
1b570 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1b580 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e  re() routine. Un
1b590 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43  like VdbeRecordC
1b5a0 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69  ompare(),.** thi
1b5b0 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
1b5c0 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70  ializes and comp
1b5d0 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e  ares values usin
1b5e0 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  g the.** sqlite3
1b5f0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1b600 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  and sqlite3MemCo
1b610 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e  mpare() function
1b620 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a  s. It is used.**
1b630 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   in assert() sta
1b640 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72  tements to ensur
1b650 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  e that the optim
1b660 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20  ized code in.** 
1b670 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1b680 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72  dCompare() retur
1b690 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68 20  ns results with 
1b6a0 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74  these two primit
1b6b0 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ives..**.** Retu
1b6c0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72  rn true if the r
1b6d0 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
1b6e0 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e  son is equivalen
1b6f0 74 20 74 6f 20 64 65 73 69 72 65 64 52 65 73 75  t to desiredResu
1b700 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  lt..** Return fa
1b710 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73 20  lse if there is 
1b720 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a  a disagreement..
1b730 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
1b740 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1b750 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ebug(.  int nKey
1b760 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1b770 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
1b780 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70  y */.  const Unp
1b790 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1b7a0 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65  ey2, /* Right ke
1b7b0 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72  y */.  int desir
1b7c0 65 64 52 65 73 75 6c 74 20 20 20 20 20 20 20 20  edResult        
1b7d0 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20       /* Correct 
1b7e0 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75  answer */.){.  u
1b7f0 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20  32 d1;          
1b800 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1b810 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1b820 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
1b830 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
1b840 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1b850 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1b860 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e  xt header elemen
1b870 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  t */.  u32 szHdr
1b880 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  1;        /* Num
1b890 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1b8a0 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
1b8b0 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  i = 0;.  int rc 
1b8c0 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  = 0;.  const uns
1b8d0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1b8e0 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
1b8f0 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
1b900 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
1b910 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d  yInfo;.  Mem mem
1b920 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  1;..  pKeyInfo =
1b930 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1b940 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66  o;.  if( pKeyInf
1b950 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72  o->db==0 ) retur
1b960 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20  n 1;.  mem1.enc 
1b970 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1b980 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65  .  mem1.db = pKe
1b990 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20  yInfo->db;.  /* 
1b9a0 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20  mem1.flags = 0; 
1b9b0 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74   // Will be init
1b9c0 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74  ialized by sqlit
1b9d0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1b9e0 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) */.  VVA_ONLY(
1b9f0 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d   mem1.szMalloc =
1ba00 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
1ba10 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
1ba20 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a   statements */..
1ba30 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d    /* Compilers m
1ba40 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74  ay complain that
1ba50 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74   mem1.u.i is pot
1ba60 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69  entially uniniti
1ba70 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20  alized..  ** We 
1ba80 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65  could initialize
1ba90 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65   it, as shown he
1baa0 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74  re, to silence t
1bab0 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e  hose complaints.
1bac0 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63  .  ** But in fac
1bad0 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c  t, mem1.u.i will
1bae0 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20   never actually 
1baf0 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61  be used uninitia
1bb00 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67  lized, and doing
1bb10 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63   .  ** the unnec
1bb20 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a  essary initializ
1bb30 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73  ation has a meas
1bb40 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20  urable negative 
1bb50 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a  performance.  **
1bb60 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74   impact, since t
1bb70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1bb80 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65   very high runne
1bb90 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63  r.  And so, we c
1bba0 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67  hoose.  ** to ig
1bbb0 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  nore the compile
1bbc0 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c  r warnings and l
1bbd0 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62  eave this variab
1bbe0 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  le uninitialized
1bbf0 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d  ..  */.  /*  mem
1bc00 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e  1.u.i = 0;  // n
1bc10 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20  ot needed, here 
1bc20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69  to silence compi
1bc30 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20  ler warning */. 
1bc40 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61   .  idx1 = getVa
1bc50 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
1bc60 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48  Hdr1);.  if( szH
1bc70 64 72 31 3e 39 38 33 30 37 20 29 20 72 65 74 75  dr1>98307 ) retu
1bc80 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1bc90 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  T;.  d1 = szHdr1
1bca0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1bcb0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65  Info->nField+pKe
1bcc0 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d  yInfo->nXField>=
1bcd0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c  pPKey2->nField |
1bce0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1bcf0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1bd00 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1bd10 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1bd20 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e  KeyInfo->nField>
1bd30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1bd40 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
1bd50 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
1bd60 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
1bd70 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a  l_type1;..    /*
1bd80 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
1bd90 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
1bda0 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
1bdb0 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
1bdc0 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e  idx1 += getVarin
1bdd0 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  t32( aKey1+idx1,
1bde0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
1bdf0 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ..    /* Verify 
1be00 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e  that there is en
1be10 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72  ough key space r
1be20 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69  emaining to avoi
1be30 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65  d.    ** a buffe
1be40 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65  r overread.  The
1be50 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65   "d1+serial_type
1be60 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69  1+2" subexpressi
1be70 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61  on will.    ** a
1be80 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72  lways be greater
1be90 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1bea0 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  o the amount of 
1beb0 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61  required key spa
1bec0 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74  ce..    ** Use t
1bed0 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f  hat approximatio
1bee0 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d  n to avoid the m
1bef0 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61  ore expensive ca
1bf00 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
1bf10 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1bf20 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63  peLen() in the c
1bf30 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20  ommon case..    
1bf40 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65  */.    if( d1+se
1bf50 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33  rial_type1+2>(u3
1bf60 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20  2)nKey1.     && 
1bf70 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65  d1+sqlite3VdbeSe
1bf80 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
1bf90 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e  al_type1)>(u32)n
1bfa0 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20  Key1 .    ){.   
1bfb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1bfc0 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
1bfd0 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  the values to be
1bfe0 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a   compared..    *
1bff0 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
1c000 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1c010 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1c020 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
1c030 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
1c040 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
1c050 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1c060 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
1c070 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61  mem1, &pPKey2->a
1c080 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f  Mem[i], pKeyInfo
1c090 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20  ->aColl[i]);.   
1c0a0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1c0b0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
1c0c0 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  .szMalloc==0 ); 
1c0d0 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
1c0e0 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  below */.      i
1c0f0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
1c100 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
1c110 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20        rc = -rc; 
1c120 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72   /* Invert the r
1c130 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73  esult for DESC s
1c140 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20  ort order. */.  
1c150 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1c160 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64   debugCompareEnd
1c170 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
1c180 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
1c190 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
1c1a0 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20  y2->nField );.. 
1c1b0 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
1c1c0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
1c1d0 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
1c1e0 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
1c1f0 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
1c200 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
1c210 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
1c220 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
1c230 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
1c240 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
1c250 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
1c260 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1c270 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  mem1)..  */.  as
1c280 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1c290 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
1c2a0 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
1c2b0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
1c2c0 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
1c2d0 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
1c2e0 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
1c2f0 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
1c300 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
1c310 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f  urn the default_
1c320 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  rc.  ** value.  
1c330 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32  */.  rc = pPKey2
1c340 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64  ->default_rc;..d
1c350 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a  ebugCompareEnd:.
1c360 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1c370 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20  ult==0 && rc==0 
1c380 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1c390 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c  ( desiredResult<
1c3a0 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74 75  0 && rc<0 ) retu
1c3b0 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69  rn 1;.  if( desi
1c3c0 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72  redResult>0 && r
1c3d0 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  c>0 ) return 1;.
1c3e0 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42    if( CORRUPT_DB
1c3f0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1c400 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  f( pKeyInfo->db-
1c410 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1c420 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
1c430 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
1c440 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
1c450 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
1c460 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1c470 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e  s (a.k.a. column
1c480 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  s) in the record
1c490 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65   given by.** pKe
1c4a0 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72  y,nKey.  The ver
1c4b0 69 66 79 20 74 68 61 74 20 74 68 69 73 20 63 6f  ify that this co
1c4c0 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  unt is less than
1c4d0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1c4e0 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20  .** limit given 
1c4f0 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  by pKeyInfo->nFi
1c500 65 6c 64 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld + pKeyInfo->
1c510 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49  nXField..**.** I
1c520 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  f this constrain
1c530 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69  t is not satisfi
1c540 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ed, it means tha
1c550 74 20 74 68 65 20 68 69 67 68 2d 73 70 65 65 64  t the high-speed
1c560 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f  .** vdbeRecordCo
1c570 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76  mpareInt() and v
1c580 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c590 53 74 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65  String() routine
1c5a0 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f  s will.** not wo
1c5b0 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49  rk correctly.  I
1c5c0 66 20 74 68 69 73 20 61 73 73 65 72 74 28 29 20  f this assert() 
1c5d0 65 76 65 72 20 66 69 72 65 73 2c 20 69 74 20 70  ever fires, it p
1c5e0 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a  robably means.**
1c5f0 20 74 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66   that the KeyInf
1c600 6f 2e 6e 46 69 65 6c 64 20 6f 72 20 4b 65 79 49  o.nField or KeyI
1c610 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75  nfo.nXField valu
1c620 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64  es were computed
1c630 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  .** incorrectly.
1c640 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c650 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1c660 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1c670 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f  (.  int nKey, co
1c680 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1c690 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
1c6a0 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20  to verify */ .  
1c6b0 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70  const KeyInfo *p
1c6c0 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a  KeyInfo       /*
1c6d0 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69   Compare size wi
1c6e0 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20  th this KeyInfo 
1c6f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65  */.){.  int nFie
1c700 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a  ld = 0;.  u32 sz
1c710 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a  Hdr;.  u32 idx;.
1c720 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20    u32 notUsed;. 
1c730 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1c740 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1c750 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1c760 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20  r*)pKey;..  if( 
1c770 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
1c780 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  urn;.  idx = get
1c790 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
1c7a0 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28  zHdr);.  assert(
1c7b0 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
1c7c0 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33  sert( szHdr<=(u3
1c7d0 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c  2)nKey );.  whil
1c7e0 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a  e( idx<szHdr ){.
1c7f0 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
1c800 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c  rint32(aKey+idx,
1c810 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e   notUsed);.    n
1c820 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61  Field++;.  }.  a
1c830 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d  ssert( nField <=
1c840 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1c850 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
1c860 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  eld );.}.#else.#
1c870 20 64 65 66 69 6e 65 20 76 64 62 65 41 73 73 65   define vdbeAsse
1c880 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1c890 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a  inLimits(A,B,C).
1c8a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f  #endif../*.** Bo
1c8b0 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70  th *pMem1 and *p
1c8c0 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72  Mem2 contain str
1c8d0 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70  ing values. Comp
1c8e0 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75  are the two valu
1c8f0 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  es.** using the 
1c900 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1c910 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75  ce pColl. As usu
1c920 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67  al, return a neg
1c930 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20  ative , zero.** 
1c940 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75  or positive valu
1c950 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c  e if *pMem1 is l
1c960 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1c970 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  to or greater th
1c980 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72  an .** *pMem2, r
1c990 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d  espectively. Sim
1c9a0 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74  ilar in spirit t
1c9b0 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29  o "rc = (*pMem1)
1c9c0 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a   - (*pMem2);"..*
1c9d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1c9e0 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1c9f0 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  g(.  const Mem *
1ca00 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d  pMem1,.  const M
1ca10 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e  em *pMem2,.  con
1ca20 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
1ca30 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20  l,.  u8 *prcErr 
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca50 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f       /* If an OO
1ca60 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f  M occurs, set to
1ca70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f   SQLITE_NOMEM */
1ca80 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d  .){.  if( pMem1-
1ca90 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
1caa0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   ){.    /* The s
1cab0 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61  trings are alrea
1cac0 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  dy in the correc
1cad0 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c  t encoding.  Cal
1cae0 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f  l the.     ** co
1caf0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
1cb00 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20  n directly */.  
1cb10 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e    return pColl->
1cb20 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
1cb30 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31  r,pMem1->n,pMem1
1cb40 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65  ->z,pMem2->n,pMe
1cb50 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  m2->z);.  }else{
1cb60 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1cb70 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c   const void *v1,
1cb80 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31   *v2;.    int n1
1cb90 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31  , n2;.    Mem c1
1cba0 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20  ;.    Mem c2;.  
1cbb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1cbc0 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d  Init(&c1, pMem1-
1cbd0 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
1cbe0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1cbf0 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d  emInit(&c2, pMem
1cc00 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1cc10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1cc20 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
1cc30 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f  &c1, pMem1, MEM_
1cc40 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69  Ephem);.    sqli
1cc50 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
1cc60 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32  wCopy(&c2, pMem2
1cc70 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
1cc80 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61    v1 = sqlite3Va
1cc90 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1cca0 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f  _value*)&c1, pCo
1ccb0 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31  ll->enc);.    n1
1ccc0 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63   = v1==0 ? 0 : c
1ccd0 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73 71  1.n;.    v2 = sq
1cce0 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28  lite3ValueText((
1ccf0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26  sqlite3_value*)&
1cd00 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b  c2, pColl->enc);
1cd10 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20  .    n2 = v2==0 
1cd20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20  ? 0 : c2.n;.    
1cd30 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  rc = pColl->xCmp
1cd40 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e  (pColl->pUser, n
1cd50 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a  1, v1, n2, v2);.
1cd60 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c      if( (v1==0 |
1cd70 7c 20 76 32 3d 3d 30 29 20 26 26 20 70 72 63 45  | v2==0) && prcE
1cd80 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53  rr ) *prcErr = S
1cd90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1cda0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1cdb0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29  eMemRelease(&c1)
1cdc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1cdd0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29  eMemRelease(&c2)
1cde0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
1cdf0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
1ce00 65 20 69 6e 70 75 74 20 70 42 6c 6f 62 20 69 73  e input pBlob is
1ce10 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1ce20 65 20 61 20 42 6c 6f 62 20 74 68 61 74 20 69 73  e a Blob that is
1ce30 20 6e 6f 74 20 6d 61 72 6b 65 64 0a 2a 2a 20 77   not marked.** w
1ce40 69 74 68 20 4d 45 4d 5f 5a 65 72 6f 2e 20 20 52  ith MEM_Zero.  R
1ce50 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
1ce60 20 63 6f 75 6c 64 20 62 65 20 61 20 7a 65 72 6f   could be a zero
1ce70 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63  -blob..*/.static
1ce80 20 69 6e 74 20 69 73 41 6c 6c 5a 65 72 6f 28 63   int isAllZero(c
1ce90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
1cea0 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  t n){.  int i;. 
1ceb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
1cec0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
1ced0 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ] ) return 0;.  
1cee0 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
1cef0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1cf00 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72  wo blobs.  Retur
1cf10 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  n negative, zero
1cf20 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
1cf30 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73   the first.** is
1cf40 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1cf50 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
1cf60 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64   than the second
1cf70 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
1cf80 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69  ** If one blob i
1cf90 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
1cfa0 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68  e other, then th
1cfb0 65 20 73 68 6f 72 74 65 72 20 69 73 20 74 68 65  e shorter is the
1cfc0 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   lessor..*/.stat
1cfd0 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
1cfe0 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c  NE int sqlite3Bl
1cff0 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  obCompare(const 
1d000 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20  Mem *pB1, const 
1d010 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74  Mem *pB2){.  int
1d020 20 63 3b 0a 20 20 69 6e 74 20 6e 31 20 3d 20 70   c;.  int n1 = p
1d030 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74 20 6e 32 20  B1->n;.  int n2 
1d040 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20  = pB2->n;..  /* 
1d050 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
1d060 6f 20 68 61 76 65 20 61 20 42 6c 6f 62 20 76 61  o have a Blob va
1d070 6c 75 65 20 74 68 61 74 20 68 61 73 20 73 6f 6d  lue that has som
1d080 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63 6f 6e 74 65  e non-zero conte
1d090 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64  nt.  ** followed
1d0a0 20 62 79 20 7a 65 72 6f 20 63 6f 6e 74 65 6e 74   by zero content
1d0b0 2e 20 20 42 75 74 20 74 68 61 74 20 6f 6e 6c 79  .  But that only
1d0c0 20 63 6f 6d 65 73 20 75 70 20 66 6f 72 20 42 6c   comes up for Bl
1d0d0 6f 62 73 20 66 6f 72 6d 65 64 0a 20 20 2a 2a 20  obs formed.  ** 
1d0e0 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
1d0f0 63 6f 72 64 20 6f 70 63 6f 64 65 2c 20 61 6e 64  cord opcode, and
1d100 20 73 75 63 68 20 42 6c 6f 62 73 20 6e 65 76 65   such Blobs neve
1d110 72 20 67 65 74 20 70 61 73 73 65 64 20 69 6e 74  r get passed int
1d120 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65  o.  ** sqlite3Me
1d130 6d 43 6f 6d 70 61 72 65 28 29 2e 20 2a 2f 0a 20  mCompare(). */. 
1d140 20 61 73 73 65 72 74 28 20 28 70 42 31 2d 3e 66   assert( (pB1->f
1d150 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
1d160 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30 20 29 3b 0a  ==0 || n1==0 );.
1d170 20 20 61 73 73 65 72 74 28 20 28 70 42 32 2d 3e    assert( (pB2->
1d180 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1d190 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d 30 20 29 3b  )==0 || n2==0 );
1d1a0 0a 0a 20 20 69 66 28 20 28 70 42 31 2d 3e 66 6c  ..  if( (pB1->fl
1d1b0 61 67 73 7c 70 42 32 2d 3e 66 6c 61 67 73 29 20  ags|pB2->flags) 
1d1c0 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
1d1d0 20 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73    if( pB1->flags
1d1e0 20 26 20 70 42 32 2d 3e 66 6c 61 67 73 20 26 20   & pB2->flags & 
1d1f0 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
1d200 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e    return pB1->u.
1d210 6e 5a 65 72 6f 20 2d 20 70 42 32 2d 3e 75 2e 6e  nZero - pB2->u.n
1d220 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Zero;.    }else 
1d230 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73 20 26  if( pB1->flags &
1d240 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
1d250 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72     if( !isAllZer
1d260 6f 28 70 42 32 2d 3e 7a 2c 20 70 42 32 2d 3e 6e  o(pB2->z, pB2->n
1d270 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  ) ) return -1;. 
1d280 20 20 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d       return pB1-
1d290 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32 3b 0a 20  >u.nZero - n2;. 
1d2a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d2b0 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70  if( !isAllZero(p
1d2c0 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 29 20 29  B1->z, pB1->n) )
1d2d0 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1d2e0 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 70 42    return n1 - pB
1d2f0 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  2->u.nZero;.    
1d300 7d 0a 20 20 7d 0a 20 20 63 20 3d 20 6d 65 6d 63  }.  }.  c = memc
1d310 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e  mp(pB1->z, pB2->
1d320 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e 32 20 3a 20  z, n1>n2 ? n2 : 
1d330 6e 31 29 3b 0a 20 20 69 66 28 20 63 20 29 20 72  n1);.  if( c ) r
1d340 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75 72  eturn c;.  retur
1d350 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a  n n1 - n2;.}../*
1d360 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72 69  .** Do a compari
1d370 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20 36 34  son between a 64
1d380 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
1d390 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62 69 74  ger and a 64-bit
1d3a0 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 0a   floating-point.
1d3b0 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ** number.  Retu
1d3c0 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  rn negative, zer
1d3d0 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
1d3e0 66 20 74 68 65 20 66 69 72 73 74 20 28 69 36 34  f the first (i64
1d3f0 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 0a  ) is less than,.
1d400 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  ** equal to, or 
1d410 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1d420 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65 29   second (double)
1d430 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d440 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
1d450 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20 64 6f  ompare(i64 i, do
1d460 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28 20 73  uble r){.  if( s
1d470 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c 45  izeof(LONGDOUBLE
1d480 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20 20 20  _TYPE)>8 ){.    
1d490 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20  LONGDOUBLE_TYPE 
1d4a0 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f  x = (LONGDOUBLE_
1d4b0 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66 28 20  TYPE)i;.    if( 
1d4c0 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  x<r ) return -1;
1d4d0 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29 20 72  .    if( x>r ) r
1d4e0 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65  eturn +1;.    re
1d4f0 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
1d500 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20 20 20  .    i64 y;.    
1d510 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20 69 66  double s;.    if
1d520 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33 36 38  ( r<-92233720368
1d530 35 34 37 37 35 38 30 38 2e 30 20 29 20 72 65 74  54775808.0 ) ret
1d540 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28 20  urn +1;.    if( 
1d550 72 3e 39 32 32 33 33 37 32 30 33 36 38 35 34 37  r>92233720368547
1d560 37 35 38 30 37 2e 30 20 29 20 72 65 74 75 72 6e  75807.0 ) return
1d570 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28 69 36   -1;.    y = (i6
1d580 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69 3c 79  4)r;.    if( i<y
1d590 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1d5a0 20 20 69 66 28 20 69 3e 79 20 29 7b 0a 20 20 20    if( i>y ){.   
1d5b0 20 20 20 69 66 28 20 79 3d 3d 53 4d 41 4c 4c 45     if( y==SMALLE
1d5c0 53 54 5f 49 4e 54 36 34 20 26 26 20 72 3e 30 2e  ST_INT64 && r>0.
1d5d0 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
1d5e0 20 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a       return +1;.
1d5f0 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 28 64      }.    s = (d
1d600 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20 69 66 28  ouble)i;.    if(
1d610 20 73 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31   s<r ) return -1
1d620 3b 0a 20 20 20 20 69 66 28 20 73 3e 72 20 29 20  ;.    if( s>r ) 
1d630 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72  return +1;.    r
1d640 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
1d650 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
1d660 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e  e values contain
1d670 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65  ed by the two me
1d680 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75  mory cells, retu
1d690 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76  rning.** negativ
1d6a0 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74  e, zero or posit
1d6b0 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20  ive if pMem1 is 
1d6c0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1d6d0 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a   to, or greater.
1d6e0 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53  ** than pMem2. S
1d6f0 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20  orting order is 
1d700 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f  NULL's first, fo
1d710 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72  llowed by number
1d720 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61  s (integers.** a
1d730 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64  nd reals) sorted
1d740 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f   numerically, fo
1d750 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f  llowed by text o
1d760 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f  rdered by the co
1d770 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
1d780 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69  nce pColl and fi
1d790 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64  nally blob's ord
1d7a0 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29  ered by memcmp()
1d7b0 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
1d7c0 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73   values are cons
1d7d0 69 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20  idered equal by 
1d7e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
1d7f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d  /.int sqlite3Mem
1d800 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65  Compare(const Me
1d810 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20  m *pMem1, const 
1d820 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73  Mem *pMem2, cons
1d830 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  t CollSeq *pColl
1d840 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b  ){.  int f1, f2;
1d850 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f  .  int combined_
1d860 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70  flags;..  f1 = p
1d870 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66  Mem1->flags;.  f
1d880 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73  2 = pMem2->flags
1d890 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  ;.  combined_fla
1d8a0 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73  gs = f1|f2;.  as
1d8b0 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f  sert( (combined_
1d8c0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
1d8d0 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a  et)==0 );. .  /*
1d8e0 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
1d8f0 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73   NULL, it is les
1d900 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72  s than the other
1d910 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73  . If both values
1d920 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20  .  ** are NULL, 
1d930 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20  return 0..  */. 
1d940 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1d950 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
1d960 20 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d      return (f2&M
1d970 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d  EM_Null) - (f1&M
1d980 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20  EM_Null);.  }.. 
1d990 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e 65   /* At least one
1d9a0 20 6f 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75   of the two valu
1d9b0 65 73 20 69 73 20 61 20 6e 75 6d 62 65 72 0a 20  es is a number. 
1d9c0 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
1d9d0 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e  ed_flags&(MEM_In
1d9e0 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20  t|MEM_Real) ){. 
1d9f0 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20     if( (f1 & f2 
1da00 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  & MEM_Int)!=0 ){
1da10 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1da20 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75  ->u.i < pMem2->u
1da30 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .i ) return -1;.
1da40 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1da50 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e  >u.i > pMem2->u.
1da60 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  i ) return +1;. 
1da70 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1da80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
1da90 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c   & f2 & MEM_Real
1daa0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1dab0 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70  ( pMem1->u.r < p
1dac0 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75  Mem2->u.r ) retu
1dad0 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28  rn -1;.      if(
1dae0 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d   pMem1->u.r > pM
1daf0 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72  em2->u.r ) retur
1db00 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n +1;.      retu
1db10 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1db20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29  if( (f1&MEM_Int)
1db30 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1db40 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d   (f2&MEM_Real)!=
1db50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
1db60 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74 46 6c  urn sqlite3IntFl
1db70 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31  oatCompare(pMem1
1db80 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e  ->u.i, pMem2->u.
1db90 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
1dba0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1dbb0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
1dbc0 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45  }.    if( (f1&ME
1dbd0 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Real)!=0 ){.  
1dbe0 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f      if( (f2&MEM_
1dbf0 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Int)!=0 ){.     
1dc00 20 20 20 72 65 74 75 72 6e 20 2d 73 71 6c 69 74     return -sqlit
1dc10 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1dc20 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d  e(pMem2->u.i, pM
1dc30 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  em1->u.r);.     
1dc40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1dc50 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1dc60 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
1dc70 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f  urn +1;.  }..  /
1dc80 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69  * If one value i
1dc90 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74  s a string and t
1dca0 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c  he other is a bl
1dcb0 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69  ob, the string i
1dcc0 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20  s less..  ** If 
1dcd0 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 73  both are strings
1dce0 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20  , compare using 
1dcf0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  the collating fu
1dd00 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
1dd10 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1dd20 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20  gs&MEM_Str ){.  
1dd30 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f    if( (f1 & MEM_
1dd40 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
1dd50 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1dd60 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20 4d  .    if( (f2 & M
1dd70 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1dd80 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1dd90 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
1dda0 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d  ( pMem1->enc==pM
1ddb0 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d  em2->enc || pMem
1ddc0 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  1->db->mallocFai
1ddd0 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72  led );.    asser
1dde0 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53  t( pMem1->enc==S
1ddf0 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20  QLITE_UTF8 || . 
1de00 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d 31             pMem1
1de10 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1de20 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e  F16LE || pMem1->
1de30 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
1de40 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  6BE );..    /* T
1de50 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1de60 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64 65  uence must be de
1de70 66 69 6e 65 64 20 61 74 20 74 68 69 73 20 70 6f  fined at this po
1de80 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  int, even if.   
1de90 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65 6c   ** the user del
1dea0 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  etes the collati
1deb0 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 65  on sequence afte
1dec0 72 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  r the vdbe progr
1ded0 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d  am is.    ** com
1dee0 70 69 6c 65 64 20 28 74 68 69 73 20 77 61 73 20  piled (this was 
1def0 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20 63  not always the c
1df00 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ase)..    */.   
1df10 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c 20   assert( !pColl 
1df20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  || pColl->xCmp )
1df30 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  ;..    if( pColl
1df40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1df50 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
1df60 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65  tring(pMem1, pMe
1df70 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20  m2, pColl, 0);. 
1df80 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61     }.    /* If a
1df90 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61   NULL pointer wa
1dfa0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
1dfb0 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e  collate function
1dfc0 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20  , fall through. 
1dfd0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f     ** to the blo
1dfe0 62 20 63 61 73 65 20 61 6e 64 20 75 73 65 20 6d  b case and use m
1dff0 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d  emcmp().  */.  }
1e000 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c  . .  /* Both val
1e010 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f 62  ues must be blob
1e020 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69 6e  s.  Compare usin
1e030 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a  g memcmp().  */.
1e040 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1e050 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d  BlobCompare(pMem
1e060 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f  1, pMem2);.}.../
1e070 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
1e080 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
1e090 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1e0a0 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70 65  is a serial-type
1e0b0 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70   that.** corresp
1e0c0 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65 67  onds to an integ
1e0d0 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20  er - all values 
1e0e0 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20  between 1 and 9 
1e0f0 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78  inclusive .** ex
1e100 63 65 70 74 20 37 2e 20 54 68 65 20 73 65 63 6f  cept 7. The seco
1e110 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  nd points to a b
1e120 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
1e130 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
1e140 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20  e.** serialized 
1e150 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65 72  according to ser
1e160 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20 66  ial_type. This f
1e170 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c  unction deserial
1e180 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75  izes.** and retu
1e190 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a  rns the value..*
1e1a0 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76 64 62  /.static i64 vdb
1e1b0 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74  eRecordDecodeInt
1e1c0 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
1e1d0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79  , const u8 *aKey
1e1e0 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61 73  ){.  u32 y;.  as
1e1f0 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
1e200 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65   || (serial_type
1e210 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74 79  >=1 && serial_ty
1e220 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c 5f  pe<=9 && serial_
1e230 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73 77  type!=7) );.  sw
1e240 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
1e250 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a  e ){.    case 0:
1e260 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20  .    case 1:.   
1e270 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1e280 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1e290 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59     return ONE_BY
1e2a0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1e2b0 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20    case 2:.      
1e2c0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1e2d0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1e2e0 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f  return TWO_BYTE_
1e2f0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
1e300 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65 73  ase 3:.      tes
1e310 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1e320 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1e330 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f 49  urn THREE_BYTE_I
1e340 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61  NT(aKey);.    ca
1e350 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74 65  se 4: {.      te
1e360 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1e370 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79 20  0x80 );.      y 
1e380 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1e390 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 65  (aKey);.      re
1e3a0 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a  turn (i64)*(int*
1e3b0 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  )&y;.    }.    c
1e3c0 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 74  ase 5: {.      t
1e3d0 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1e3e0 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
1e3f0 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f  eturn FOUR_BYTE_
1e400 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28  UINT(aKey+2) + (
1e410 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
1e420 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1e430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e440 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34 20   6: {.      u64 
1e450 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
1e460 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1e470 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1e480 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1e490 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
1e4a0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1e4b0 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74 75  y+4);.      retu
1e4c0 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29 26  rn (i64)*(i64*)&
1e4d0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  x;.    }.  }..  
1e4e0 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
1e4f0 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a  ype - 8);.}../*.
1e500 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1e510 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77   compares the tw
1e520 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20  o table rows or 
1e530 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a  index records.**
1e540 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e   specified by {n
1e550 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64  Key1, pKey1} and
1e560 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74   pPKey2.  It ret
1e570 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c  urns a negative,
1e580 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
1e590 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
1e5a0 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
1e5b0 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a  n, equal to or .
1e5c0 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
1e5d0 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79  key2.  The {nKey
1e5e0 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75  1, pKey1} key mu
1e5f0 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20  st be a blob.** 
1e600 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 4f  created by the O
1e610 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
1e620 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
1e630 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20    The pPKey2.** 
1e640 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61  key must be a pa
1e650 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73  rsed key such as
1e660 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
1e670 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72  * sqlite3VdbePar
1e680 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  seRecord..**.** 
1e690 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b 69  If argument bSki
1e6a0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69  p is non-zero, i
1e6b0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1e6c0 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
1e6d0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 65   already.** dete
1e6e0 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20  rmined that the 
1e6f0 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
1e700 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75  the keys are equ
1e710 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61  al..**.** Key1 a
1e720 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68  nd Key2 do not h
1e730 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ave to contain t
1e740 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
1e750 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c  f fields. If all
1e760 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74   .** fields that
1e770 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20   appear in both 
1e780 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c 20  keys are equal, 
1e790 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  then pPKey2->def
1e7a0 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72  ault_rc is .** r
1e7b0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
1e7c0 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
1e7d0 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 65  ption is discove
1e7e0 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32 2d  red, set pPKey2-
1e7f0 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20  >errCode to .** 
1e800 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
1e810 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49 66 20  nd return 0. If 
1e820 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20  an OOM error is 
1e830 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a  encountered, .**
1e840 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1e850 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
1e860 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20  E_NOMEM and, if 
1e870 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  it is not NULL, 
1e880 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61  the.** malloc-fa
1e890 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20 6f 6e  iled flag set on
1e8a0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1e8b0 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e   (pPKey2->pKeyIn
1e8c0 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20  fo->db)..*/.int 
1e8d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1e8e0 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
1e8f0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1e900 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1e910 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  ,   /* Left key 
1e920 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1e930 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20 20  ord *pPKey2,    
1e940 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
1e950 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70  y */.  int bSkip
1e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e970 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
1e980 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72 73  e, skip the firs
1e990 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20  t field */.){.  
1e9a0 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20  u32 d1;         
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9c0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
1e9d0 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
1e9e0 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
1e9f0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea10 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74  /* Index of next
1ea20 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72   field to compar
1ea30 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  e */.  u32 szHdr
1ea40 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1ea50 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1ea60 66 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20  f record header 
1ea70 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
1ea80 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eaa0 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
1eab0 20 74 79 70 65 20 69 6e 20 68 65 61 64 65 72 20   type in header 
1eac0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  */.  int rc = 0;
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
1eaf0 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  alue */.  Mem *p
1eb00 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d  Rhs = pPKey2->aM
1eb10 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  em;       /* Nex
1eb20 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
1eb30 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  2 to compare */.
1eb40 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1eb50 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
1eb60 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20  eyInfo;.  const 
1eb70 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1eb80 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
1eb90 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
1eba0 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  ey1;.  Mem mem1;
1ebb0 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20  ..  /* If bSkip 
1ebc0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1ebd0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
1ebe0 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20  eady determined 
1ebf0 74 68 61 74 20 74 68 65 20 66 69 72 73 74 0a 20  that the first. 
1ec00 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   ** two elements
1ec10 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65   in the keys are
1ec20 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20   equal. Fix the 
1ec30 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61  various stack va
1ec40 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20  riables so.  ** 
1ec50 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
1ec60 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69  e begins compari
1ec70 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64  ng at the second
1ec80 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28   field. */.  if(
1ec90 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 33   bSkip ){.    u3
1eca0 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31 20 3d  2 s1;.    idx1 =
1ecb0 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32   1 + getVarint32
1ecc0 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b  (&aKey1[1], s1);
1ecd0 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20 61 4b  .    szHdr1 = aK
1ece0 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d  ey1[0];.    d1 =
1ecf0 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 65   szHdr1 + sqlite
1ed00 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1ed10 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20  en(s1);.    i = 
1ed20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  1;.    pRhs++;. 
1ed30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 31   }else{.    idx1
1ed40 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1ed50 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
1ed60 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a     d1 = szHdr1;.
1ed70 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e 73 69      if( d1>(unsi
1ed80 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20  gned)nKey1 ){ . 
1ed90 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
1eda0 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
1edb0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1edc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1edd0 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1ede0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  /.    }.    i = 
1edf0 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e  0;.  }..  VVA_ON
1ee00 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  LY( mem1.szMallo
1ee10 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
1ee20 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
1ee30 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1ee40 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  /.  assert( pPKe
1ee50 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  y2->pKeyInfo->nF
1ee60 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65  ield+pPKey2->pKe
1ee70 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d  yInfo->nXField>=
1ee80 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a  pPKey2->nField .
1ee90 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
1eea0 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
1eeb0 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1eec0 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1eed0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1eee0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1eef0 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61  >nField>0 );.  a
1ef00 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48  ssert( idx1<=szH
1ef10 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  dr1 || CORRUPT_D
1ef20 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  B );.  do{.    u
1ef30 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
1ef40 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61  .    /* RHS is a
1ef50 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  n integer */.   
1ef60 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1ef70 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
1ef80 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
1ef90 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
1efa0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1efb0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29  erial_type==12 )
1efc0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1efd0 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20  al_type>=10 ){. 
1efe0 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1eff0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1f000 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29  serial_type==0 )
1f010 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1f020 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1f030 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1f040 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  7 ){.        sql
1f050 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1f060 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
1f070 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31  rial_type, &mem1
1f080 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1f090 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74  -sqlite3IntFloat
1f0a0 43 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e 75 2e  Compare(pRhs->u.
1f0b0 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20 20  i, mem1.u.r);.  
1f0c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f0d0 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62     i64 lhs = vdb
1f0e0 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74  eRecordDecodeInt
1f0f0 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61  (serial_type, &a
1f100 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20  Key1[d1]);.     
1f110 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52 68     i64 rhs = pRh
1f120 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20  s->u.i;.        
1f130 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20  if( lhs<rhs ){. 
1f140 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31           rc = -1
1f150 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1f160 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20  if( lhs>rhs ){. 
1f170 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
1f180 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f190 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1f1a0 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f  * RHS is real */
1f1b0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1f1c0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1f1d0 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65  Real ){.      se
1f1e0 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
1f1f0 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69  1[idx1];.      i
1f200 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
1f210 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  10 ){.        /*
1f220 20 53 65 72 69 61 6c 20 74 79 70 65 73 20 31 32   Serial types 12
1f230 20 6f 72 20 67 72 65 61 74 65 72 20 61 72 65 20   or greater are 
1f240 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62  strings and blob
1f250 73 20 28 67 72 65 61 74 65 72 20 74 68 61 6e 0a  s (greater than.
1f260 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
1f270 72 73 29 2e 20 54 79 70 65 73 20 31 30 20 61 6e  rs). Types 10 an
1f280 64 20 31 31 20 61 72 65 20 63 75 72 72 65 6e 74  d 11 are current
1f290 6c 79 20 22 72 65 73 65 72 76 65 64 20 66 6f 72  ly "reserved for
1f2a0 20 66 75 74 75 72 65 20 0a 20 20 20 20 20 20 20   future .       
1f2b0 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69 74 20   ** use", so it 
1f2c0 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d  doesn't really m
1f2d0 61 74 74 65 72 20 77 68 61 74 20 74 68 65 20 72  atter what the r
1f2e0 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72  esults of compar
1f2f0 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ing.        ** t
1f300 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63 20  hem to numberic 
1f310 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a  values are.  */.
1f320 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1f330 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1f340 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20   serial_type==0 
1f350 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1f360 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
1f370 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f380 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
1f390 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
1f3a0 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20  _type, &mem1);. 
1f3b0 20 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61         if( seria
1f3c0 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
1f3d0 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31 2e         if( mem1.
1f3e0 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20 29 7b  u.r<pRhs->u.r ){
1f3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1f400 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
1f410 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e 75  }else if( mem1.u
1f420 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a  .r>pRhs->u.r ){.
1f430 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1f440 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   +1;.          }
1f450 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1f460 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1f470 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1f480 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69 2c 20  mpare(mem1.u.i, 
1f490 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20 20 20  pRhs->u.r);.    
1f4a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f4b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
1f4c0 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20  is a string */. 
1f4d0 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
1f4e0 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
1f4f0 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61  r ){.      getVa
1f500 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64  rint32(&aKey1[id
1f510 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  x1], serial_type
1f520 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f530 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
1f540 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
1f550 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29  serial_type<12 )
1f560 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1f570 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1f580 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65  f( !(serial_type
1f590 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20   & 0x01) ){.    
1f5a0 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1f5b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f5c0 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69    mem1.n = (seri
1f5d0 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20  al_type - 12) / 
1f5e0 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  2;.        testc
1f5f0 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29  ase( (d1+mem1.n)
1f600 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1f610 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
1f620 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e  tcase( (d1+mem1.
1f630 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  n+1)==(unsigned)
1f640 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1f650 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29   if( (d1+mem1.n)
1f660 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65   > (unsigned)nKe
1f670 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y1 ){.          
1f680 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1f690 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
1f6a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1f6b0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f6d0 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
1f6e0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1f6f0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1f700 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [i] ){.         
1f710 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
1f720 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20  Info->enc;.     
1f730 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70       mem1.db = p
1f740 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20  KeyInfo->db;.   
1f750 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67         mem1.flag
1f760 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20  s = MEM_Str;.   
1f770 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20         mem1.z = 
1f780 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31  (char*)&aKey1[d1
1f790 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ];.          rc 
1f7a0 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  = vdbeCompareMem
1f7b0 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20 20  String(.        
1f7c0 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52 68        &mem1, pRh
1f7d0 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  s, pKeyInfo->aCo
1f7e0 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e  ll[i], &pPKey2->
1f7f0 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20 20  errCode.        
1f800 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c    );.        }el
1f810 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
1f820 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d  t nCmp = MIN(mem
1f830 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20  1.n, pRhs->n);. 
1f840 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65           rc = me
1f850 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c  mcmp(&aKey1[d1],
1f860 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b   pRhs->z, nCmp);
1f870 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1f880 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31  c==0 ) rc = mem1
1f890 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20  .n - pRhs->n; . 
1f8a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f8b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1f8c0 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a  HS is a blob */.
1f8d0 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
1f8e0 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  s->flags & MEM_B
1f8f0 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73  lob ){.      ass
1f900 65 72 74 28 20 28 70 52 68 73 2d 3e 66 6c 61 67  ert( (pRhs->flag
1f910 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30  s & MEM_Zero)==0
1f920 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30 20 29   || pRhs->n==0 )
1f930 3b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  ;.      getVarin
1f940 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
1f950 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1f960 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f970 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1f980 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1f990 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28  ial_type<12 || (
1f9a0 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1f9b0 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1f9c0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1f9d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1f9e0 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
1f9f0 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
1fa00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1fa10 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e  ( (d1+nStr)==(un
1fa20 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1fa30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1fa40 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28  ( (d1+nStr+1)==(
1fa50 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1fa60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64  ;.        if( (d
1fa70 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67  1+nStr) > (unsig
1fa80 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
1fa90 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
1faa0 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1fab0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1fac0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1fad0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1fae0 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1faf0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1fb00 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
1fb10 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
1fb20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1fb30 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63 6f 6e 73  !isAllZero((cons
1fb40 74 20 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64  t char*)&aKey1[d
1fb50 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20 20 20 20  1],nStr) ){.    
1fb60 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
1fb70 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1fb80 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1fb90 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 75  = nStr - pRhs->u
1fba0 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20 20  .nZero;.        
1fbb0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1fbc0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
1fbd0 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72   nCmp = MIN(nStr
1fbe0 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20  , pRhs->n);.    
1fbf0 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
1fc00 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52  p(&aKey1[d1], pR
1fc10 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20  hs->z, nCmp);.  
1fc20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1fc30 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20  0 ) rc = nStr - 
1fc40 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20  pRhs->n;.       
1fc50 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1fc60 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1fc70 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65  null */.    else
1fc80 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74  {.      serial_t
1fc90 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31  ype = aKey1[idx1
1fca0 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73  ];.      rc = (s
1fcb0 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a  erial_type!=0);.
1fcc0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
1fcd0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  c!=0 ){.      if
1fce0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1fcf0 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
1fd00 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20       rc = -rc;. 
1fd10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
1fd20 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43  ert( vdbeRecordC
1fd30 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1fd40 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1fd50 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61  , rc) );.      a
1fd60 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1fd70 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
1fd80 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
1fd90 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1fda0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
1fdb0 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b  i++;.    pRhs++;
1fdc0 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
1fdd0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1fde0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
1fdf0 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71  ;.    idx1 += sq
1fe00 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73  lite3VarintLen(s
1fe10 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d  erial_type);.  }
1fe20 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73  while( idx1<(uns
1fe30 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20  igned)szHdr1 && 
1fe40 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  i<pPKey2->nField
1fe50 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65   && d1<=(unsigne
1fe60 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a  d)nKey1 );..  /*
1fe70 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   No memory alloc
1fe80 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73  ation is ever us
1fe90 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f  ed on mem1.  Pro
1fea0 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20  ve this using.  
1feb0 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
1fec0 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74   assert().  If t
1fed0 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c  he assert() fail
1fee0 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20  s, it indicates 
1fef0 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65  a.  ** memory le
1ff00 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f  ak and a need to
1ff10 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   call sqlite3Vdb
1ff20 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
1ff30 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  1).  */.  assert
1ff40 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1ff50 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d  =0 );..  /* rc==
1ff60 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61  0 here means tha
1ff70 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66  t one or both of
1ff80 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
1ff90 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
1ffa0 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
1ffb0 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
1ffc0 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
1ffd0 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
1ffe0 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75  ult_rc.  ** valu
1fff0 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
20000 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20   CORRUPT_DB .   
20010 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72      || vdbeRecor
20020 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
20030 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
20040 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  y2, pPKey2->defa
20050 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20  ult_rc) .       
20060 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  || pKeyInfo->db-
20070 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
20080 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71 53  );.  pPKey2->eqS
20090 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  een = 1;.  retur
200a0 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
200b0 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  t_rc;.}.int sqli
200c0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
200d0 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
200e0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
200f0 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20  Key1,   /* Left 
20100 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
20110 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
20120 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
20130 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65  t key */.){.  re
20140 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
20150 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
20160 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
20170 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a  y1, pPKey2, 0);.
20180 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
20190 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70  unction is an op
201a0 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  timized version 
201b0 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  of sqlite3VdbeRe
201c0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a  cordCompare() .*
201d0 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66  * that (a) the f
201e0 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50  irst field of pP
201f0 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67  Key2 is an integ
20200 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20  er, and (b) the 
20210 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  .** size-of-head
20220 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68 65  er varint at the
20230 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
20240 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
20250 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65  a single.** byte
20260 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74   (i.e. is less t
20270 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20  han 128)..**.** 
20280 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e  To avoid concern
20290 73 20 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f  s about buffer o
202a0 76 65 72 72 65 61 64 73 2c 20 74 68 69 73 20 72  verreads, this r
202b0 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75  outine is only u
202c0 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61  sed.** on schema
202d0 73 20 77 68 65 72 65 20 74 68 65 20 6d 61 78 69  s where the maxi
202e0 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72  mum valid header
202f0 20 73 69 7a 65 20 69 73 20 36 33 20 62 79 74 65   size is 63 byte
20300 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74  s or less..*/.st
20310 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
20320 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20  ordCompareInt(. 
20330 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
20340 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
20350 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
20360 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
20370 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
20380 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
20390 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  .  const u8 *aKe
203a0 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a  y = &((const u8*
203b0 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20  )pKey1)[*(const 
203c0 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46  u8*)pKey1 & 0x3F
203d0 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f  ];.  int serial_
203e0 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75  type = ((const u
203f0 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20  8*)pKey1)[1];.  
20400 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79  int res;.  u32 y
20410 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34  ;.  u64 x;.  i64
20420 20 76 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a   v;.  i64 lhs;..
20430 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c    vdbeAssertFiel
20440 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
20450 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ts(nKey1, pKey1,
20460 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
20470 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a  o);.  assert( (*
20480 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33  (u8*)pKey1)<=0x3
20490 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  F || CORRUPT_DB 
204a0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
204b0 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
204c0 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62  case 1: { /* 1-b
204d0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
204e0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
204f0 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  = ONE_BYTE_INT(a
20500 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
20510 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
20520 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20530 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
20540 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
20550 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
20560 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45    lhs = TWO_BYTE
20570 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
20580 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
20590 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
205a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
205b0 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
205c0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
205d0 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48  /.      lhs = TH
205e0 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
205f0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
20600 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
20610 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20620 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
20630 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
20640 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
20650 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
20660 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
20670 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74  lhs = (i64)*(int
20680 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&y;.      test
20690 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
206a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
206b0 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
206c0 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
206d0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
206e0 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54    lhs = FOUR_BYT
206f0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
20700 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
20710 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
20720 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
20730 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
20740 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20750 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a      case 6: { /*
20760 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
20770 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
20780 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
20790 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
207a0 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
207b0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
207c0 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  y+4);.      lhs 
207d0 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
207e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
207f0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
20800 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
20810 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20  e 8: .      lhs 
20820 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
20830 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20  ;.    case 9:.  
20840 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20      lhs = 1;.   
20850 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f     break;..    /
20860 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c  * This case coul
20870 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74  d be removed wit
20880 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68  hout changing th
20890 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e  e results of run
208a0 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73  ning.    ** this
208b0 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67   code. Including
208c0 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20 74   it causes gcc t
208d0 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 73  o generate a fas
208e0 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20 20  ter switch .    
208f0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69  ** statement (si
20900 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  nce the range of
20910 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73 20   switch targets 
20920 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a 65  now starts at ze
20930 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73  ro and.    ** is
20940 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74   contiguous) but
20950 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
20960 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f  any duplicate co
20970 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  de to be generat
20980 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63  ed.    ** (as gc
20990 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75  c is clever enou
209a0 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  gh to combine th
209b0 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73  e two like cases
209c0 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a  ). Other .    **
209d0 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74   compilers might
209e0 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f   be similar.  */
209f0 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63 61   .    case 0: ca
20a00 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75  se 7:.      retu
20a10 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
20a20 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
20a30 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
20a40 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  );..    default:
20a50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
20a60 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20a70 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
20a80 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20  ey1, pPKey2);.  
20a90 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65 79 32 2d  }..  v = pPKey2-
20aa0 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20  >aMem[0].u.i;.  
20ab0 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20  if( v>lhs ){.   
20ac0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
20ad0 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76  1;.  }else if( v
20ae0 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  <lhs ){.    res 
20af0 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
20b00 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32  }else if( pPKey2
20b10 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20  ->nField>1 ){.  
20b20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
20b30 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
20b40 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
20b50 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61   Compare the tra
20b60 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69  iling .    ** fi
20b70 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65  elds.  */.    re
20b80 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
20b90 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
20ba0 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79  Skip(nKey1, pKey
20bb0 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20  1, pPKey2, 1);. 
20bc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
20bd0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
20be0 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20  of the two keys 
20bf0 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68  are equal and th
20c00 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c  ere are no trail
20c10 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  ing.    ** field
20c20 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32  s. Return pPKey2
20c30 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20  ->default_rc in 
20c40 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20  this case. */.  
20c50 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
20c60 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20  default_rc;.    
20c70 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
20c80 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   1;.  }..  asser
20c90 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
20ca0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
20cb0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
20cc0 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  res) );.  return
20cd0 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   res;.}../*.** T
20ce0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
20cf0 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72  an optimized ver
20d00 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
20d10 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20d20 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20  () .** that (a) 
20d30 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
20d40 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20 73  of pPKey2 is a s
20d50 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20  tring, that (b) 
20d60 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a  the first field.
20d70 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ** uses the coll
20d80 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42  ation sequence B
20d90 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74 68  INARY and (c) th
20da0 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68  at the size-of-h
20db0 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a  eader varint .**
20dc0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
20dd0 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66   (pKey1/nKey1) f
20de0 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  its in a single 
20df0 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  byte..*/.static 
20e00 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
20e10 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69  mpareString(.  i
20e20 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
20e30 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
20e40 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
20e50 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
20e60 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52  Key2        /* R
20e70 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
20e80 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31   const u8 *aKey1
20e90 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b   = (const u8*)pK
20ea0 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  ey1;.  int seria
20eb0 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65  l_type;.  int re
20ec0 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  s;..  assert( pP
20ed0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c  Key2->aMem[0].fl
20ee0 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b  ags & MEM_Str );
20ef0 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65  .  vdbeAssertFie
20f00 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
20f10 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  its(nKey1, pKey1
20f20 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  , pPKey2->pKeyIn
20f30 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74  fo);.  getVarint
20f40 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65  32(&aKey1[1], se
20f50 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66  rial_type);.  if
20f60 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
20f70 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
20f80 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f  Key2->r1;      /
20f90 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
20fa0 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61  is a number or a
20fb0 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65   null */.  }else
20fc0 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
20fd0 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20  pe & 0x01) ){ . 
20fe0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
20ff0 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r2;      /* (pK
21000 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
21010 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  blob */.  }else{
21020 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20  .    int nCmp;. 
21030 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20     int nStr;.   
21040 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65   int szHdr = aKe
21050 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72  y1[0];..    nStr
21060 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
21070 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28  12) / 2;.    if(
21080 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20   (szHdr + nStr) 
21090 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  > nKey1 ){.     
210a0 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
210b0 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
210c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
210d0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f    return 0;    /
210e0 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
210f0 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d      }.    nCmp =
21100 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d   MIN( pPKey2->aM
21110 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b  em[0].n, nStr );
21120 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d  .    res = memcm
21130 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c  p(&aKey1[szHdr],
21140 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
21150 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20  .z, nCmp);..    
21160 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
21170 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d      res = nStr -
21180 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
21190 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  .n;.      if( re
211a0 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
211b0 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65  if( pPKey2->nFie
211c0 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ld>1 ){.        
211d0 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56    res = sqlite3V
211e0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
211f0 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
21200 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31  pKey1, pPKey2, 1
21210 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
21220 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  {.          res 
21230 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
21240 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  t_rc;.          
21250 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
21260 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
21270 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
21280 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  s>0 ){.        r
21290 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
212a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
212b0 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
212c0 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a  y2->r1;.      }.
212d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
212e0 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  s>0 ){.      res
212f0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
21300 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21310 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
21320 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
21330 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
21340 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
21350 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
21360 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20 20  y2, res).       
21370 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20  || CORRUPT_DB.  
21380 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e       || pPKey2->
21390 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
213a0 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a  llocFailed.  );.
213b0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
213c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
213d0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
213e0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
213f0 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74 69  ompare() compati
21400 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ble function.** 
21410 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d  suitable for com
21420 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a 65  paring serialize
21430 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65  d records to the
21440 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   unpacked record
21450 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
21460 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
21470 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72  .*/.RecordCompar
21480 65 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  e sqlite3VdbeFin
21490 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b 65  dCompare(Unpacke
214a0 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f  dRecord *p){.  /
214b0 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  * varintRecordCo
214c0 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76  mpareInt() and v
214d0 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
214e0 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68 20  reString() both 
214f0 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74  assume.  ** that
21500 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61   the size-of-hea
21510 64 65 72 20 76 61 72 69 6e 74 20 74 68 61 74 20  der varint that 
21520 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73 74  occurs at the st
21530 61 72 74 20 6f 66 20 65 61 63 68 20 72 65 63 6f  art of each reco
21540 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e 20  rd.  ** fits in 
21550 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28 69  a single byte (i
21560 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c 65  .e. is 127 or le
21570 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f 72  ss). varintRecor
21580 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20 20  dCompareInt().  
21590 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  ** also assumes 
215a0 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20  that it is safe 
215b0 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62 75  to overread a bu
215c0 66 66 65 72 20 62 79 20 61 74 20 6c 65 61 73 74  ffer by at least
215d0 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d   the .  ** maxim
215e0 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67 61  um possible lega
215f0 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 70 6c  l header size pl
21600 75 73 20 38 20 62 79 74 65 73 2e 20 42 65 63 61  us 8 bytes. Beca
21610 75 73 65 20 74 68 65 72 65 20 69 73 0a 20 20 2a  use there is.  *
21620 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
21630 62 65 20 61 74 20 6c 65 61 73 74 20 37 34 20 28  be at least 74 (
21640 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79 74  but not 136) byt
21650 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66 6f  es of padding fo
21660 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20 2a  llowing each.  *
21670 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  * buffer passed 
21680 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  to varintRecordC
21690 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69 73  ompareInt() this
216a0 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e   makes it conven
216b0 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d  ient to.  ** lim
216c0 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  it the size of t
216d0 68 65 20 68 65 61 64 65 72 20 74 6f 20 36 34 20  he header to 64 
216e0 62 79 74 65 73 20 69 6e 20 63 61 73 65 73 20 77  bytes in cases w
216f0 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20 66  here the first f
21700 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20  ield.  ** is an 
21710 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20  integer..  **.  
21720 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74 20 77  ** The easiest w
21730 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ay to enforce th
21740 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 63  is limit is to c
21750 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65 63  onsider only rec
21760 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20 31  ords with.  ** 1
21770 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73 73  3 fields or less
21780 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20 66  . If the first f
21790 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65 67  ield is an integ
217a0 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  er, the maximum 
217b0 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  legal.  ** heade
217c0 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35 20  r size is (12*5 
217d0 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e 20  + 1 + 1) bytes. 
217e0 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b   */.  if( (p->pK
217f0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
21800 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58   p->pKeyInfo->nX
21810 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a 20 20  Field)<=13 ){.  
21820 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d    int flags = p-
21830 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a  >aMem[0].flags;.
21840 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49      if( p->pKeyI
21850 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
21860 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  0] ){.      p->r
21870 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e  1 = 1;.      p->
21880 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  r2 = -1;.    }el
21890 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20  se{.      p->r1 
218a0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72  = -1;.      p->r
218b0 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  2 = 1;.    }.   
218c0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45   if( (flags & ME
218d0 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  M_Int) ){.      
218e0 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72  return vdbeRecor
218f0 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20  dCompareInt;.   
21900 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
21910 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61   flags & MEM_Rea
21920 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
21930 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  e( flags & MEM_N
21940 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ull );.    testc
21950 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
21960 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28  _Blob );.    if(
21970 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52   (flags & (MEM_R
21980 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d  eal|MEM_Null|MEM
21990 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d  _Blob))==0 && p-
219a0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  >pKeyInfo->aColl
219b0 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]==0 ){.      
219c0 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20  assert( flags & 
219d0 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20 20  MEM_Str );.     
219e0 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f   return vdbeReco
219f0 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b  rdCompareString;
21a00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
21a10 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
21a20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d  RecordCompare;.}
21a30 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69  ../*.** pCur poi
21a40 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20  nts at an index 
21a50 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73  entry created us
21a60 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
21a70 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
21a80 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   Read the rowid 
21a90 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20  (the last field 
21aa0 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61  in the record) a
21ab0 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  nd store it in *
21ac0 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e  rowid..** Return
21ad0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
21ae0 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20  erything works, 
21af0 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
21b00 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
21b10 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20  * pCur might be 
21b20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74  pointing to text
21b30 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
21b40 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
21b50 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68  e file..** So th
21b60 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74  e content cannot
21b70 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f   be trusted.  Do
21b80 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65   appropriate che
21b90 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  cks on the conte
21ba0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
21bb0 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73  e3VdbeIdxRowid(s
21bc0 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75  qlite3 *db, BtCu
21bd0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
21be0 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e  *rowid){.  i64 n
21bf0 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
21c00 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48  nt rc;.  u32 szH
21c10 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  dr;        /* Si
21c20 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
21c30 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f   */.  u32 typeRo
21c40 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61  wid;    /* Seria
21c50 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
21c60 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  wid */.  u32 len
21c70 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69  Rowid;     /* Si
21c80 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ze of the rowid 
21c90 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a  */.  Mem m, v;..
21ca0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
21cb0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
21cc0 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
21cd0 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
21ce0 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
21cf0 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
21d00 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
21d10 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
21d20 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a   corruption..  *
21d30 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  * Any corruption
21d40 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20   is detected in 
21d50 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
21d60 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75  eCellPtr(), thou
21d70 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73  gh, so.  ** this
21d80 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79   code can safely
21d90 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65   assume that nCe
21da0 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73  llKey is 32-bits
21db0 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74    .  */.  assert
21dc0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
21dd0 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
21de0 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20  ) );.  nCellKey 
21df0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
21e00 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b  yloadSize(pCur);
21e10 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c  .  assert( (nCel
21e20 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41  lKey & SQLITE_MA
21e30 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65  X_U32)==(u64)nCe
21e40 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52  llKey );..  /* R
21e50 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c  ead in the compl
21e60 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ete content of t
21e70 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a  he index entry *
21e80 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  /.  sqlite3VdbeM
21e90 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30  emInit(&m, db, 0
21ea0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
21eb0 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
21ec0 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29  e(pCur, 0, (u32)
21ed0 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20  nCellKey, &m);. 
21ee0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
21ef0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
21f00 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e   /* The index en
21f10 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77  try must begin w
21f20 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a  ith a header siz
21f30 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  e */.  (void)get
21f40 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
21f50 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73  z, szHdr);.  tes
21f60 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20  tcase( szHdr==3 
21f70 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
21f80 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69  zHdr==m.n );.  i
21f90 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64  f( unlikely(szHd
21fa0 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64  r<3 || (int)szHd
21fb0 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f  r>m.n) ){.    go
21fc0 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
21fd0 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
21fe0 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c  /* The last fiel
21ff0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73  d of the index s
22000 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
22010 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e  ger - the ROWID.
22020 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61  .  ** Verify tha
22030 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
22040 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e   really is an in
22050 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69  teger. */.  (voi
22060 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
22070 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
22080 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
22090 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
220a0 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74  wid==1 );.  test
220b0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
220c0 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =2 );.  testcase
220d0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29  ( typeRowid==3 )
220e0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
220f0 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20  peRowid==4 );.  
22100 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
22110 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74  wid==5 );.  test
22120 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
22130 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =6 );.  testcase
22140 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29  ( typeRowid==8 )
22150 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
22160 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20  peRowid==9 );.  
22170 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70  if( unlikely(typ
22180 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65  eRowid<1 || type
22190 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52  Rowid>9 || typeR
221a0 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20  owid==7) ){.    
221b0 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
221c0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  orruption;.  }. 
221d0 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
221e0 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
221f0 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20  s[typeRowid];.  
22200 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d  testcase( (u32)m
22210 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  .n==szHdr+lenRow
22220 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  id );.  if( unli
22230 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a  kely((u32)m.n<sz
22240 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b  Hdr+lenRowid) ){
22250 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
22260 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
22270 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20    }..  /* Fetch 
22280 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20  the integer off 
22290 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
222a0 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
222b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
222c0 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b  alGet((u8*)&m.z[
222d0 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74  m.n-lenRowid], t
222e0 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20  ypeRowid, &v);. 
222f0 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b   *rowid = v.u.i;
22300 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
22310 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
22320 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22330 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
22340 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  e if database co
22350 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
22360 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73  cted after m has
22370 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63   been.  ** alloc
22380 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20  ated.  Free the 
22390 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  m object and ret
223a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
223b0 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64  PT. */.idx_rowid
223c0 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74  _corruption:.  t
223d0 65 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c  estcase( m.szMal
223e0 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  loc!=0 );.  sqli
223f0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
22400 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
22410 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
22420 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  KPT;.}../*.** Co
22430 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66  mpare the key of
22440 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
22450 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20   that cursor pC 
22460 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
22470 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
22480 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70  y string in pUnp
22490 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e  acked.  Write in
224a0 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65  to *pRes a numbe
224b0 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67  r.** that is neg
224c0 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
224d0 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69  positive if pC i
224e0 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
224f0 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65  al to,.** or gre
22500 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63  ater than pUnpac
22510 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ked.  Return SQL
22520 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
22530 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b  s..**.** pUnpack
22540 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72 65  ed is either cre
22550 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72  ated without a r
22560 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63  owid or is trunc
22570 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a  ated so that it.
22580 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77  ** omits the row
22590 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  id at the end.  
225a0 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  The rowid at the
225b0 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
225c0 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67  x entry.** is ig
225d0 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20  nored as well.  
225e0 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74  Hence, this rout
225f0 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65  ine only compare
22600 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a  s the prefixes .
22610 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70  ** of the keys p
22620 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61  rior to the fina
22630 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65  l rowid, not the
22640 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a   entire key..*/.
22650 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
22660 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20  dxKeyCompare(.  
22670 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
22680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22690 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
226a0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  nection */.  Vdb
226b0 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20  eCursor *pC,    
226c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
226d0 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
226e0 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
226f0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
22700 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
22710 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64       /* Unpacked
22720 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20   version of key 
22730 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20  */.  int *res   
22740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22750 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
22760 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65  he comparison re
22770 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  sult here */.){.
22780 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
22790 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
227a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
227b0 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65    Mem m;..  asse
227c0 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
227d0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
227e0 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 43 2d 3e  );.  pCur = pC->
227f0 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73  uc.pCursor;.  as
22800 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
22810 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
22820 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c  pCur) );.  nCell
22830 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72  Key = sqlite3Btr
22840 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43  eePayloadSize(pC
22850 75 72 29 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b  ur);.  /* nCellK
22860 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ey will always b
22870 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
22880 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75  0xffffffff becau
22890 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20  se of the way.  
228a0 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72  ** that btreePar
228b0 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20  seCellPtr() and 
228c0 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
228d0 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  32() are impleme
228e0 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43  nted */.  if( nC
228f0 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
22900 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
22910 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
22920 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
22930 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
22940 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
22950 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
22960 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
22970 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
22980 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
22990 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d  u32)nCellKey, &m
229a0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
229b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
229c0 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74  }.  *res = sqlit
229d0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
229e0 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55  are(m.n, m.z, pU
229f0 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69  npacked);.  sqli
22a00 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
22a10 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
22a20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
22a30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22a40 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   sets the value 
22a50 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
22a60 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
22a70 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
22a80 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68  _changes() on th
22a90 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
22aa0 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64  e 'db'. .*/.void
22ab0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
22ac0 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
22ad0 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29  db, int nChange)
22ae0 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
22af0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
22b00 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  b->mutex) );.  d
22b10 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68  b->nChange = nCh
22b20 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74  ange;.  db->nTot
22b30 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61  alChange += nCha
22b40 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nge;.}../*.** Se
22b50 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20  t a flag in the 
22b60 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74  vdbe to update t
22b70 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
22b80 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e  r when it is fin
22b90 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73  alised.** or res
22ba0 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
22bb0 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e  te3VdbeCountChan
22bc0 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  ges(Vdbe *v){.  
22bd0 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d  v->changeCntOn =
22be0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
22bf0 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64  k every prepared
22c00 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63   statement assoc
22c10 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
22c20 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
22c30 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a  .** as expired..
22c40 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64  **.** An expired
22c50 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73   statement means
22c60 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74   that recompilat
22c70 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
22c80 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d  ment is.** recom
22c90 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74  mend.  Statement
22ca0 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68  s expire when th
22cb0 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74  ings happen that
22cc0 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70   make their.** p
22cd0 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65  rograms obsolete
22ce0 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72  .  Removing user
22cf0 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
22d00 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a  ns or collating.
22d10 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72  ** sequences, or
22d20 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74   changing an aut
22d30 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74  horization funct
22d40 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65  ion are the type
22d50 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74  s of.** things t
22d60 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65  hat make prepare
22d70 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73  d statements obs
22d80 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olete..*/.void s
22d90 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
22da0 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73  aredStatements(s
22db0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
22dc0 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20  dbe *p;.  for(p 
22dd0 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20  = db->pVdbe; p; 
22de0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
22df0 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
22e00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
22e10 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
22e20 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
22e30 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73  h the Vdbe..*/.s
22e40 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56  qlite3 *sqlite3V
22e50 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a  dbeDb(Vdbe *v){.
22e60 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a    return v->db;.
22e70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22e80 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
22e90 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74  sqlite3_value st
22ea0 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69  ructure containi
22eb0 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75  ng the value bou
22ec0 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  nd.** parameter 
22ed0 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78  iVar of VM v. Ex
22ee0 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c  cept, if the val
22ef0 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c  ue is an SQL NUL
22f00 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20  L, return .** 0 
22f10 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20  instead. Unless 
22f20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c  it is NULL, appl
22f30 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28  y affinity aff (
22f40 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
22f50 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74  E_AFF_*.** const
22f60 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c  ants) to the val
22f70 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ue before return
22f80 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ing it..**.** Th
22f90 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
22fa0 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
22fb0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
22fc0 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  ng sqlite3ValueF
22fd0 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ree()..*/.sqlite
22fe0 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33  3_value *sqlite3
22ff0 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75  VdbeGetBoundValu
23000 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69  e(Vdbe *v, int i
23010 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20  Var, u8 aff){.  
23020 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
23030 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
23040 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d   Mem *pMem = &v-
23050 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20  >aVar[iVar-1];. 
23060 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d     if( 0==(pMem-
23070 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
23080 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  l) ){.      sqli
23090 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20  te3_value *pRet 
230a0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
230b0 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  w(v->db);.      
230c0 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
230d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
230e0 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52  emCopy((Mem *)pR
230f0 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20  et, pMem);.     
23100 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41     sqlite3ValueA
23110 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65  pplyAffinity(pRe
23120 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55  t, aff, SQLITE_U
23130 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TF8);.      }.  
23140 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b      return pRet;
23150 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
23160 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
23170 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61  Configure SQL va
23180 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74  riable iVar so t
23190 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65  hat binding a ne
231a0 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69  w value to it si
231b0 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69  gnals.** to sqli
231c0 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29  te3_reoptimize()
231d0 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69   that re-prepari
231e0 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
231f0 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69   may result.** i
23200 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79  n a better query
23210 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73   plan..*/.void s
23220 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
23230 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e  mask(Vdbe *v, in
23240 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72  t iVar){.  asser
23250 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69  t( iVar>0 );.  i
23260 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20  f( iVar>32 ){.  
23270 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30    v->expmask = 0
23280 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c  xffffffff;.  }el
23290 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61  se{.    v->expma
232a0 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c  sk |= ((u32)1 <<
232b0 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a   (iVar-1));.  }.
232c0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
232d0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
232e0 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  BLE./*.** Transf
232f0 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  er error message
23300 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71   text from an sq
23310 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d  lite3_vtab.zErrM
23320 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a  sg (text stored.
23330 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ** in memory obt
23340 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
23350 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20  e3_malloc) into 
23360 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28  a Vdbe.zErrMsg (
23370 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69  text stored.** i
23380 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
23390 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
233a0 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64  Malloc)..*/.void
233b0 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f   sqlite3VtabImpo
233c0 72 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70  rtErrmsg(Vdbe *p
233d0 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  , sqlite3_vtab *
233e0 70 56 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56  pVtab){.  if( pV
233f0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  tab->zErrMsg ){.
23400 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
23410 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c  = p->db;.    sql
23420 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
23430 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
23440 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  p->zErrMsg = sql
23450 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
23460 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
23470 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
23480 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ee(pVtab->zErrMs
23490 67 29 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a  g);.    pVtab->z
234a0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
234b0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
234c0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
234d0 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ABLE */..#ifdef 
234e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
234f0 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a  EUPDATE_HOOK../*
23500 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
23510 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
23520 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20  t NULL, release 
23530 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  any allocations 
23540 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77  associated .** w
23550 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  ith the memory c
23560 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61  ells in the p->a
23570 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73  Mem[] array. Als
23580 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70 61 63  o free the Unpac
23590 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
235a0 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75  ucture itself, u
235b0 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
235c0 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ee()..**.** This
235d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
235e0 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b  d to free Unpack
235f0 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
23600 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  res allocated by
23610 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61  .** the vdbeUnpa
23620 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74  ckRecord() funct
23630 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62  ion found in vdb
23640 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69  eapi.c..*/.stati
23650 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 55  c void vdbeFreeU
23660 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20  npacked(sqlite3 
23670 2a 64 62 2c 20 69 6e 74 20 6e 46 69 65 6c 64 2c  *db, int nField,
23680 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
23690 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
236a0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
236b0 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64  or(i=0; i<nField
236c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65  ; i++){.      Me
236d0 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d  m *pMem = &p->aM
236e0 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  em[i];.      if(
236f0 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29   pMem->zMalloc )
23700 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
23710 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20  elease(pMem);.  
23720 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
23730 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
23740 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
23750 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
23760 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23  PDATE_HOOK */..#
23770 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
23780 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
23790 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  OK./*.** Invoke 
237a0 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68  the pre-update h
237b0 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20  ook. If this is 
237c0 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
237d0 45 54 45 20 70 72 65 2d 75 70 64 61 74 65 20 63  ETE pre-update c
237e0 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72  all,.** then cur
237f0 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
23800 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
23810 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74  t should point t
23820 6f 20 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a  o the row about.
23830 2a 2a 20 74 6f 20 62 65 20 75 70 64 61 74 65 20  ** to be update 
23840 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  or deleted. If t
23850 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  he application c
23860 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65  alls sqlite3_pre
23870 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a  update_old(),.**
23880 20 74 68 65 20 72 65 71 75 69 72 65 64 20 76 61   the required va
23890 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64  lue will be read
238a0 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68   from the row th
238b0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
238c0 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  to..*/.void sqli
238d0 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65  te3VdbePreUpdate
238e0 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c  Hook(.  Vdbe *v,
238f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23900 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
23910 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20  pre-update hook 
23920 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f  is invoked by */
23930 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
23940 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
23950 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
23960 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65  grab old.* value
23970 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  s from */.  int 
23980 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
23990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
239a0 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50  QLITE_INSERT, UP
239b0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a  DATE or DELETE *
239c0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
239d0 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  zDb,            
239e0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
239f0 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  name */.  Table 
23a00 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
23a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64            /* Mod
23a20 69 66 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20  ified table */. 
23a30 20 69 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20   i64 iKey1,     
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a50 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20   /* Initial key 
23a60 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
23a70 52 65 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Reg             
23a80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
23a90 67 69 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a  gister for new.*
23aa0 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
23ab0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d  sqlite3 *db = v-
23ac0 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32  >db;.  i64 iKey2
23ad0 3b 0a 20 20 50 72 65 55 70 64 61 74 65 20 70 72  ;.  PreUpdate pr
23ae0 65 75 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74  eupdate;.  const
23af0 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54   char *zTbl = pT
23b00 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61  ab->zName;.  sta
23b10 74 69 63 20 63 6f 6e 73 74 20 75 38 20 66 61 6b  tic const u8 fak
23b20 65 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a  eSortOrder = 0;.
23b30 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
23b40 50 72 65 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a  PreUpdate==0 );.
23b50 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75 70 64    memset(&preupd
23b60 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  ate, 0, sizeof(P
23b70 72 65 55 70 64 61 74 65 29 29 3b 0a 20 20 69 66  reUpdate));.  if
23b80 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
23b90 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4b 65 79 31  ==0 ){.    iKey1
23ba0 20 3d 20 69 4b 65 79 32 20 3d 20 30 3b 0a 20 20   = iKey2 = 0;.  
23bb0 20 20 70 72 65 75 70 64 61 74 65 2e 70 50 6b 20    preupdate.pPk 
23bc0 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
23bd0 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
23be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
23bf0 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41   op==SQLITE_UPDA
23c00 54 45 20 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  TE ){.      iKey
23c10 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67  2 = v->aMem[iReg
23c20 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65  ].u.i;.    }else
23c30 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20 3d 20  {.      iKey2 = 
23c40 69 4b 65 79 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  iKey1;.    }.  }
23c50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ..  assert( pCsr
23c60 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e  ->nField==pTab->
23c70 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20  nCol .       || 
23c80 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70  (pCsr->nField==p
23c90 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f  Tab->nCol+1 && o
23ca0 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  p==SQLITE_DELETE
23cb0 20 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20   && iReg==-1).  
23cc0 29 3b 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e  );..  preupdate.
23cd0 76 20 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61  v = v;.  preupda
23ce0 74 65 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a  te.pCsr = pCsr;.
23cf0 20 20 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d    preupdate.op =
23d00 20 6f 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65   op;.  preupdate
23d10 2e 69 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b  .iNewReg = iReg;
23d20 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
23d30 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20  info.db = db;.  
23d40 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
23d50 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  o.enc = ENC(db);
23d60 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
23d70 69 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 54  info.nField = pT
23d80 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75  ab->nCol;.  preu
23d90 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53  pdate.keyinfo.aS
23da0 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
23db0 26 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a  &fakeSortOrder;.
23dc0 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79    preupdate.iKey
23dd0 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72 65  1 = iKey1;.  pre
23de0 75 70 64 61 74 65 2e 69 4b 65 79 32 20 3d 20 69  update.iKey2 = i
23df0 4b 65 79 32 3b 0a 20 20 70 72 65 75 70 64 61 74  Key2;.  preupdat
23e00 65 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 0a  e.pTab = pTab;..
23e10 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65    db->pPreUpdate
23e20 20 3d 20 26 70 72 65 75 70 64 61 74 65 3b 0a 20   = &preupdate;. 
23e30 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43   db->xPreUpdateC
23e40 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50 72 65  allback(db->pPre
23e50 55 70 64 61 74 65 41 72 67 2c 20 64 62 2c 20 6f  UpdateArg, db, o
23e60 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b  p, zDb, zTbl, iK
23e70 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20 20 64  ey1, iKey2);.  d
23e80 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20  b->pPreUpdate = 
23e90 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
23ea0 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74 65  ee(db, preupdate
23eb0 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20 76 64 62  .aRecord);.  vdb
23ec0 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62  eFreeUnpacked(db
23ed0 2c 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69  , preupdate.keyi
23ee0 6e 66 6f 2e 6e 46 69 65 6c 64 2b 31 2c 20 70 72  nfo.nField+1, pr
23ef0 65 75 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65  eupdate.pUnpacke
23f00 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e  d);.  vdbeFreeUn
23f10 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70  packed(db, preup
23f20 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69  date.keyinfo.nFi
23f30 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65  eld+1, preupdate
23f40 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a  .pNewUnpacked);.
23f50 20 20 69 66 28 20 70 72 65 75 70 64 61 74 65 2e    if( preupdate.
23f60 61 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20  aNew ){.    int 
23f70 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
23f80 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20  i<pCsr->nField; 
23f90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
23fa0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
23fb0 65 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65  e(&preupdate.aNe
23fc0 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  w[i]);.    }.   
23fd0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23fe0 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65  b, preupdate.aNe
23ff0 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  w);.  }.}.#endif
24000 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
24010 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
24020 20 2a 2f 0a                                       */.