/ Hex Artifact Content
Login

Artifact fb1d5bfb60ba6b75a964d91fe5d054cb3dd31839:


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 0a 20 20 20 20 69 66 28 20 70 2d 3e 75 73 65  ..    if( p->use
4940: 73 41 6c 74 4d 61 70 3d 3d 30 20 0a 20 20 20 20  sAltMap==0 .    
4950: 20 26 26 20 70 4f 70 5b 30 5d 2e 6f 70 63 6f 64   && pOp[0].opcod
4960: 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 26 26 20  e==OP_Column && 
4970: 70 4f 70 5b 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  pOp[1].opcode==O
4980: 50 5f 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 26 26  P_Column.     &&
4990: 20 70 4f 70 5b 30 5d 2e 70 31 3d 3d 70 4f 70 5b   pOp[0].p1==pOp[
49a0: 31 5d 2e 70 31 20 26 26 20 70 4f 70 5b 30 5d 2e  1].p1 && pOp[0].
49b0: 70 32 3e 3d 70 4f 70 5b 31 5d 2e 70 32 0a 20 20  p2>=pOp[1].p2.  
49c0: 20 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e    ){.      pOp->
49d0: 70 35 20 7c 3d 20 4f 50 46 4c 41 47 5f 43 4f 4e  p5 |= OPFLAG_CON
49e0: 54 49 4e 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  TINUE;.    }.  }
49f0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4a00: 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e  (p->db, pParse->
4a10: 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73  aLabel);.  pPars
4a20: 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  e->aLabel = 0;. 
4a30: 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20   pParse->nLabel 
4a40: 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63  = 0;.  *pMaxFunc
4a50: 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b  Args = nMaxArgs;
4a60: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
4a70: 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62  sReader!=0 || Db
4a80: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62  MaskAllZero(p->b
4a90: 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a  treeMask) );.}..
4aa0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4ab0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
4ac0: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
4ad0: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
4ae0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
4af0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
4b00: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
4b10: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
4b20: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
4b30: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
4b40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79  .}../*.** Verify
4b50: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e   that at least N
4b60: 20 6f 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72   opcode slots ar
4b70: 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70  e available in p
4b80: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69   without.** havi
4b90: 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72  ng to malloc for
4ba0: 20 6d 6f 72 65 20 73 70 61 63 65 20 28 65 78 63   more space (exc
4bb0: 65 70 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ept when compile
4bc0: 64 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54  d using.** SQLIT
4bd0: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
4be0: 54 52 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e  TRESS).  This in
4bf0: 74 65 72 66 61 63 65 20 69 73 20 75 73 65 64 20  terface is used 
4c00: 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a  during testing.*
4c10: 2a 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  * to verify that
4c20: 20 63 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74   certain calls t
4c30: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  o sqlite3VdbeAdd
4c40: 4f 70 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76  OpList() can nev
4c50: 65 72 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74  er.** fail due t
4c60: 6f 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e  o a OOM fault an
4c70: 64 20 68 65 6e 63 65 20 74 68 61 74 20 74 68 65  d hence that the
4c80: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   return value fr
4c90: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
4ca0: 65 41 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c  eAddOpList() wil
4cb0: 6c 20 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d  l always be non-
4cc0: 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  NULL..*/.#if def
4cd0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
4ce0: 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
4cf0: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
4d00: 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20  OC_STRESS).void 
4d10: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
4d20: 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65  yNoMallocRequire
4d30: 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e  d(Vdbe *p, int N
4d40: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
4d50: 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50  nOp + N <= p->pP
4d60: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29  arse->nOpAlloc )
4d70: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4d80: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
4d90: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 74  e VM passed as t
4da0: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
4db0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
4dc0: 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c  n.** an OP_Resul
4dd0: 74 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69  tRow opcode. Fai
4de0: 6c 20 61 6e 20 61 73 73 65 72 74 28 29 20 69 66  l an assert() if
4df0: 20 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69   it does. This i
4e00: 73 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64  s used.** by cod
4e10: 65 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f  e in pragma.c to
4e20: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
4e30: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
4e40: 6f 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72  of certain.** pr
4e50: 61 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77  agmas comports w
4e60: 69 74 68 20 74 68 65 20 66 6c 61 67 73 20 73 70  ith the flags sp
4e70: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d  ecified in the m
4e80: 6b 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a  kpragmatab.tcl.*
4e90: 2a 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66  * script..*/.#if
4ea0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4eb0: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
4ec0: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ed(SQLITE_TEST_R
4ed0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76  EALLOC_STRESS).v
4ee0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56  oid sqlite3VdbeV
4ef0: 65 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77  erifyNoResultRow
4f00: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
4f10: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
4f20: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
4f30: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
4f40: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
4f50: 52 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d  ResultRow );.  }
4f60: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
4f70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4f80: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
4f90: 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66   to the array of
4fa0: 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61   opcodes associa
4fb0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
4fc0: 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
4fd0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
4fe0: 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  t. It is the cal
4ff0: 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
5000: 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67  ity.** to arrang
5010: 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e  e for the return
5020: 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65  ed array to be e
5030: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20  ventually freed 
5040: 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64  using the .** vd
5050: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20  beFreeOpArray() 
5060: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
5070: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
5080: 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74  , *pnOp is set t
5090: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
50a0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72  entries in the r
50b0: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79  eturned.** array
50c0: 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72  . Also, *pnMaxAr
50d0: 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  g is set to the 
50e0: 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75  larger of its cu
50f0: 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20  rrent value and 
5100: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
5110: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
5120: 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72   Vdbe.apArg[] ar
5130: 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  ray required to 
5140: 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20  execute the .** 
5150: 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d  returned program
5160: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
5170: 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72  ite3VdbeTakeOpAr
5180: 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ray(Vdbe *p, int
5190: 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d   *pnOp, int *pnM
51a0: 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70  axArg){.  VdbeOp
51b0: 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a   *aOp = p->aOp;.
51c0: 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26    assert( aOp &&
51d0: 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46   !p->db->mallocF
51e0: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43  ailed );..  /* C
51f0: 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65  heck that sqlite
5200: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29  3VdbeUsesBtree()
5210: 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
5220: 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  on this VM */.  
5230: 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c  assert( DbMaskAl
5240: 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61  lZero(p->btreeMa
5250: 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76  sk) );..  resolv
5260: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d  eP2Values(p, pnM
5270: 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20  axArg);.  *pnOp 
5280: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61  = p->nOp;.  p->a
5290: 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  Op = 0;.  return
52a0: 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   aOp;.}../*.** A
52b0: 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20  dd a whole list 
52c0: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  of operations to
52d0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73   the operation s
52e0: 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 61 0a  tack.  Return a.
52f0: 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ** pointer to th
5300: 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f  e first operatio
5310: 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a  n inserted..**.*
5320: 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32 20 61 72  * Non-zero P2 ar
5330: 67 75 6d 65 6e 74 73 20 74 6f 20 6a 75 6d 70 20  guments to jump 
5340: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
5350: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
5360: 64 6a 75 73 74 65 64 0a 2a 2a 20 73 6f 20 74 68  djusted.** so th
5370: 61 74 20 74 68 65 20 6a 75 6d 70 20 74 61 72 67  at the jump targ
5380: 65 74 20 69 73 20 72 65 6c 61 74 69 76 65 20 74  et is relative t
5390: 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  o the first oper
53a0: 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a  ation inserted..
53b0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
53c0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
53d0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53f0: 2f 2a 20 41 64 64 20 6f 70 63 6f 64 65 73 20 74  /* Add opcodes t
5400: 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  o the prepared s
5410: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
5420: 74 20 6e 4f 70 2c 20 20 20 20 20 20 20 20 20 20  t nOp,          
5430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5440: 6d 62 65 72 20 6f 66 20 6f 70 63 6f 64 65 73 20  mber of opcodes 
5450: 74 6f 20 61 64 64 20 2a 2f 0a 20 20 56 64 62 65  to add */.  Vdbe
5460: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
5470: 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p,       /* The 
5480: 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20 61 64  opcodes to be ad
5490: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ded */.  int iLi
54a0: 6e 65 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20  neno            
54b0: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 2d        /* Source-
54c0: 66 69 6c 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72  file line number
54d0: 20 6f 66 20 66 69 72 73 74 20 6f 70 63 6f 64 65   of first opcode
54e0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
54f0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 2c 20    VdbeOp *pOut, 
5500: 2a 70 46 69 72 73 74 3b 0a 20 20 61 73 73 65 72  *pFirst;.  asser
5510: 74 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  t( nOp>0 );.  as
5520: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
5530: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
5540: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
5550: 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73  + nOp > p->pPars
5560: 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67  e->nOpAlloc && g
5570: 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f  rowOpArray(p, nO
5580: 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
5590: 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72 73 74   0;.  }.  pFirst
55a0: 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f   = pOut = &p->aO
55b0: 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66 6f 72  p[p->nOp];.  for
55c0: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
55d0: 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29  , aOp++, pOut++)
55e0: 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f  {.    pOut->opco
55f0: 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64 65  de = aOp->opcode
5600: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d  ;.    pOut->p1 =
5610: 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70 4f   aOp->p1;.    pO
5620: 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70 32  ut->p2 = aOp->p2
5630: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4f  ;.    assert( aO
5640: 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20  p->p2>=0 );.    
5650: 69 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f  if( (sqlite3Opco
5660: 64 65 50 72 6f 70 65 72 74 79 5b 61 4f 70 2d 3e  deProperty[aOp->
5670: 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f  opcode] & OPFLG_
5680: 4a 55 4d 50 29 21 3d 30 20 26 26 20 61 4f 70 2d  JUMP)!=0 && aOp-
5690: 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  >p2>0 ){.      p
56a0: 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e 6e 4f  Out->p2 += p->nO
56b0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75  p;.    }.    pOu
56c0: 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33 3b  t->p3 = aOp->p3;
56d0: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70  .    pOut->p4typ
56e0: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
56f0: 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d      pOut->p4.p =
5700: 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 35   0;.    pOut->p5
5710: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
5720: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
5730: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
5740: 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d  pOut->zComment =
5750: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   0;.#endif.#ifde
5760: 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  f SQLITE_VDBE_CO
5770: 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74 2d  VERAGE.    pOut-
5780: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e  >iSrcLine = iLin
5790: 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20  eno+i;.#else.   
57a0: 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a   (void)iLineno;.
57b0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
57c0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69  LITE_DEBUG.    i
57d0: 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  f( p->db->flags 
57e0: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
57f0: 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  opTrace ){.     
5800: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
5810: 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70 2c  tOp(0, i+p->nOp,
5820: 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e 4f   &p->aOp[i+p->nO
5830: 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  p]);.    }.#endi
5840: 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b  f.  }.  p->nOp +
5850: 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = nOp;.  return 
5860: 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20 64  pFirst;.}..#if d
5870: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
5880: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
5890: 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ATUS)./*.** Add 
58a0: 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
58b0: 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65 72  array of counter
58c0: 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71 6c  s managed by sql
58d0: 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
58e0: 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  atus()..*/.void 
58f0: 73 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e 53  sqlite3VdbeScanS
5900: 74 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a 70  tatus(.  Vdbe *p
5910: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5920: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20 74           /* VM t
5930: 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74 75 73  o add scanstatus
5940: 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 61  () to */.  int a
5950: 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20 20  ddrExplain,     
5960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
5970: 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70 6c  dress of OP_Expl
5980: 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20 20  ain (or 0) */.  
5990: 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20 20  int addrLoop,   
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c 6f  /* Address of lo
59c0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a 20  op counter */ . 
59d0: 20 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c 20   int addrVisit, 
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59f0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72   /* Address of r
5a00: 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f 75 6e  ows visited coun
5a10: 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ter */.  LogEst 
5a20: 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  nEst,           
5a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69           /* Esti
5a40: 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
5a50: 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20  output rows */. 
5a60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5a70: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
5a80: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
5a90: 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e 67  e or index being
5aa0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20   scanned */.){. 
5ab0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d   int nByte = (p-
5ac0: 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a 65  >nScan+1) * size
5ad0: 6f 66 28 53 63 61 6e 53 74 61 74 75 73 29 3b 0a  of(ScanStatus);.
5ae0: 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 61 4e    ScanStatus *aN
5af0: 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53 63  ew;.  aNew = (Sc
5b00: 61 6e 53 74 61 74 75 73 2a 29 73 71 6c 69 74 65  anStatus*)sqlite
5b10: 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62  3DbRealloc(p->db
5b20: 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79 74  , p->aScan, nByt
5b30: 65 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20 29  e);.  if( aNew )
5b40: 7b 0a 20 20 20 20 53 63 61 6e 53 74 61 74 75 73  {.    ScanStatus
5b50: 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70   *pNew = &aNew[p
5b60: 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20  ->nScan++];.    
5b70: 70 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61 69  pNew->addrExplai
5b80: 6e 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e 3b  n = addrExplain;
5b90: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4c  .    pNew->addrL
5ba0: 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a  oop = addrLoop;.
5bb0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56 69      pNew->addrVi
5bc0: 73 69 74 20 3d 20 61 64 64 72 56 69 73 69 74 3b  sit = addrVisit;
5bd0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74 20  .    pNew->nEst 
5be0: 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65 77  = nEst;.    pNew
5bf0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
5c00: 33 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62 2c  3DbStrDup(p->db,
5c10: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e   zName);.    p->
5c20: 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20 20  aScan = aNew;.  
5c30: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
5c40: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
5c50: 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  lue of the opcod
5c60: 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20 50 33  e, or P1, P2, P3
5c70: 2c 20 6f 72 20 50 35 20 6f 70 65 72 61 6e 64 73  , or P5 operands
5c80: 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65 63 69 66  .** for a specif
5c90: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
5ca0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5cb0: 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28  dbeChangeOpcode(
5cc0: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
5cd0: 72 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f 64 65  r, u8 iNewOpcode
5ce0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
5cf0: 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 6f  GetOp(p,addr)->o
5d00: 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63 6f  pcode = iNewOpco
5d10: 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  de;.}.void sqlit
5d20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56  e3VdbeChangeP1(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 31 20 3d 20 76 61 6c  ,addr)->p1 = 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 32 28 56 64 62  VdbeChangeP2(Vdb
5d90: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
5da0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69  int val){.  sqli
5db0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61  te3VdbeGetOp(p,a
5dc0: 64 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a  ddr)->p2 = val;.
5dd0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
5de0: 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20  beChangeP3(Vdbe 
5df0: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e  *p, u32 addr, in
5e00: 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65  t val){.  sqlite
5e10: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64  3VdbeGetOp(p,add
5e20: 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a  r)->p3 = val;.}.
5e30: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5e40: 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70  ChangeP5(Vdbe *p
5e50: 2c 20 75 31 36 20 70 35 29 7b 0a 20 20 61 73 73  , u16 p5){.  ass
5e60: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c  ert( p->nOp>0 ||
5e70: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
5e80: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
5e90: 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e 61 4f 70 5b  >nOp>0 ) p->aOp[
5ea0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 70  p->nOp-1].p5 = p
5eb0: 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  5;.}../*.** Chan
5ec0: 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  ge the P2 operan
5ed0: 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  d of instruction
5ee0: 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74   addr so that it
5ef0: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
5f00: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
5f10: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
5f20: 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a  n to be coded..*
5f30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5f40: 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20  beJumpHere(Vdbe 
5f50: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
5f60: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5f70: 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d  geP2(p, addr, p-
5f80: 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  >nOp);.}.../*.**
5f90: 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75   If the input Fu
5fa0: 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20  ncDef structure 
5fb0: 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68  is ephemeral, th
5fc0: 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a  en free it.  If.
5fd0: 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69  ** the FuncDef i
5fe0: 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20  s not ephermal, 
5ff0: 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  then do nothing.
6000: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6010: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
6020: 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  ction(sqlite3 *d
6030: 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66  b, FuncDef *pDef
6040: 29 7b 0a 20 20 69 66 28 20 28 70 44 65 66 2d 3e  ){.  if( (pDef->
6050: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
6060: 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d  TE_FUNC_EPHEM)!=
6070: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
6080: 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29  DbFree(db, pDef)
6090: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
60a0: 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41  void vdbeFreeOpA
60b0: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20  rray(sqlite3 *, 
60c0: 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  Op *, int);../*.
60d0: 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76  ** Delete a P4 v
60e0: 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72  alue if necessar
60f0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  y..*/.static SQL
6100: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
6110: 64 20 66 72 65 65 50 34 4d 65 6d 28 73 71 6c 69  d freeP4Mem(sqli
6120: 74 65 33 20 2a 64 62 2c 20 4d 65 6d 20 2a 70 29  te3 *db, Mem *p)
6130: 7b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c  {.  if( p->szMal
6140: 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46  loc ) sqlite3DbF
6150: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
6160: 6f 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  oc);.  sqlite3Db
6170: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 73  Free(db, p);.}.s
6180: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
6190: 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50  NLINE void freeP
61a0: 34 46 75 6e 63 43 74 78 28 73 71 6c 69 74 65 33  4FuncCtx(sqlite3
61b0: 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f   *db, sqlite3_co
61c0: 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 66 72 65  ntext *p){.  fre
61d0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
61e0: 6f 6e 28 64 62 2c 20 70 2d 3e 70 46 75 6e 63 29  on(db, p->pFunc)
61f0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
6200: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74  e(db, p);.}.stat
6210: 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73  ic void freeP4(s
6220: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
6230: 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34  p4type, void *p4
6240: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 64 62 20  ){.  assert( db 
6250: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 34 74  );.  switch( p4t
6260: 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
6270: 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20  P4_FUNCCTX: {.  
6280: 20 20 20 20 66 72 65 65 50 34 46 75 6e 63 43 74      freeP4FuncCt
6290: 78 28 64 62 2c 20 28 73 71 6c 69 74 65 33 5f 63  x(db, (sqlite3_c
62a0: 6f 6e 74 65 78 74 2a 29 70 34 29 3b 0a 20 20 20  ontext*)p4);.   
62b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
62c0: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
62d0: 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  :.    case P4_IN
62e0: 54 36 34 3a 0a 20 20 20 20 63 61 73 65 20 50 34  T64:.    case P4
62f0: 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 63 61  _DYNAMIC:.    ca
6300: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20  se P4_INTARRAY: 
6310: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
6320: 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20  bFree(db, p4);. 
6330: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6340: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  }.    case P4_KE
6350: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
6360: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
6370: 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  eed==0 ) sqlite3
6380: 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65  KeyInfoUnref((Ke
6390: 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20  yInfo*)p4);.    
63a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
63b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
63c0: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
63d0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50  .    case P4_EXP
63e0: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
63f0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
6400: 20 28 45 78 70 72 2a 29 70 34 29 3b 0a 20 20 20   (Expr*)p4);.   
6410: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6420: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
6430: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
6440: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
6450: 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46  lFunction(db, (F
6460: 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20  uncDef*)p4);.   
6470: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6480: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
6490: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d   {.      if( db-
64a0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
64b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
64c0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
64d0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29  lite3_value*)p4)
64e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
64f0: 20 20 20 20 20 20 20 66 72 65 65 50 34 4d 65 6d         freeP4Mem
6500: 28 64 62 2c 20 28 4d 65 6d 2a 29 70 34 29 3b 0a  (db, (Mem*)p4);.
6510: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
6520: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6530: 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a  ase P4_VTAB : {.
6540: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
6550: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
6560: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
6570: 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b  k((VTable *)p4);
6580: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6590: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
65a0: 20 46 72 65 65 20 74 68 65 20 73 70 61 63 65 20   Free the space 
65b0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f  allocated for aO
65c0: 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c  p and any p4 val
65d0: 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ues allocated fo
65e0: 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73  r the.** opcodes
65f0: 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
6600: 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74  n. If aOp is not
6610: 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75   NULL it is assu
6620: 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a  med to contain .
6630: 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20  ** nOp entries. 
6640: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6650: 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
6660: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20  sqlite3 *db, Op 
6670: 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a  *aOp, int nOp){.
6680: 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20    if( aOp ){.   
6690: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f   Op *pOp;.    fo
66a0: 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26  r(pOp=aOp; pOp<&
66b0: 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29  aOp[nOp]; pOp++)
66c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
66d0: 3e 70 34 74 79 70 65 20 29 20 66 72 65 65 50 34  >p4type ) freeP4
66e0: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
66f0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69  , pOp->p4.p);.#i
6700: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6710: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
6720: 4e 54 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65  NTS.      sqlite
6730: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d  3DbFree(db, pOp-
6740: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64  >zComment);.#end
6750: 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20  if     .    }.  
6760: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
6770: 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f  e(db, aOp);.}../
6780: 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75  *.** Link the Su
6790: 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20  bProgram object 
67a0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
67b0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e  cond argument in
67c0: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a  to the linked.**
67d0: 20 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70 53   list at Vdbe.pS
67e0: 75 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20  ubProgram. This 
67f0: 6c 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20  list is used to 
6800: 64 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70  delete all sub-p
6810: 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74  rogram.** object
6820: 73 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73  s when the VM is
6830: 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   no longer requi
6840: 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  red..*/.void sql
6850: 69 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50  ite3VdbeLinkSubP
6860: 72 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64  rogram(Vdbe *pVd
6870: 62 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  be, SubProgram *
6880: 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  p){.  p->pNext =
6890: 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d   pVdbe->pProgram
68a0: 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  ;.  pVdbe->pProg
68b0: 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  ram = p;.}../*.*
68c0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63  * Change the opc
68d0: 6f 64 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f  ode at addr into
68e0: 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20   OP_Noop.*/.int 
68f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6900: 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c  eToNoop(Vdbe *p,
6910: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 56 64   int addr){.  Vd
6920: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
6930: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
6940: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
6950: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e  .  assert( addr>
6960: 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f  =0 && addr<p->nO
6970: 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  p );.  pOp = &p-
6980: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72  >aOp[addr];.  fr
6990: 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d  eeP4(p->db, pOp-
69a0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
69b0: 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  .p);.  pOp->p4ty
69c0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
69d0: 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30  .  pOp->p4.z = 0
69e0: 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20  ;.  pOp->opcode 
69f0: 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74  = OP_Noop;.  ret
6a00: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
6a10: 49 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f  If the last opco
6a20: 64 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69  de is "op" and i
6a30: 74 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20  t is not a jump 
6a40: 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20  destination,.** 
6a50: 74 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20  then remove it. 
6a60: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
6a70: 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f  and only if an o
6a80: 70 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65  pcode was remove
6a90: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
6aa0: 33 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72  3VdbeDeletePrior
6ab0: 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20  Opcode(Vdbe *p, 
6ac0: 75 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 70 2d  u8 op){.  if( p-
6ad0: 3e 6e 4f 70 3e 30 20 26 26 20 70 2d 3e 61 4f 70  >nOp>0 && p->aOp
6ae0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64  [p->nOp-1].opcod
6af0: 65 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 72 65 74  e==op ){.    ret
6b00: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43  urn sqlite3VdbeC
6b10: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70  hangeToNoop(p, p
6b20: 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 7d 65 6c 73  ->nOp-1);.  }els
6b30: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
6b40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
6b50: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
6b60: 66 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  f the P4 operand
6b70: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
6b80: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
6b90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
6ba0: 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61  useful when a la
6bb0: 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  rge program is l
6bc0: 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20  oaded from a.** 
6bd0: 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69  static array usi
6be0: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ng sqlite3VdbeAd
6bf0: 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77  dOpList but we w
6c00: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a  ant to make a.**
6c10: 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67   few minor chang
6c20: 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  es to the progra
6c30: 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30  m..**.** If n>=0
6c40: 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65   then the P4 ope
6c50: 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c  rand is dynamic,
6c60: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20   meaning that a 
6c70: 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73  copy of.** the s
6c80: 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e  tring is made in
6c90: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
6ca0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
6cb0: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76  malloc()..** A v
6cc0: 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61  alue of n==0 mea
6cd0: 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66  ns copy bytes of
6ce0: 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69   zP4 up to and i
6cf0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20  ncluding the.** 
6d00: 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e  first null byte.
6d10: 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f    If n>0 then co
6d20: 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20  py n+1 bytes of 
6d30: 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65  zP4..** .** Othe
6d40: 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50  r values of n (P
6d50: 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c  4_STATIC, P4_COL
6d60: 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63  LSEQ etc.) indic
6d70: 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69  ate that zP4 poi
6d80: 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69  nts.** to a stri
6d90: 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20  ng or structure 
6da0: 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65  that is guarante
6db0: 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20  ed to exist for 
6dc0: 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a  the lifetime of.
6dd0: 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20  ** the Vdbe. In 
6de0: 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63  these cases we c
6df0: 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65  an just copy the
6e00: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
6e10: 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63  If addr<0 then c
6e20: 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20  hange P4 on the 
6e30: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
6e40: 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69  serted instructi
6e50: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
6e60: 69 64 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  id SQLITE_NOINLI
6e70: 4e 45 20 76 64 62 65 43 68 61 6e 67 65 50 34 46  NE vdbeChangeP4F
6e80: 75 6c 6c 28 0a 20 20 56 64 62 65 20 2a 70 2c 0a  ull(.  Vdbe *p,.
6e90: 20 20 4f 70 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e    Op *pOp,.  con
6ea0: 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 0a 20 20  st char *zP4,.  
6eb0: 69 6e 74 20 6e 0a 29 7b 0a 20 20 69 66 28 20 70  int n.){.  if( p
6ec0: 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20  Op->p4type ){.  
6ed0: 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20    freeP4(p->db, 
6ee0: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
6ef0: 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 70 4f 70  ->p4.p);.    pOp
6f00: 2d 3e 70 34 74 79 70 65 20 3d 20 30 3b 0a 20 20  ->p4type = 0;.  
6f10: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b    pOp->p4.p = 0;
6f20: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 30 20 29  .  }.  if( n<0 )
6f30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
6f40: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 28 69 6e  eChangeP4(p, (in
6f50: 74 29 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29  t)(pOp - p->aOp)
6f60: 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c  , zP4, n);.  }el
6f70: 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30  se{.    if( n==0
6f80: 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   ) n = sqlite3St
6f90: 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20  rlen30(zP4);.   
6fa0: 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c   pOp->p4.z = sql
6fb0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d  ite3DbStrNDup(p-
6fc0: 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20  >db, zP4, n);.  
6fd0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
6fe0: 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a  P4_DYNAMIC;.  }.
6ff0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
7000: 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65 20  beChangeP4(Vdbe 
7010: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f  *p, int addr, co
7020: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69  nst char *zP4, i
7030: 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70  nt n){.  Op *pOp
7040: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
7050: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
7060: 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
7070: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
7080: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
7090: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
70a0: 28 20 70 2d 3e 61 4f 70 21 3d 30 20 7c 7c 20 64  ( p->aOp!=0 || d
70b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
70c0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
70d0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
70e0: 20 69 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20   if( n!=P4_VTAB 
70f0: 29 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20  ) freeP4(db, n, 
7100: 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29  (void*)*(char**)
7110: 26 7a 50 34 29 3b 0a 20 20 20 20 72 65 74 75 72  &zP4);.    retur
7120: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
7130: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61   p->nOp>0 );.  a
7140: 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e  ssert( addr<p->n
7150: 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  Op );.  if( addr
7160: 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d  <0 ){.    addr =
7170: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
7180: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
7190: 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28 20 6e 3e  [addr];.  if( n>
71a0: 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70  =0 || pOp->p4typ
71b0: 65 20 29 7b 0a 20 20 20 20 76 64 62 65 43 68 61  e ){.    vdbeCha
71c0: 6e 67 65 50 34 46 75 6c 6c 28 70 2c 20 70 4f 70  ngeP4Full(p, pOp
71d0: 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 72  , zP4, n);.    r
71e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
71f0: 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a   n==P4_INT32 ){.
7200: 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69      /* Note: thi
7210: 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20  s cast is safe, 
7220: 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67  because the orig
7230: 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61  in data point wa
7240: 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20  s an int.    ** 
7250: 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f  that was cast to
7260: 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   a (const char *
7270: 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70  ). */.    pOp->p
7280: 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  4.i = SQLITE_PTR
7290: 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20  _TO_INT(zP4);.  
72a0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
72b0: 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73  P4_INT32;.  }els
72c0: 65 20 69 66 28 20 7a 50 34 21 3d 30 20 29 7b 0a  e if( zP4!=0 ){.
72d0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 30 20      assert( n<0 
72e0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
72f0: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
7300: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
7310: 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b   (signed char)n;
7320: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 50 34 5f 56  .    if( n==P4_V
7330: 54 41 42 20 29 20 73 71 6c 69 74 65 33 56 74 61  TAB ) sqlite3Vta
7340: 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 2a 29 7a  bLock((VTable*)z
7350: 50 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  P4);.  }.}../*.*
7360: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 34 20  * Change the P4 
7370: 6f 70 65 72 61 6e 64 20 6f 66 20 74 68 65 20 6d  operand of the m
7380: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
7390: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a  ed instruction .
73a0: 2a 2a 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ** to the value 
73b0: 64 65 66 69 6e 65 64 20 62 79 20 74 68 65 20 61  defined by the a
73c0: 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 69 73 20  rguments.  This 
73d0: 69 73 20 61 20 68 69 67 68 2d 73 70 65 65 64 0a  is a high-speed.
73e0: 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ** version of sq
73f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7400: 34 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  4()..**.** The P
7410: 34 20 6f 70 65 72 61 6e 64 20 6d 75 73 74 20 6e  4 operand must n
7420: 6f 74 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ot have been pre
7430: 76 69 6f 75 73 6c 79 20 64 65 66 69 6e 65 64 2e  viously defined.
7440: 20 20 41 6e 64 20 74 68 65 20 6e 65 77 0a 2a 2a    And the new.**
7450: 20 50 34 20 6d 75 73 74 20 6e 6f 74 20 62 65 20   P4 must not be 
7460: 50 34 5f 49 4e 54 33 32 2e 20 20 55 73 65 20 73  P4_INT32.  Use s
7470: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7480: 50 34 28 29 20 69 6e 20 65 69 74 68 65 72 20 6f  P4() in either o
7490: 66 0a 2a 2a 20 74 68 6f 73 65 20 63 61 73 65 73  f.** those cases
74a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
74b0: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 56 64  3VdbeAppendP4(Vd
74c0: 62 65 20 2a 70 2c 20 76 6f 69 64 20 2a 70 50 34  be *p, void *pP4
74d0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 56 64 62 65  , int n){.  Vdbe
74e0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72  Op *pOp;.  asser
74f0: 74 28 20 6e 21 3d 50 34 5f 49 4e 54 33 32 20 26  t( n!=P4_INT32 &
7500: 26 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 3b 0a  & n!=P4_VTAB );.
7510: 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 30 20 29    assert( n<=0 )
7520: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
7530: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
7540: 20 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c     freeP4(p->db,
7550: 20 6e 2c 20 70 50 34 29 3b 0a 20 20 7d 65 6c 73   n, pP4);.  }els
7560: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
7570: 50 34 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  P4!=0 );.    ass
7580: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
7590: 0a 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  .    pOp = &p->a
75a0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20  Op[p->nOp-1];.  
75b0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70    assert( pOp->p
75c0: 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53 45  4type==P4_NOTUSE
75d0: 44 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  D );.    pOp->p4
75e0: 74 79 70 65 20 3d 20 6e 3b 0a 20 20 20 20 70 4f  type = n;.    pO
75f0: 70 2d 3e 70 34 2e 70 20 3d 20 70 50 34 3b 0a 20  p->p4.p = pP4;. 
7600: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
7610: 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  the P4 on the mo
7620: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
7630: 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20  d opcode to the 
7640: 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a  KeyInfo for the.
7650: 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a  ** index given..
7660: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7670: 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
7680: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
7690: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56  ndex *pIdx){.  V
76a0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
76b0: 3e 70 56 64 62 65 3b 0a 20 20 4b 65 79 49 6e 66  >pVdbe;.  KeyInf
76c0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 61  o *pKeyInfo;.  a
76d0: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
76e0: 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
76f0: 20 29 3b 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d   );.  pKeyInfo =
7700: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f   sqlite3KeyInfoO
7710: 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
7720: 49 64 78 29 3b 0a 20 20 69 66 28 20 70 4b 65 79  Idx);.  if( pKey
7730: 49 6e 66 6f 20 29 20 73 71 6c 69 74 65 33 56 64  Info ) sqlite3Vd
7740: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 4b  beAppendP4(v, pK
7750: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
7760: 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  FO);.}..#ifdef S
7770: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
7780: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a  LAIN_COMMENTS./*
7790: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63  .** Change the c
77a0: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  omment on the mo
77b0: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65  st recently code
77c0: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  d instruction.  
77d0: 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e  Or.** insert a N
77e0: 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65  o-op and add the
77f0: 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74   comment to that
7800: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
7810: 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73  .  This.** makes
7820: 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72   the code easier
7830: 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20   to read during 
7840: 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65  debugging.  None
7850: 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   of this happens
7860: 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74  .** in a product
7870: 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74  ion build..*/.st
7880: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 56 43  atic void vdbeVC
7890: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
78a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
78b0: 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29  mat, va_list ap)
78c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  {.  assert( p->n
78d0: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
78e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
78f0: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
7900: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
7910: 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64  mment==0 || p->d
7920: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7930: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
7940: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7950: 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c  ->aOp );.    sql
7960: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
7970: 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  , p->aOp[p->nOp-
7980: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  1].zComment);.  
7990: 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d    p->aOp[p->nOp-
79a0: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71  1].zComment = sq
79b0: 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d  lite3VMPrintf(p-
79c0: 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  >db, zFormat, ap
79d0: 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
79e0: 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74  lite3VdbeComment
79f0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
7a00: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
7a10: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
7a20: 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  p;.  if( p ){.  
7a30: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
7a40: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62  Format);.    vdb
7a50: 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f  eVComment(p, zFo
7a60: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
7a70: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
7a80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7a90: 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62  eNoopComment(Vdb
7aa0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
7ab0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
7ac0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
7ad0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71   if( p ){.    sq
7ae0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
7af0: 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20  p, OP_Noop);.   
7b00: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
7b10: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65  ormat);.    vdbe
7b20: 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72  VComment(p, zFor
7b30: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
7b40: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
7b50: 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55  #endif  /* NDEBU
7b60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
7b70: 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  ITE_VDBE_COVERAG
7b80: 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  E./*.** Set the 
7b90: 76 61 6c 75 65 20 69 66 20 74 68 65 20 69 53 72  value if the iSr
7ba0: 63 4c 69 6e 65 20 66 69 65 6c 64 20 66 6f 72 20  cLine field for 
7bb0: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 63  the previously c
7bc0: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
7bd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7be0: 33 56 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62  3VdbeSetLineNumb
7bf0: 65 72 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  er(Vdbe *v, int 
7c00: 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65  iLine){.  sqlite
7c10: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29  3VdbeGetOp(v,-1)
7c20: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69  ->iSrcLine = iLi
7c30: 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ne;.}.#endif /* 
7c40: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
7c50: 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RAGE */../*.** R
7c60: 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65  eturn the opcode
7c70: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64   for a given add
7c80: 72 65 73 73 2e 20 20 49 66 20 74 68 65 20 61 64  ress.  If the ad
7c90: 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65  dress is -1, the
7ca0: 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20  n.** return the 
7cb0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
7cc0: 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a  serted opcode..*
7cd0: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
7ce0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
7cf0: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 70  r has occurred p
7d00: 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rior to the call
7d10: 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72  ing of this.** r
7d20: 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70  outine, then a p
7d30: 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d  ointer to a dumm
7d40: 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65  y VdbeOp will be
7d50: 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74   returned.  That
7d60: 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65   opcode.** is re
7d70: 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77  adable but not w
7d80: 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20  ritable, though 
7d90: 69 74 20 69 73 20 63 61 73 74 20 74 6f 20 61 20  it is cast to a 
7da0: 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a  writable value..
7db0: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66  ** The return of
7dc0: 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20   a dummy opcode 
7dd0: 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20  allows the call 
7de0: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63  to continue func
7df0: 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72  tioning.** after
7e00: 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69   an OOM fault wi
7e10: 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
7e20: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
7e30: 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20  the return from 
7e40: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
7e50: 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e   is a valid poin
7e60: 74 65 72 2e 20 20 42 75 74 20 62 65 63 61 75 73  ter.  But becaus
7e70: 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f  e the dummy.opco
7e80: 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d  de is 0,.** dumm
7e90: 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  y will never be 
7ea0: 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69  written to.  Thi
7eb0: 73 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79  s is verified by
7ec0: 20 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e   code inspection
7ed0: 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69   and.** by runni
7ee0: 6e 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64  ng with Valgrind
7ef0: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
7f00: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64  ite3VdbeGetOp(Vd
7f10: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
7f20: 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69  {.  /* C89 speci
7f30: 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  fies that the co
7f40: 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77  nstant "dummy" w
7f50: 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ill be initializ
7f60: 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a  ed to all.  ** z
7f70: 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63  eros, which is c
7f80: 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65  orrect.  MSVC ge
7f90: 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e  nerates a warnin
7fa0: 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e  g, nevertheless.
7fb0: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64 62   */.  static Vdb
7fc0: 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49  eOp dummy;  /* I
7fd0: 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77  gnore the MSVC w
7fe0: 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20  arning about no 
7ff0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20  initializer */. 
8000: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
8010: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
8020: 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  IT );.  if( addr
8030: 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d  <0 ){.    addr =
8040: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
8050: 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72  .  assert( (addr
8060: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
8070: 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  Op) || p->db->ma
8080: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
8090: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
80a0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
80b0: 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26  eturn (VdbeOp*)&
80c0: 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  dummy;.  }else{.
80d0: 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
80e0: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a  Op[addr];.  }.}.
80f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
8100: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
8110: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a  IN_COMMENTS)./*.
8120: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  ** Return an int
8130: 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 6f  eger value for o
8140: 6e 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  ne of the parame
8150: 74 65 72 73 20 74 6f 20 74 68 65 20 6f 70 63 6f  ters to the opco
8160: 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d  de pOp.** determ
8170: 69 6e 65 64 20 62 79 20 63 68 61 72 61 63 74 65  ined by characte
8180: 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  r c..*/.static i
8190: 6e 74 20 74 72 61 6e 73 6c 61 74 65 50 28 63 68  nt translateP(ch
81a0: 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a  ar c, const Op *
81b0: 70 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27  pOp){.  if( c=='
81c0: 31 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  1' ) return pOp-
81d0: 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32  >p1;.  if( c=='2
81e0: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ' ) return pOp->
81f0: 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33 27  p2;.  if( c=='3'
8200: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
8210: 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34 27 20  3;.  if( c=='4' 
8220: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34  ) return pOp->p4
8230: 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70  .i;.  return pOp
8240: 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ->p5;.}../*.** C
8250: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
8260: 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74  for the "comment
8270: 22 20 66 69 65 6c 64 20 6f 66 20 61 20 56 44 42  " field of a VDB
8280: 45 20 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e 67  E opcode listing
8290: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f  ..**.** The Syno
82a0: 70 73 69 73 3a 20 66 69 65 6c 64 20 69 6e 20 63  psis: field in c
82b0: 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 76  omments in the v
82c0: 64 62 65 2e 63 20 73 6f 75 72 63 65 20 66 69 6c  dbe.c source fil
82d0: 65 20 67 65 74 73 20 63 6f 6e 76 65 72 74 65 64  e gets converted
82e0: 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74 72 61 20  .** to an extra 
82f0: 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 61  string that is a
8300: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 73  ppended to the s
8310: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
8320: 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61  ().  In the.** a
8330: 62 73 65 6e 63 65 20 6f 66 20 6f 74 68 65 72 20  bsence of other 
8340: 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20 73  comments, this s
8350: 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d 65 73 20  ynopsis becomes 
8360: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
8370: 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f  he opcode..** So
8380: 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f  me translation o
8390: 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ccurs:.**.**    
83a0: 20 20 20 22 50 58 22 20 20 20 20 20 20 2d 3e 20     "PX"      -> 
83b0: 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20   "r[X]".**      
83c0: 20 22 50 58 40 50 59 22 20 20 20 2d 3e 20 20 22   "PX@PY"   ->  "
83d0: 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72  r[X..X+Y-1]"  or
83e0: 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20   "r[x]" if y is 
83f0: 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20 20  0 or 1.**       
8400: 22 50 58 40 50 59 2b 31 22 20 2d 3e 20 20 22 72  "PX@PY+1" ->  "r
8410: 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20  [X..X+Y]"    or 
8420: 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30  "r[x]" if y is 0
8430: 0a 2a 2a 20 20 20 20 20 20 20 22 50 59 2e 2e 50  .**       "PY..P
8440: 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d  Y"  ->  "r[X..Y]
8450: 22 20 20 20 20 20 20 6f 72 20 22 72 5b 78 5d 22  "      or "r[x]"
8460: 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74   if y<=x.*/.stat
8470: 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43 6f  ic int displayCo
8480: 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f  mment(.  const O
8490: 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54  p *pOp,     /* T
84a0: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 20  he opcode to be 
84b0: 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63  commented */.  c
84c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
84d0: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20    /* Previously 
84e0: 6f 62 74 61 69 6e 65 64 20 76 61 6c 75 65 20 66  obtained value f
84f0: 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68 61 72 20  or P4 */.  char 
8500: 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a  *zTemp,       /*
8510: 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 68 65   Write result he
8520: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d  re */.  int nTem
8530: 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70  p          /* Sp
8540: 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  ace available in
8550: 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20   zTemp[] */.){. 
8560: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
8570: 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Name;.  const ch
8580: 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20  ar *zSynopsis;. 
8590: 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20   int nOpName;.  
85a0: 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 63 68  int ii, jj;.  ch
85b0: 61 72 20 7a 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a  ar zAlt[50];.  z
85c0: 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  OpName = sqlite3
85d0: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
85e0: 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61  opcode);.  nOpNa
85f0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
8600: 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20  en30(zOpName);. 
8610: 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70   if( zOpName[nOp
8620: 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69  Name+1] ){.    i
8630: 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a  nt seenCom = 0;.
8640: 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20      char c;.    
8650: 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e  zSynopsis = zOpN
8660: 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b  ame += nOpName +
8670: 20 31 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e   1;.    if( strn
8680: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2c 22 49  cmp(zSynopsis,"I
8690: 46 20 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  F ",3)==0 ){.   
86a0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26     if( pOp->p5 &
86b0: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
86c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
86d0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
86e0: 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20  of(zAlt), zAlt, 
86f0: 22 72 5b 50 32 5d 20 3d 20 28 25 73 29 22 2c 20  "r[P2] = (%s)", 
8700: 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20  zSynopsis+3);.  
8710: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8720: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8730: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29  ntf(sizeof(zAlt)
8740: 2c 20 7a 41 6c 74 2c 20 22 69 66 20 25 73 20 67  , zAlt, "if %s g
8750: 6f 74 6f 20 50 32 22 2c 20 7a 53 79 6e 6f 70 73  oto P2", zSynops
8760: 69 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 0a 20  is+3);.      }. 
8770: 20 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d       zSynopsis =
8780: 20 7a 41 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 20   zAlt;.    }.   
8790: 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a   for(ii=jj=0; jj
87a0: 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d  <nTemp-1 && (c =
87b0: 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21   zSynopsis[ii])!
87c0: 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  =0; ii++){.     
87d0: 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20   if( c=='P' ){. 
87e0: 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f         c = zSyno
87f0: 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20  psis[++ii];.    
8800: 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29      if( c=='4' )
8810: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
8820: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
8830: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
8840: 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20   "%s", zP4);.   
8850: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
8860: 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20  =='X' ){.       
8870: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8880: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
8890: 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f  emp+jj, "%s", pO
88a0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  p->zComment);.  
88b0: 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20          seenCom 
88c0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
88d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
88e0: 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65  t v1 = translate
88f0: 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  P(c, pOp);.     
8900: 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20       int v2;.   
8910: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8920: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
8930: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22  , zTemp+jj, "%d"
8940: 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , v1);.         
8950: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
8960: 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50  nopsis+ii+1, "@P
8970: 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 2)==0 ){.    
8980: 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b          ii += 3;
8990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
89a0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
89b0: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20  30(zTemp+jj);.  
89c0: 20 20 20 20 20 20 20 20 20 20 76 32 20 3d 20 74            v2 = t
89d0: 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70  ranslateP(zSynop
89e0: 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20  sis[ii], pOp);. 
89f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
8a00: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
8a10: 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30  +ii+1,"+1",2)==0
8a20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8a30: 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20    ii += 2;.     
8a40: 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20           v2++;. 
8a50: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8a60: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 32 3e           if( v2>
8a70: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
8a80: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8a90: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
8aa0: 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20  emp+jj, "..%d", 
8ab0: 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20  v1+v2-1);.      
8ac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8ad0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
8ae0: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69  cmp(zSynopsis+ii
8af0: 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d  +1, "..P3", 4)==
8b00: 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20  0 && pOp->p3==0 
8b10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
8b20: 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
8b30: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
8b40: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
8b50: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
8b60: 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  p+jj);.      }el
8b70: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  se{.        zTem
8b80: 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  p[jj++] = c;.   
8b90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
8ba0: 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a  f( !seenCom && j
8bb0: 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70  j<nTemp-5 && pOp
8bc0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
8bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8be0: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
8bf0: 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c  Temp+jj, "; %s",
8c00: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
8c10: 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c  .      jj += sql
8c20: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
8c30: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20  mp+jj);.    }.  
8c40: 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29    if( jj<nTemp )
8c50: 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a   zTemp[jj] = 0;.
8c60: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
8c70: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
8c80: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8c90: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
8ca0: 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  "%s", pOp->zComm
8cb0: 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73  ent);.    jj = s
8cc0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8cd0: 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Temp);.  }else{.
8ce0: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
8cf0: 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20  ;.    jj = 0;.  
8d00: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d  }.  return jj;.}
8d10: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8d20: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20  E_DEBUG */..#if 
8d30: 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20  VDBE_DISPLAY_P4 
8d40: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
8d50: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
8d60: 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61  HINTS)./*.** Tra
8d70: 6e 73 6c 61 74 65 20 74 68 65 20 50 34 2e 70 45  nslate the P4.pE
8d80: 78 70 72 20 76 61 6c 75 65 20 66 6f 72 20 61 6e  xpr value for an
8d90: 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20 6f   OP_CursorHint o
8da0: 70 63 6f 64 65 20 69 6e 74 6f 20 74 65 78 74 0a  pcode into text.
8db0: 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 64  ** that can be d
8dc0: 69 73 70 6c 61 79 65 64 20 69 6e 20 74 68 65 20  isplayed in the 
8dd0: 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58 50  P4 column of EXP
8de0: 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a  LAIN output..*/.
8df0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70  static void disp
8e00: 6c 61 79 50 34 45 78 70 72 28 53 74 72 41 63 63  layP4Expr(StrAcc
8e10: 75 6d 20 2a 70 2c 20 45 78 70 72 20 2a 70 45 78  um *p, Expr *pEx
8e20: 70 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  pr){.  const cha
8e30: 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 73 77  r *zOp = 0;.  sw
8e40: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
8e50: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  ){.    case TK_S
8e60: 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 73 71 6c  TRING:.      sql
8e70: 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22  ite3XPrintf(p, "
8e80: 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  %Q", pExpr->u.zT
8e90: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
8ea0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8eb0: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 73  INTEGER:.      s
8ec0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
8ed0: 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e   "%d", pExpr->u.
8ee0: 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  iValue);.      b
8ef0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8f00: 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71  K_NULL:.      sq
8f10: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
8f20: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62  "NULL");.      b
8f30: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8f40: 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
8f50: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
8f60: 74 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70  tf(p, "r[%d]", p
8f70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
8f80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8f90: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
8fa0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
8fb0: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
8fc0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  <0 ){.        sq
8fd0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
8fe0: 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20  "rowid");.      
8ff0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9000: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
9010: 20 22 63 25 64 22 2c 20 28 69 6e 74 29 70 45 78   "c%d", (int)pEx
9020: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
9030: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
9040: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9050: 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 4f  e TK_LT:      zO
9060: 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 20 62  p = "LT";      b
9070: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9080: 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_LE:      zOp =
9090: 20 22 4c 45 22 3b 20 20 20 20 20 20 62 72 65 61   "LE";      brea
90a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
90b0: 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47  T:      zOp = "G
90c0: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
90d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20      case TK_GE: 
90e0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 45 22 3b       zOp = "GE";
90f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9100: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
9110: 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20    zOp = "NE";   
9120: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9130: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a  se TK_EQ:      z
9140: 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20 20  Op = "EQ";      
9150: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9160: 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70 20  TK_IS:      zOp 
9170: 3d 20 22 49 53 22 3b 20 20 20 20 20 20 62 72 65  = "IS";      bre
9180: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9190: 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20 22  ISNOT:   zOp = "
91a0: 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b 3b  ISNOT";   break;
91b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
91c0: 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e 44  :     zOp = "AND
91d0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
91e0: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20    case TK_OR:   
91f0: 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20 20     zOp = "OR";  
9200: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9210: 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20  ase TK_PLUS:    
9220: 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20  zOp = "ADD";    
9230: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9240: 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f 70   TK_STAR:    zOp
9250: 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20 62 72   = "MUL";     br
9260: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9270: 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d 20  _MINUS:   zOp = 
9280: 22 53 55 42 22 3b 20 20 20 20 20 62 72 65 61 6b  "SUB";     break
9290: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
92a0: 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 52 45  M:     zOp = "RE
92b0: 4d 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  M";     break;. 
92c0: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
92d0: 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 41 4e  D:  zOp = "BITAN
92e0: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
92f0: 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20  case TK_BITOR:  
9300: 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20   zOp = "BITOR"; 
9310: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9320: 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 4f  e TK_SLASH:   zO
9330: 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20 20 62  p = "DIV";     b
9340: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9350: 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d  K_LSHIFT:  zOp =
9360: 20 22 4c 53 48 49 46 54 22 3b 20 20 62 72 65 61   "LSHIFT";  brea
9370: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
9380: 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 52  SHIFT:  zOp = "R
9390: 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a  SHIFT";  break;.
93a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
93b0: 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e 43  AT:  zOp = "CONC
93c0: 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  AT";  break;.   
93d0: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
93e0: 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22 3b    zOp = "MINUS";
93f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9400: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a  se TK_UPLUS:   z
9410: 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 20 20 20  Op = "PLUS";    
9420: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9430: 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70 20  TK_BITNOT:  zOp 
9440: 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 62 72 65  = "BITNOT";  bre
9450: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9460: 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22  NOT:     zOp = "
9470: 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  NOT";     break;
9480: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
9490: 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53 4e  ULL:  zOp = "ISN
94a0: 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ULL";  break;.  
94b0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
94c0: 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c  L: zOp = "NOTNUL
94d0: 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  L"; break;..    
94e0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73  default:.      s
94f0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
9500: 20 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a   "%s", "expr");.
9510: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
9520: 0a 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20  ..  if( zOp ){. 
9530: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9540: 66 28 70 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29  f(p, "%s(", zOp)
9550: 3b 0a 20 20 20 20 64 69 73 70 6c 61 79 50 34 45  ;.    displayP4E
9560: 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 4c  xpr(p, pExpr->pL
9570: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 45  eft);.    if( pE
9580: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
9590: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
95a0: 63 63 75 6d 41 70 70 65 6e 64 28 70 2c 20 22 2c  ccumAppend(p, ",
95b0: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69 73  ", 1);.      dis
95c0: 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45  playP4Expr(p, pE
95d0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
95e0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53    }.    sqlite3S
95f0: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 2c  trAccumAppend(p,
9600: 20 22 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a   ")", 1);.  }.}.
9610: 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44  #endif /* VDBE_D
9620: 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66  ISPLAY_P4 && def
9630: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
9640: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29  LE_CURSOR_HINTS)
9650: 20 2a 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44   */...#if VDBE_D
9660: 49 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20  ISPLAY_P4./*.** 
9670: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
9680: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
9690: 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72  the P4 parameter
96a0: 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a   for an opcode..
96b0: 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72  ** Use zTemp for
96c0: 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65   any required te
96d0: 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73  mporary buffer s
96e0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
96f0: 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28  char *displayP4(
9700: 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a  Op *pOp, char *z
9710: 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29  Temp, int nTemp)
9720: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20  {.  char *zP4 = 
9730: 7a 54 65 6d 70 3b 0a 20 20 53 74 72 41 63 63 75  zTemp;.  StrAccu
9740: 6d 20 78 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  m x;.  assert( n
9750: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71  Temp>=20 );.  sq
9760: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
9770: 74 28 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20  t(&x, 0, zTemp, 
9780: 6e 54 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69  nTemp, 0);.  swi
9790: 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  tch( pOp->p4type
97a0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f   ){.    case P4_
97b0: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
97c0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65   int j;.      Ke
97d0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
97e0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
97f0: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
9800: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
9810: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
9820: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9830: 66 28 26 78 2c 20 22 6b 28 25 64 22 2c 20 70 4b  f(&x, "k(%d", pK
9840: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b  eyInfo->nField);
9850: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
9860: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  j<pKeyInfo->nFie
9870: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
9880: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
9890: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
98a0: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63  ll[j];.        c
98b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
98c0: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
98d0: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b 0a 20 20  ->zName : "";.  
98e0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
98f0: 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41 52 59 22  (zColl, "BINARY"
9900: 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d 20 22  )==0 ) zColl = "
9910: 42 22 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  B";.        sqli
9920: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
9930: 2c 25 73 25 73 22 2c 20 70 4b 65 79 49 6e 66 6f  ,%s%s", pKeyInfo
9940: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
9950: 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c  ? "-" : "", zCol
9960: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
9970: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
9980: 6d 41 70 70 65 6e 64 28 26 78 2c 20 22 29 22 2c  mAppend(&x, ")",
9990: 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
99a0: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
99b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
99c0: 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61  SOR_HINTS.    ca
99d0: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20  se P4_EXPR: {.  
99e0: 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70      displayP4Exp
99f0: 72 28 26 78 2c 20 70 4f 70 2d 3e 70 34 2e 70 45  r(&x, pOp->p4.pE
9a00: 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  xpr);.      brea
9a10: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
9a20: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
9a30: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
9a40: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
9a50: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
9a60: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9a70: 66 28 26 78 2c 20 22 28 25 2e 32 30 73 29 22 2c  f(&x, "(%.20s)",
9a80: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
9a90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9aa0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46   }.    case P4_F
9ab0: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
9ac0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20  FuncDef *pDef = 
9ad0: 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20  pOp->p4.pFunc;. 
9ae0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
9af0: 6e 74 66 28 26 78 2c 20 22 25 73 28 25 64 29 22  ntf(&x, "%s(%d)"
9b00: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
9b10: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
9b20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
9b30: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
9b40: 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
9b50: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
9b60: 29 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  ).    case P4_FU
9b70: 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46  NCCTX: {.      F
9b80: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
9b90: 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75  Op->p4.pCtx->pFu
9ba0: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
9bb0: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 73  3XPrintf(&x, "%s
9bc0: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
9bd0: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
9be0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9bf0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
9c00: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a  ase P4_INT64: {.
9c10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
9c20: 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c  intf(&x, "%lld",
9c30: 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b   *pOp->p4.pI64);
9c40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9c50: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
9c60: 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73  INT32: {.      s
9c70: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
9c80: 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%d", pOp->p4.
9c90: 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  i);.      break;
9ca0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9cb0: 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20  P4_REAL: {.     
9cc0: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
9cd0: 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f  &x, "%.16g", *pO
9ce0: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20  p->p4.pReal);.  
9cf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9d00: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
9d10: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  : {.      Mem *p
9d20: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d  Mem = pOp->p4.pM
9d30: 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  em;.      if( pM
9d40: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
9d50: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
9d60: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
9d70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
9d80: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
9d90: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Int ){.        s
9da0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
9db0: 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e  , "%lld", pMem->
9dc0: 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.i);.      }els
9dd0: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
9de0: 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  s & MEM_Real ){.
9df0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58          sqlite3X
9e00: 50 72 69 6e 74 66 28 26 78 2c 20 22 25 2e 31 36  Printf(&x, "%.16
9e10: 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a  g", pMem->u.r);.
9e20: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9e30: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
9e40: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  M_Null ){.      
9e50: 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c 22 3b 0a    zP4 = "NULL";.
9e60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9e70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
9e80: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  m->flags & MEM_B
9e90: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  lob );.        z
9ea0: 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20  P4 = "(blob)";. 
9eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
9ec0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
9ed0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
9ee0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
9ef0: 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20  ase P4_VTAB: {. 
9f00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
9f10: 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  b *pVtab = pOp->
9f20: 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
9f30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
9f40: 72 69 6e 74 66 28 26 78 2c 20 22 76 74 61 62 3a  rintf(&x, "vtab:
9f50: 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20  %p", pVtab);.   
9f60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9f70: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
9f80: 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20  P4_INTARRAY: {. 
9f90: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
9fa0: 20 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f 70 2d    int *ai = pOp-
9fb0: 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 69 6e  >p4.ai;.      in
9fc0: 74 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20 20 2f  t n = ai[0];   /
9fd0: 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d  * The first elem
9fe0: 65 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41 52 52  ent of an INTARR
9ff0: 41 59 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  AY is always the
a000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a010: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74          ** count
a020: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
a030: 66 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 66 6f  f elements to fo
a040: 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 66 6f  llow */.      fo
a050: 72 28 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=1; i<n; i++)
a060: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a070: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 2c 25  3XPrintf(&x, ",%
a080: 64 22 2c 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20  d", ai[i]);.    
a090: 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b    }.      zTemp[
a0a0: 30 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20  0] = '[';.      
a0b0: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
a0c0: 70 70 65 6e 64 28 26 78 2c 20 22 5d 22 2c 20 31  ppend(&x, "]", 1
a0d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a0e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
a0f0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a  4_SUBPROGRAM: {.
a100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
a110: 69 6e 74 66 28 26 78 2c 20 22 70 72 6f 67 72 61  intf(&x, "progra
a120: 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  m");.      break
a130: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
a140: 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20   P4_ADVANCE: {. 
a150: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
a160: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
a170: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
a180: 34 5f 54 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  4_TABLE: {.     
a190: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
a1a0: 26 78 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70  &x, "%s", pOp->p
a1b0: 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  4.pTab->zName);.
a1c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a1d0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
a1e0: 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f  {.      zP4 = pO
a1f0: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69  p->p4.z;.      i
a200: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
a210: 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70       zP4 = zTemp
a220: 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  ;.        zTemp[
a230: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  0] = 0;.      }.
a240: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
a250: 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
a260: 68 28 26 78 29 3b 0a 20 20 61 73 73 65 72 74 28  h(&x);.  assert(
a270: 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74   zP4!=0 );.  ret
a280: 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69  urn zP4;.}.#endi
a290: 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41  f /* VDBE_DISPLA
a2a0: 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  Y_P4 */../*.** D
a2b0: 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64  eclare to the Vd
a2c0: 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65  be that the BTre
a2d0: 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e  e object at db->
a2e0: 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a  aDb[i] is used..
a2f0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72  **.** The prepar
a300: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65  ed statements ne
a310: 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64  ed to know in ad
a320: 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65  vance the comple
a330: 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74  te set of.** att
a340: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
a350: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
a360: 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65  .  A mask of the
a370: 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  se databases.** 
a380: 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e  is maintained in
a390: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20   p->btreeMask.  
a3a0: 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20  The p->lockMask 
a3b0: 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 62  value is the sub
a3c0: 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72  set of.** p->btr
a3d0: 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61  eeMask of databa
a3e0: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ses that will re
a3f0: 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f  quire a lock..*/
a400: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
a410: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
a420: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73  *p, int i){.  as
a430: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
a440: 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c  p->db->nDb && i<
a450: 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d  (int)sizeof(yDbM
a460: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65  ask)*8 );.  asse
a470: 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f  rt( i<(int)sizeo
a480: 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a  f(p->btreeMask)*
a490: 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74  8 );.  DbMaskSet
a4a0: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69  (p->btreeMask, i
a4b0: 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26  );.  if( i!=1 &&
a4c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61   sqlite3BtreeSha
a4d0: 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62  rable(p->db->aDb
a4e0: 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20  [i].pBt) ){.    
a4f0: 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63  DbMaskSet(p->loc
a500: 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d  kMask, i);.  }.}
a510: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
a520: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
a530: 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20 49  D_CACHE)./*.** I
a540: 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  f SQLite is comp
a550: 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  iled to support 
a560: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
a570: 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65  e and to be thre
a580: 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20  adsafe,.** this 
a590: 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20  routine obtains 
a5a0: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
a5b0: 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42  ated with each B
a5c0: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
a5d0: 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65  e.** that may be
a5e0: 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65   accessed by the
a5f0: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
a600: 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f   argument. In do
a610: 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a  ing so it also.*
a620: 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61  * sets the BtSha
a630: 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66  red.db member of
a640: 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53   each of the BtS
a650: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73  hared structures
a660: 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68  , ensuring.** th
a670: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
a680: 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
a690: 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  back is invoked 
a6a0: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a  if required..**.
a6b0: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
a6c0: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62  not threadsafe b
a6d0: 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20  ut does support 
a6e0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
a6f0: 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74  e, then.** sqlit
a700: 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 69  e3BtreeEnter() i
a710: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  s invoked to set
a720: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
a730: 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66   variables.** of
a740: 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64   all of BtShared
a750: 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65   structures acce
a760: 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64  ssible via the d
a770: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a  atabase handle .
a780: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ** associated wi
a790: 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a  th the VM..**.**
a7a0: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
a7b0: 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64  t threadsafe and
a7c0: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
a7d0: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
a7e0: 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  ode, this.** fun
a7f0: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
a800: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62  ..**.** The p->b
a810: 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69  treeMask field i
a820: 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61  s a bitmask of a
a830: 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20 74  ll btrees that t
a840: 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20  he prepared .** 
a850: 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c  statement p will
a860: 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20   ever use.  Let 
a870: 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  N be the number 
a880: 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74  of bits in p->bt
a890: 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65  reeMask.** corre
a8a0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65  sponding to btre
a8b0: 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72  es that use shar
a8c0: 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20  ed cache.  Then 
a8d0: 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a  the runtime of.*
a8e0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
a8f0: 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e  s N*N.  But as N
a900: 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20   is rarely more 
a910: 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f  than 1, this sho
a920: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20  uld not.** be a 
a930: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64  problem..*/.void
a940: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
a950: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  r(Vdbe *p){.  in
a960: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
a970: 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20  db;.  Db *aDb;. 
a980: 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20   int nDb;.  if( 
a990: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
a9a0: 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74  >lockMask) ) ret
a9b0: 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  urn;  /* The com
a9c0: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62  mon case */.  db
a9d0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20   = p->db;.  aDb 
a9e0: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62  = db->aDb;.  nDb
a9f0: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f   = db->nDb;.  fo
aa00: 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b  r(i=0; i<nDb; i+
aa10: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31  +){.    if( i!=1
aa20: 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70   && DbMaskTest(p
aa30: 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26  ->lockMask,i) &&
aa40: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70   ALWAYS(aDb[i].p
aa50: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  Bt!=0) ){.      
aa60: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
aa70: 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  r(aDb[i].pBt);. 
aa80: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
aa90: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
aaa0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
aab0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c  ED_CACHE) && SQL
aac0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
aad0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c  ./*.** Unlock al
aae0: 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73 20  l of the btrees 
aaf0: 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65  previously locke
ab00: 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73  d by a call to s
ab10: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
ab20: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  )..*/.static SQL
ab30: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
ab40: 64 20 76 64 62 65 4c 65 61 76 65 28 56 64 62 65  d vdbeLeave(Vdbe
ab50: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
ab60: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
ab70: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
ab80: 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  Db;.  db = p->db
ab90: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
aba0: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
abb0: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  Db;.  for(i=0; i
abc0: 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nDb; i++){.    
abd0: 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61  if( i!=1 && DbMa
abe0: 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61  skTest(p->lockMa
abf0: 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28  sk,i) && ALWAYS(
ac00: 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29  aDb[i].pBt!=0) )
ac10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
ac20: 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d  treeLeave(aDb[i]
ac30: 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pBt);.    }.  }
ac40: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
ac50: 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70  dbeLeave(Vdbe *p
ac60: 29 7b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41  ){.  if( DbMaskA
ac70: 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61  llZero(p->lockMa
ac80: 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  sk) ) return;  /
ac90: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
aca0: 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76 65  e */.  vdbeLeave
acb0: 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  (p);.}.#endif..#
acc0: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
acd0: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
ace0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
acf0: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
ad00: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
ad10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
ad20: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
ad30: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
ad40: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
ad50: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
ad60: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
ad70: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20  {.  char *zP4;. 
ad80: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
ad90: 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d    char zCom[100]
ada0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
adb0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20   char *zFormat1 
adc0: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64  = "%4d %-13s %4d
add0: 20 25 34 64 20 25 34 64 20 25 2d 31 33 73 20 25   %4d %4d %-13s %
ade0: 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28  .2X %s\n";.  if(
adf0: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
ae00: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20  = stdout;.  zP4 
ae10: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
ae20: 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50   zPtr, sizeof(zP
ae30: 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  tr));.#ifdef SQL
ae40: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
ae50: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69  IN_COMMENTS.  di
ae60: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
ae70: 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a  , zP4, zCom, siz
ae80: 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73  eof(zCom));.#els
ae90: 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b  e.  zCom[0] = 0;
aea0: 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a  .#endif.  /* NB:
aeb0: 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63    The sqlite3Opc
aec0: 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69  odeName() functi
aed0: 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
aee0: 64 20 62 79 20 63 6f 64 65 20 63 72 65 61 74 65  d by code create
aef0: 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b  d.  ** by the mk
af00: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20  opcodeh.awk and 
af10: 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63  mkopcodec.awk sc
af20: 72 69 70 74 73 20 77 68 69 63 68 20 65 78 74 72  ripts which extr
af30: 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66  act the.  ** inf
af40: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
af50: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
af60: 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74  text */.  fprint
af70: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
af80: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
af90: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
afa0: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
afb0: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
afc0: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
afd0: 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d  ->p5,.      zCom
afe0: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
aff0: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
b000: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
b010: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d   an array of N M
b020: 65 6d 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  em element..*/.s
b030: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 4d  tatic void initM
b040: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
b050: 69 6e 74 20 4e 2c 20 73 71 6c 69 74 65 33 20 2a  int N, sqlite3 *
b060: 64 62 2c 20 75 31 36 20 66 6c 61 67 73 29 7b 0a  db, u16 flags){.
b070: 20 20 77 68 69 6c 65 28 20 28 4e 2d 2d 29 3e 30    while( (N--)>0
b080: 20 29 7b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20   ){.    p->db = 
b090: 64 62 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  db;.    p->flags
b0a0: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 70 2d   = flags;.    p-
b0b0: 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23  >szMalloc = 0;.#
b0c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
b0d0: 55 47 0a 20 20 20 20 70 2d 3e 70 53 63 6f 70 79  UG.    p->pScopy
b0e0: 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  From = 0;.#endif
b0f0: 0a 20 20 20 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a  .    p++;.  }.}.
b100: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
b110: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
b120: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61   elements.*/.sta
b130: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
b140: 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c  MemArray(Mem *p,
b150: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
b160: 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d   && N ){.    Mem
b170: 20 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a   *pEnd = &p[N];.
b180: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
b190: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28  = p->db;.    if(
b1a0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
b1b0: 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  d ){.      do{. 
b1c0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a         if( p->sz
b1d0: 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
b1e0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
b1f0: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77  alloc);.      }w
b200: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
b210: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
b220: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
b230: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
b240: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
b250: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
b260: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b270: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
b280: 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70  kMemInvariants(p
b290: 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ) );..      /* T
b2a0: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61  his block is rea
b2b0: 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76  lly an inlined v
b2c0: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
b2d0: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
b2e0: 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  ).      ** that 
b2f0: 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20  takes advantage 
b300: 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74  of the fact that
b310: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
b320: 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20   value is .     
b330: 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f   ** being set to
b340: 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65   NULL after rele
b350: 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69  asing any dynami
b360: 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20  c resources..   
b370: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
b380: 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e  he justification
b390: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67   for duplicating
b3a0: 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63   code is that ac
b3b0: 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20  cording to .    
b3c0: 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20    ** callgrind, 
b3d0: 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65  this causes a ce
b3e0: 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20  rtain test case 
b3f0: 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34  to hit the CPU 4
b400: 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72  .7 .      ** per
b410: 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c  cent less (x86 l
b420: 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f  inux, gcc versio
b430: 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68  n 4.1.2, -O6) th
b440: 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20  an if .      ** 
b450: 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73  sqlite3MemReleas
b460: 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20  e() were called 
b470: 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20  from here. With 
b480: 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a  -O2, this jumps.
b490: 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20        ** to 6.6 
b4a0: 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73  percent. The tes
b4b0: 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74  t case is insert
b4c0: 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e  ing 1000 rows in
b4d0: 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20  to a table .    
b4e0: 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64    ** with no ind
b4f0: 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e  exes using a sin
b500: 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53  gle prepared INS
b510: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ERT statement, b
b520: 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ind() .      ** 
b530: 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73  and reset(). Ins
b540: 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64  erts are grouped
b550: 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74   into a transact
b560: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
b570: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
b580: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67  >flags & MEM_Agg
b590: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
b5a0: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
b5b0: 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20  EM_Dyn );.      
b5c0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
b5d0: 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29  gs & MEM_Frame )
b5e0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
b5f0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
b600: 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20  _RowSet );.     
b610: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d   if( p->flags&(M
b620: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d  EM_Agg|MEM_Dyn|M
b630: 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77  EM_Frame|MEM_Row
b640: 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Set) ){.        
b650: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
b660: 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20  lease(p);.      
b670: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d  }else if( p->szM
b680: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
b690: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
b6a0: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
b6b0: 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c          p->szMal
b6c0: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  loc = 0;.      }
b6d0: 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73  ..      p->flags
b6e0: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
b6f0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b  ;.    }while( (+
b700: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  +p)<pEnd );.  }.
b710: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
b720: 61 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  a VdbeFrame obje
b730: 63 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65  ct and its conte
b740: 6e 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f  nts. VdbeFrame o
b750: 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c  bjects are.** al
b760: 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f  located by the O
b770: 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65  P_Program opcode
b780: 20 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45   in sqlite3VdbeE
b790: 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  xec()..*/.void s
b7a0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44  qlite3VdbeFrameD
b7b0: 65 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20  elete(VdbeFrame 
b7c0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
b7d0: 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65  Mem *aMem = Vdbe
b7e0: 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56  FrameMem(p);.  V
b7f0: 64 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73  dbeCursor **apCs
b800: 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20  r = (VdbeCursor 
b810: 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69  **)&aMem[p->nChi
b820: 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d  ldMem];.  for(i=
b830: 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73  0; i<p->nChildCs
b840: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  r; i++){.    sql
b850: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
b860: 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69  or(p->v, apCsr[i
b870: 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ]);.  }.  releas
b880: 65 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20  eMemArray(aMem, 
b890: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20  p->nChildMem);. 
b8a0: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
b8b0: 74 65 41 75 78 44 61 74 61 28 70 2d 3e 76 2d 3e  teAuxData(p->v->
b8c0: 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61  db, &p->pAuxData
b8d0: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69  , -1, 0);.  sqli
b8e0: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e  te3DbFree(p->v->
b8f0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64  db, p);.}..#ifnd
b900: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
b910: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76  XPLAIN./*.** Giv
b920: 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  e a listing of t
b930: 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68  he program in th
b940: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
b950: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  e..**.** The int
b960: 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61  erface is the sa
b970: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62  me as sqlite3Vdb
b980: 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e  eExec().  But in
b990: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e  stead of.** runn
b9a0: 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74  ing the code, it
b9b0: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c   invokes the cal
b9c0: 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65  lback once for e
b9d0: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ach instruction.
b9e0: 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65  .** This feature
b9f0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
ba00: 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e  ement "EXPLAIN".
ba10: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
ba20: 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20  xplain==1, each 
ba30: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c  instruction is l
ba40: 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20  isted.  When.** 
ba50: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f  p->explain==2, o
ba60: 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  nly OP_Explain i
ba70: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
ba80: 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65  listed and these
ba90: 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e  .** are shown in
baa0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72   a different for
bab0: 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e  mat.  p->explain
bac0: 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69  ==2 is used to i
bad0: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c  mplement.** EXPL
bae0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a  AIN QUERY PLAN..
baf0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
bb00: 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20  plain==1, first 
bb10: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
bb20: 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e   is listed, then
bb30: 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20   each of.** the 
bb40: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
bb50: 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f  ams are listed o
bb60: 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e  ne by one..*/.in
bb70: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
bb80: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bba0: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
bbb0: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20  .  int nRow;    
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20          /* Stop 
bbe0: 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72  when row count r
bbf0: 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20  eaches this */. 
bc00: 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20   int nSub = 0;  
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bc30: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65  of sub-vdbes see
bc40: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75  n so far */.  Su
bc50: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
bc60: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
bc70: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
bc80: 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65  ub-vdbes */.  Me
bc90: 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  m *pSub = 0;    
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
bcc0: 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20  l hold array of 
bcd0: 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71  subprogs */.  sq
bce0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
bcf0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
bd00: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
bd10: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
bd20: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd40: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
bd50: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
bd60: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
bd90: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
bda0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20  = &p->aMem[1];  
bdb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
bdc0: 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c  rst Mem of resul
bdd0: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  t set */..  asse
bde0: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29  rt( p->explain )
bdf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
be00: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
be10: 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  _RUN );.  assert
be20: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
be30: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
be40: 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72  ITE_BUSY || p->r
be50: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
be60: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
be70: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
be80: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79   does not use dy
be90: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f  namic strings fo
bea0: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c  r.  ** the resul
beb0: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  t, result column
bec0: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e  s may become dyn
bed0: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72  amic if the user
bee0: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69   calls.  ** sqli
bef0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
bf00: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74  6(), causing a t
bf10: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54  ranslation to UT
bf20: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20  F-16 encoding.. 
bf30: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   */.  releaseMem
bf40: 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a  Array(pMem, 8);.
bf50: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
bf60: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  = 0;..  if( p->r
bf70: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  c==SQLITE_NOMEM_
bf80: 42 4b 50 54 20 29 7b 0a 20 20 20 20 2f 2a 20 54  BKPT ){.    /* T
bf90: 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61  his happens if a
bfa0: 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65   malloc() inside
bfb0: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
bfc0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29  e3_column_text()
bfd0: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
bfe0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
bff0: 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20  () failed.  */. 
c000: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
c010: 6c 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75  lt(db);.    retu
c020: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
c030: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
c040: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
c050: 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65  tput rows reache
c060: 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61  s nRow, that mea
c070: 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ns the.  ** list
c080: 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64  ing has finished
c090: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65   and sqlite3_ste
c0a0: 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72  p() should retur
c0b0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
c0c0: 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20   ** nRow is the 
c0d0: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
c0e0: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
c0f0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70   main program, p
c100: 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d  lus.  ** the sum
c110: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
c120: 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72  f rows in all tr
c130: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
c140: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
c150: 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20  ** so far.  The 
c160: 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20  nRow value will 
c170: 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20  increase as new 
c180: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
c190: 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63  ams are.  ** enc
c1a0: 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d  ountered, but p-
c1b0: 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61  >pc will eventua
c1c0: 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20  lly catch up to 
c1d0: 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f  nRow..  */.  nRo
c1e0: 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  w = p->nOp;.  if
c1f0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
c200: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
c210: 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c  rst 8 memory cel
c220: 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  ls are used for 
c230: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
c240: 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20   So we will.    
c250: 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68  ** commandeer th
c260: 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73  e 9th cell to us
c270: 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72  e as storage for
c280: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
c290: 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20  nters.    ** to 
c2a0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
c2b0: 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69  ams.  The VDBE i
c2c0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
c2d0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a  have at least 9.
c2e0: 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a      ** cells.  *
c2f0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
c300: 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70  >nMem>9 );.    p
c310: 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39  Sub = &p->aMem[9
c320: 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ];.    if( pSub-
c330: 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20  >flags&MEM_Blob 
c340: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74  ){.      /* On t
c350: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
c360: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c   sqlite3_step(),
c370: 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20   pSub will hold 
c380: 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20  a NULL.  It is. 
c390: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
c3a0: 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79  zed to a BLOB by
c3b0: 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52   the P4_SUBPROGR
c3c0: 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  AM processing lo
c3d0: 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  gic below */.   
c3e0: 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e     nSub = pSub->
c3f0: 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b  n/sizeof(Vdbe*);
c400: 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28  .      apSub = (
c410: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
c420: 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  ub->z;.    }.   
c430: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
c440: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52  ; i++){.      nR
c450: 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e  ow += apSub[i]->
c460: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nOp;.    }.  }..
c470: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
c480: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
c490: 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78   i<nRow && p->ex
c4a0: 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61  plain==2 && p->a
c4b0: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50  Op[i].opcode!=OP
c4c0: 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  _Explain );.  if
c4d0: 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20  ( i>=nRow ){.   
c4e0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
c4f0: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
c500: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
c510: 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49  e if( db->u1.isI
c520: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
c530: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
c540: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
c550: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
c560: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  R;.    sqlite3Vd
c570: 62 65 45 72 72 6f 72 28 70 2c 20 73 71 6c 69 74  beError(p, sqlit
c580: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29  e3ErrStr(p->rc))
c590: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
c5a0: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70  har *zP4;.    Op
c5b0: 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69   *pOp;.    if( i
c5c0: 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20  <p->nOp ){.     
c5d0: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c   /* The output l
c5e0: 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d  ine number is sm
c5f0: 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20  all enough that 
c600: 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  we are still in 
c610: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69  the.      ** mai
c620: 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20  n program. */.  
c630: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
c640: 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  p[i];.    }else{
c650: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65  .      /* We are
c660: 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69   currently listi
c670: 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  ng subprograms. 
c680: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
c690: 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20  h one and.      
c6a0: 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61  ** pick up the a
c6b0: 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64  ppropriate opcod
c6c0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
c6d0: 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d  j;.      i -= p-
c6e0: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  >nOp;.      for(
c6f0: 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d  j=0; i>=apSub[j]
c700: 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nOp; j++){.   
c710: 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b       i -= apSub[
c720: 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d  j]->nOp;.      }
c730: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70  .      pOp = &ap
c740: 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a  Sub[j]->aOp[i];.
c750: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
c760: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
c770: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
c780: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
c790: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b    pMem->u.i = i;
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74  /* Program count
c7d0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
c7e0: 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65  ++;.  .      pMe
c7f0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
c800: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45  tatic|MEM_Str|ME
c810: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
c820: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73  em->z = (char*)s
c830: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
c840: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f  (pOp->opcode); /
c850: 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  * Opcode */.    
c860: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
c870: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
c880: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
c890: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
c8a0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
c8b0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
c8c0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  .      pMem++;..
c8d0: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e        /* When an
c8e0: 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f   OP_Program opco
c8f0: 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20  de is encounter 
c900: 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65  (the only opcode
c910: 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20   that has.      
c920: 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52  ** a P4_SUBPROGR
c930: 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78  AM argument), ex
c940: 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66  pand the size of
c950: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75   the array of su
c960: 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20  bprograms.      
c970: 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d  ** kept in p->aM
c980: 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20  em[9].z to hold 
c990: 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20  the new program 
c9a0: 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20  - assuming this 
c9b0: 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20  subprogram.     
c9c0: 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   ** has not alre
c9d0: 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20  ady been seen.. 
c9e0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
c9f0: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
ca00: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
ca10: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74          int nByt
ca20: 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a  e = (nSub+1)*siz
ca30: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
ca40: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  ;.        int j;
ca50: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
ca60: 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  ; j<nSub; j++){.
ca70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70            if( ap
ca80: 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e  Sub[j]==pOp->p4.
ca90: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
caa0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cab0: 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20      if( j==nSub 
cac0: 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71  && SQLITE_OK==sq
cad0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
cae0: 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53  (pSub, nByte, nS
caf0: 75 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ub!=0) ){.      
cb00: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
cb10: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
cb20: 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  >z;.          ap
cb30: 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f  Sub[nSub++] = pO
cb40: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  p->p4.pProgram;.
cb50: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
cb60: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f  flags |= MEM_Blo
cb70: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  b;.          pSu
cb80: 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65  b->n = nSub*size
cb90: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
cba0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cbb0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d   }.    }..    pM
cbc0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
cbd0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
cbe0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20  .i = pOp->p1;   
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a         /* P1 */.
cc10: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
cc20: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
cc30: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
cc40: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  ->u.i = pOp->p2;
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
cc70: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
cc80: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
cc90: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
cca0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
ccb0: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ccd0: 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P3 */.    pMem++
cce0: 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ;..    if( sqlit
ccf0: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
cd00: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30  dResize(pMem, 10
cd10: 30 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20  0) ){ /* P4 */. 
cd20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
cd30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
cd40: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
cd50: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
cd60: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66     }.    pMem->f
cd70: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
cd80: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34  EM_Term;.    zP4
cd90: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
cda0: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d  , pMem->z, pMem-
cdb0: 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  >szMalloc);.    
cdc0: 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a  if( zP4!=pMem->z
cdd0: 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   ){.      pMem->
cde0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  n = 0;.      sql
cdf0: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
ce00: 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c  r(pMem, zP4, -1,
ce10: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
ce20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ce30: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
ce40: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  >z!=0 );.      p
ce50: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
ce60: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
ce70: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
ce80: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
ce90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
cea0: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++;..    if( p->
ceb0: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
cec0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
ced0: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
cee0: 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b  size(pMem, 4) ){
cef0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
cf00: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
cf10: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
cf20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
cf30: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
cf40: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
cf50: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
cf60: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
cf70: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
cf80: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
cf90: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c  pMem->z, "%.2x",
cfa0: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20   pOp->p5);   /* 
cfb0: 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P5 */.      pMem
cfc0: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
cfd0: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
cfe0: 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c  +;.  .#ifdef SQL
cff0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
d000: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
d010: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
d020: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
d030: 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b  ze(pMem, 500) ){
d040: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d050: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
d060: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
d070: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
d080: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
d090: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
d0a0: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
d0b0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
d0c0: 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e   = displayCommen
d0d0: 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d  t(pOp, zP4, pMem
d0e0: 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20 20  ->z, 500);.     
d0f0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
d100: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a  ITE_UTF8;.#else.
d110: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
d120: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20  s = MEM_Null;   
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d140: 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a      /* Comment *
d150: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  /.#endif.    }..
d160: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
d170: 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78  n = 8 - 4*(p->ex
d180: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d  plain-1);.    p-
d190: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70  >pResultSet = &p
d1a0: 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70  ->aMem[1];.    p
d1b0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
d1c0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
d1d0: 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74  E_ROW;.  }.  ret
d1e0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
d1f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
d200: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64  EXPLAIN */..#ifd
d210: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
d220: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
d230: 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65  SQL that was use
d240: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  d to generate a 
d250: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  VDBE program..*/
d260: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
d270: 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a  ePrintSql(Vdbe *
d280: 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p){.  const char
d290: 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70   *z = 0;.  if( p
d2a0: 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20  ->zSql ){.    z 
d2b0: 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c  = p->zSql;.  }el
d2c0: 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31  se if( p->nOp>=1
d2d0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64   ){.    const Vd
d2e0: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e  beOp *pOp = &p->
d2f0: 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  aOp[0];.    if( 
d300: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
d310: 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e  Init && pOp->p4.
d320: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20  z!=0 ){.      z 
d330: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
d340: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
d350: 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a  3Isspace(*z) ) z
d360: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
d370: 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22  if( z ) printf("
d380: 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29  SQL: [%s]\n", z)
d390: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
d3a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d3b0: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
d3c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
d3d0: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a  ABLE_IOTRACE)./*
d3e0: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54  .** Print an IOT
d3f0: 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f  RACE message sho
d400: 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74  wing SQL content
d410: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d420: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28  3VdbeIOTraceSql(
d430: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
d440: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
d450: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
d460: 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63  f( sqlite3IoTrac
d470: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
d480: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
d490: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
d4a0: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
d4b0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
d4c0: 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  nit && pOp->p4.z
d4d0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
d4e0: 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b  , j;.    char z[
d4f0: 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  1000];.    sqlit
d500: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
d510: 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20  of(z), z, "%s", 
d520: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20  pOp->p4.z);.    
d530: 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33  for(i=0; sqlite3
d540: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69  Isspace(z[i]); i
d550: 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d  ++){}.    for(j=
d560: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
d570: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
d580: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b  Isspace(z[i]) ){
d590: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
d5a0: 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]!=' ' ){.    
d5b0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
d5c0: 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
d5d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d5e0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
d5f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d600: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
d610: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
d620: 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b  ("SQL %s\n", z);
d630: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
d640: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52   !SQLITE_OMIT_TR
d650: 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  ACE && SQLITE_EN
d660: 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a  ABLE_IOTRACE */.
d670: 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  ./* An instance 
d680: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 64  of this object d
d690: 65 73 63 72 69 62 65 73 20 62 75 6c 6b 20 6d 65  escribes bulk me
d6a0: 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66  mory available f
d6b0: 6f 72 20 75 73 65 0a 2a 2a 20 62 79 20 73 75 62  or use.** by sub
d6c0: 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61 20  components of a 
d6d0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
d6e0: 6e 74 2e 20 20 53 70 61 63 65 20 69 73 20 61 6c  nt.  Space is al
d6f0: 6c 6f 63 61 74 65 64 20 6f 75 74 0a 2a 2a 20 6f  located out.** o
d700: 66 20 61 20 52 65 75 73 61 62 6c 65 53 70 61 63  f a ReusableSpac
d710: 65 20 6f 62 6a 65 63 74 20 62 79 20 74 68 65 20  e object by the 
d720: 61 6c 6c 6f 63 53 70 61 63 65 28 29 20 72 6f 75  allocSpace() rou
d730: 74 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 73  tine below..*/.s
d740: 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70  truct ReusableSp
d750: 61 63 65 20 7b 0a 20 20 75 38 20 2a 70 53 70 61  ace {.  u8 *pSpa
d760: 63 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ce;          /* 
d770: 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79  Available memory
d780: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
d790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
d7a0: 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
d7b0: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
d7c0: 20 6e 4e 65 65 64 65 64 3b 20 20 20 20 20 20 20   nNeeded;       
d7d0: 20 20 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65 73    /* Total bytes
d7e0: 20 74 68 61 74 20 63 6f 75 6c 64 20 6e 6f 74 20   that could not 
d7f0: 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  be allocated */.
d800: 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74 6f 20 61 6c  };../* Try to al
d810: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
d820: 65 73 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69  es of 8-byte ali
d830: 67 6e 65 64 20 62 75 6c 6b 20 6d 65 6d 6f 72 79  gned bulk memory
d840: 20 66 6f 72 20 70 42 75 66 0a 2a 2a 20 66 72 6f   for pBuf.** fro
d850: 6d 20 74 68 65 20 52 65 75 73 61 62 6c 65 53 70  m the ReusableSp
d860: 61 63 65 20 6f 62 6a 65 63 74 2e 20 20 52 65 74  ace object.  Ret
d870: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
d880: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a   the allocated.*
d890: 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20 73 75 63 63  * memory on succ
d8a0: 65 73 73 2e 20 20 49 66 20 69 6e 73 75 66 66 69  ess.  If insuffi
d8b0: 63 69 65 6e 74 20 6d 65 6d 6f 72 79 20 69 73 20  cient memory is 
d8c0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65  available in the
d8d0: 0a 2a 2a 20 52 65 75 73 61 62 6c 65 53 70 61 63  .** ReusableSpac
d8e0: 65 20 6f 62 6a 65 63 74 2c 20 69 6e 63 72 65 61  e object, increa
d8f0: 73 65 20 74 68 65 20 52 65 75 73 61 62 6c 65 53  se the ReusableS
d900: 70 61 63 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a 20  pace.nNeeded.** 
d910: 76 61 6c 75 65 20 62 79 20 74 68 65 20 61 6d 6f  value by the amo
d920: 75 6e 74 20 6e 65 65 64 65 64 20 61 6e 64 20 72  unt needed and r
d930: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
d940: 2a 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74  * If pBuf is not
d950: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
d960: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
d970: 20 74 68 65 20 6d 65 6d 6f 72 79 20 68 61 73 20   the memory has 
d980: 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
d990: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 20 70  allocated by a p
d9a0: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68 69  rior call to thi
d9b0: 73 20 72 6f 75 74 69 6e 65 2c 20 73 6f 20 6a 75  s routine, so ju
d9c0: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 70 79  st return a copy
d9d0: 0a 2a 2a 20 6f 66 20 70 42 75 66 20 61 6e 64 20  .** of pBuf and 
d9e0: 6c 65 61 76 65 20 52 65 75 73 61 62 6c 65 53 70  leave ReusableSp
d9f0: 61 63 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ace unchanged..*
da00: 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 63 61  *.** This alloca
da10: 74 6f 72 20 69 73 20 65 6d 70 6c 6f 79 65 64 20  tor is employed 
da20: 74 6f 20 72 65 70 75 72 70 6f 73 65 20 75 6e 75  to repurpose unu
da30: 73 65 64 20 73 6c 6f 74 73 20 61 74 20 74 68 65  sed slots at the
da40: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6f   end of the.** o
da50: 70 63 6f 64 65 20 61 72 72 61 79 20 6f 66 20 70  pcode array of p
da60: 72 65 70 61 72 65 64 20 73 74 61 74 65 20 66 6f  repared state fo
da70: 72 20 6f 74 68 65 72 20 6d 65 6d 6f 72 79 20 6e  r other memory n
da80: 65 65 64 73 20 6f 66 20 74 68 65 20 70 72 65 70  eeds of the prep
da90: 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ared.** statemen
daa0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
dab0: 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20  d *allocSpace(. 
dac0: 20 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65   struct Reusable
dad0: 53 70 61 63 65 20 2a 70 2c 20 20 2f 2a 20 42 75  Space *p,  /* Bu
dae0: 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61  lk memory availa
daf0: 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  ble for allocati
db00: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
db10: 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
db20: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
db30: 61 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69  a prior allocati
db40: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  on */.  int nByt
db50: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
db60: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65    /* Bytes of me
db70: 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a 29  mory needed */.)
db80: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
db90: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
dba0: 28 70 2d 3e 70 53 70 61 63 65 29 20 29 3b 0a 20  (p->pSpace) );. 
dbb0: 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a   if( pBuf==0 ){.
dbc0: 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e      nByte = ROUN
dbd0: 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  D8(nByte);.    i
dbe0: 66 28 20 6e 42 79 74 65 20 3c 3d 20 70 2d 3e 6e  f( nByte <= p->n
dbf0: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 2d  Free ){.      p-
dc00: 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b  >nFree -= nByte;
dc10: 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 70  .      pBuf = &p
dc20: 2d 3e 70 53 70 61 63 65 5b 70 2d 3e 6e 46 72 65  ->pSpace[p->nFre
dc30: 65 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e];.    }else{. 
dc40: 20 20 20 20 20 70 2d 3e 6e 4e 65 65 64 65 64 20       p->nNeeded 
dc50: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a  += nByte;.    }.
dc60: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49    }.  assert( EI
dc70: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
dc80: 4e 54 28 70 42 75 66 29 20 29 3b 0a 20 20 72 65  NT(pBuf) );.  re
dc90: 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a  turn pBuf;.}../*
dca0: 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56  .** Rewind the V
dcb0: 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20  DBE back to the 
dcc0: 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65  beginning in pre
dcd0: 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  paration for.** 
dce0: 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76  running it..*/.v
dcf0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
dd00: 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a  ewind(Vdbe *p){.
dd10: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
dd20: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
dd30: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
dd40: 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64  E).  int i;.#end
dd50: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  if.  assert( p!=
dd60: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
dd70: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
dd80: 47 49 43 5f 49 4e 49 54 20 7c 7c 20 70 2d 3e 6d  GIC_INIT || p->m
dd90: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
dda0: 5f 52 45 53 45 54 20 29 3b 0a 0a 20 20 2f 2a 20  _RESET );..  /* 
ddb0: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
ddc0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
ddd0: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
dde0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
ddf0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
de00: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
de10: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
de20: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
de30: 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  */.  p->magic = 
de40: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
de50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
de60: 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20  EBUG.  for(i=0; 
de70: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b  i<p->nMem; i++){
de80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
de90: 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64  aMem[i].db==p->d
dea0: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
deb0: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20    p->pc = -1;.  
dec0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
ded0: 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  K;.  p->errorAct
dee0: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
def0: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
df00: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
df10: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
df20: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
df30: 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d  55;.  p->iStatem
df40: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ent = 0;.  p->nF
df50: 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b  kConstraint = 0;
df60: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
df70: 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20  FILE.  for(i=0; 
df80: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
df90: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
dfa0: 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f  t = 0;.    p->aO
dfb0: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
dfc0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
dfd0: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
dfe0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
dff0: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72  or execution for
e000: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
e010: 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e  after.** creatin
e020: 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  g the virtual ma
e030: 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76  chine.  This inv
e040: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
e050: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
e060: 6e 67 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ng registers and
e070: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
e080: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
e090: 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  r..** After the 
e0a0: 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70  VDBE has be prep
e0b0: 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65  ped, it can be e
e0c0: 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f  xecuted by one o
e0d0: 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20  r more.** calls 
e0e0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  to sqlite3VdbeEx
e0f0: 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ec().  .**.** Th
e100: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
e110: 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c  be called exactl
e120: 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76  y once on each v
e130: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
e140: 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
e150: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
e160: 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
e170: 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69  "packaged" and i
e180: 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75  s ready.** to ru
e190: 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72  n.  After this r
e1a0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
e1b0: 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20  , further calls 
e1c0: 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  to .** sqlite3Vd
e1d0: 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69  beAddOp() functi
e1e0: 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74  ons are prohibit
e1f0: 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
e200: 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a  e disconnects.**
e210: 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74   the Vdbe from t
e220: 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
e230: 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65  that helped gene
e240: 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20  rate it so that 
e250: 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  the.** the Vdbe 
e260: 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70  becomes an indep
e270: 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e  endent entity an
e280: 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  d the Parse obje
e290: 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73  ct can be.** des
e2a0: 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73  troyed..**.** Us
e2b0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  e the sqlite3Vdb
e2c0: 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64  eRewind() proced
e2d0: 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ure to restore a
e2e0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
e2f0: 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20   back.** to its 
e300: 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66  initial state af
e310: 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ter it has been 
e320: 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  run..*/.void sql
e330: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
e340: 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  y(.  Vdbe *p,   
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
e370: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
e380: 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
e390: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
e3a0: 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73  ontext */.){.  s
e3b0: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e3d0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
e3e0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
e3f0: 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20  t nVar;         
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e410: 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65  Number of parame
e420: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ters */.  int nM
e430: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
e440: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e450: 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20  er of VM memory 
e460: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69  registers */.  i
e470: 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20  nt nCursor;     
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e490: 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   Number of curso
e4a0: 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  rs required */. 
e4b0: 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20   int nArg;      
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
e4e0: 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f  uments in subpro
e4f0: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
e500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
e520: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73  p counter */.  s
e530: 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70  truct ReusableSp
e540: 61 63 65 20 78 3b 20 20 20 20 20 20 20 20 2f 2a  ace x;        /*
e550: 20 52 65 75 73 61 62 6c 65 20 62 75 6c 6b 20 6d   Reusable bulk m
e560: 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73 65  emory */..  asse
e570: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
e580: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
e590: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
e5a0: 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  se!=0 );.  asser
e5b0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
e5c0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
e5d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
e5e0: 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20  ==p->pParse );. 
e5f0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
e600: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
e610: 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20  cFailed==0 );.  
e620: 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nVar = pParse->n
e630: 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50  Var;.  nMem = pP
e640: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43  arse->nMem;.  nC
e650: 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
e660: 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70  nTab;.  nArg = p
e670: 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a  Parse->nMaxArg;.
e680: 20 20 0a 20 20 2f 2a 20 45 61 63 68 20 63 75 72    .  /* Each cur
e690: 73 6f 72 20 75 73 65 73 20 61 20 6d 65 6d 6f 72  sor uses a memor
e6a0: 79 20 63 65 6c 6c 2e 20 20 54 68 65 20 66 69 72  y cell.  The fir
e6b0: 73 74 20 63 75 72 73 6f 72 20 28 63 75 72 73 6f  st cursor (curso
e6c0: 72 20 30 29 20 63 61 6e 0a 20 20 2a 2a 20 75 73  r 0) can.  ** us
e6d0: 65 20 61 4d 65 6d 5b 30 5d 20 77 68 69 63 68 20  e aMem[0] which 
e6e0: 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65  is not otherwise
e6f0: 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42   used by the VDB
e700: 45 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c 6f  E program.  Allo
e710: 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20  cate.  ** space 
e720: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 4d  at the end of aM
e730: 65 6d 5b 5d 20 66 6f 72 20 63 75 72 73 6f 72 73  em[] for cursors
e740: 20 31 20 61 6e 64 20 67 72 65 61 74 65 72 2e 0a   1 and greater..
e750: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
e760: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
e770: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
e780: 6e 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 6e  nCursor;.  if( n
e790: 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 6e 4d 65  Cursor==0 && nMe
e7a0: 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20 2f  m>0 ) nMem++;  /
e7b0: 2a 20 53 70 61 63 65 20 66 6f 72 20 61 4d 65 6d  * Space for aMem
e7c0: 5b 30 5d 20 65 76 65 6e 20 69 66 20 6e 6f 74 20  [0] even if not 
e7d0: 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  used */..  /* Fi
e7e0: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
e7f0: 68 20 72 65 75 73 61 62 6c 65 20 6d 65 6d 6f 72  h reusable memor
e800: 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61  y is available a
e810: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
e820: 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72  .  ** opcode arr
e830: 61 79 2e 20 20 54 68 69 73 20 65 78 74 72 61 20  ay.  This extra 
e840: 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 72  memory will be r
e850: 65 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 6f  eallocated for o
e860: 74 68 65 72 20 65 6c 65 6d 65 6e 74 73 0a 20 20  ther elements.  
e870: 2a 2a 20 6f 66 20 74 68 65 20 70 72 65 70 61 72  ** of the prepar
e880: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ed statement..  
e890: 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e 44 38 28  */.  n = ROUND8(
e8a0: 73 69 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e 4f  sizeof(Op)*p->nO
e8b0: 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p);             
e8c0: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6f 70 63   /* Bytes of opc
e8d0: 6f 64 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  ode memory used 
e8e0: 2a 2f 0a 20 20 78 2e 70 53 70 61 63 65 20 3d 20  */.  x.pSpace = 
e8f0: 26 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b 6e  &((u8*)p->aOp)[n
e900: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
e910: 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70 63 6f 64   /* Unused opcod
e920: 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73  e memory */.  as
e930: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
e940: 5f 41 4c 49 47 4e 4d 45 4e 54 28 78 2e 70 53 70  _ALIGNMENT(x.pSp
e950: 61 63 65 29 20 29 3b 0a 20 20 78 2e 6e 46 72 65  ace) );.  x.nFre
e960: 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 70  e = ROUNDDOWN8(p
e970: 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63  Parse->szOpAlloc
e980: 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74 65 73   - n);  /* Bytes
e990: 20 6f 66 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72   of unused memor
e9a0: 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 78  y */.  assert( x
e9b0: 2e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20 61  .nFree>=0 );.  a
e9c0: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
e9d0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70  E_ALIGNMENT(&x.p
e9e0: 53 70 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20  Space[x.nFree]) 
e9f0: 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56  );..  resolveP2V
ea00: 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b  alues(p, &nArg);
ea10: 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  .  p->usesStmtJo
ea20: 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61  urnal = (u8)(pPa
ea30: 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  rse->isMultiWrit
ea40: 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79  e && pParse->may
ea50: 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50  Abort);.  if( pP
ea60: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26  arse->explain &&
ea70: 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20   nMem<10 ){.    
ea80: 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20  nMem = 10;.  }. 
ea90: 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b   p->expired = 0;
eaa0: 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f  ..  /* Memory fo
eab0: 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72  r registers, par
eac0: 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c  ameters, cursor,
ead0: 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74   etc, is allocat
eae0: 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74 77 6f  ed in one or two
eaf0: 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f  .  ** passes.  O
eb00: 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73  n the first pass
eb10: 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73  , we try to reus
eb20: 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20  e unused memory 
eb30: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64  at the .  ** end
eb40: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
eb50: 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65  rray.  If we are
eb60: 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73   unable to satis
eb70: 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20  fy all memory.  
eb80: 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  ** requirements 
eb90: 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f  by reusing the o
eba0: 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c  pcode array tail
ebb0: 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e  , then the secon
ebc0: 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c  d.  ** pass will
ebd0: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 6d   fill in the rem
ebe0: 61 69 6e 64 65 72 20 75 73 69 6e 67 20 61 20 66  ainder using a f
ebf0: 72 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  resh memory allo
ec00: 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20  cation.  .  **. 
ec10: 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73   ** This two-pas
ec20: 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20  s approach that 
ec30: 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d  reuses as much m
ec40: 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
ec50: 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  e from.  ** the 
ec60: 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72 79 20  leftover memory 
ec70: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
ec80: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20  e opcode array. 
ec90: 20 54 68 69 73 20 63 61 6e 20 73 69 67 6e 69 66   This can signif
eca0: 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64  icantly.  ** red
ecb0: 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  uce the amount o
ecc0: 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  f memory held by
ecd0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
ece0: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f  ement..  */.  do
ecf0: 20 7b 0a 20 20 20 20 78 2e 6e 4e 65 65 64 65 64   {.    x.nNeeded
ed00: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65   = 0;.    p->aMe
ed10: 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  m = allocSpace(&
ed20: 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d  x, p->aMem, nMem
ed30: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20  *sizeof(Mem));. 
ed40: 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c     p->aVar = all
ed50: 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
ed60: 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66  Var, nVar*sizeof
ed70: 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61  (Mem));.    p->a
ed80: 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pArg = allocSpac
ed90: 65 28 26 78 2c 20 70 2d 3e 61 70 41 72 67 2c 20  e(&x, p->apArg, 
eda0: 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
edb0: 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72  ));.    p->apCsr
edc0: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
edd0: 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72  , p->apCsr, nCur
ede0: 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43  sor*sizeof(VdbeC
edf0: 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66  ursor*));.#ifdef
ee00: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
ee10: 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
ee20: 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61     p->anExec = a
ee30: 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d  llocSpace(&x, p-
ee40: 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a  >anExec, p->nOp*
ee50: 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65  sizeof(i64));.#e
ee60: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 78 2e 6e  ndif.    if( x.n
ee70: 4e 65 65 64 65 64 3d 3d 30 20 29 20 62 72 65 61  Needed==0 ) brea
ee80: 6b 3b 0a 20 20 20 20 78 2e 70 53 70 61 63 65 20  k;.    x.pSpace 
ee90: 3d 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c  = p->pFree = sql
eea0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
eeb0: 4e 28 64 62 2c 20 78 2e 6e 4e 65 65 64 65 64 29  N(db, x.nNeeded)
eec0: 3b 0a 20 20 20 20 78 2e 6e 46 72 65 65 20 3d 20  ;.    x.nFree = 
eed0: 78 2e 6e 4e 65 65 64 65 64 3b 0a 20 20 7d 77 68  x.nNeeded;.  }wh
eee0: 69 6c 65 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ile( !db->malloc
eef0: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e  Failed );..  p->
ef00: 70 56 4c 69 73 74 20 3d 20 70 50 61 72 73 65 2d  pVList = pParse-
ef10: 3e 70 56 4c 69 73 74 3b 0a 20 20 70 50 61 72 73  >pVList;.  pPars
ef20: 65 2d 3e 70 56 4c 69 73 74 20 3d 20 20 30 3b 0a  e->pVList =  0;.
ef30: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70    p->explain = p
ef40: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a  Parse->explain;.
ef50: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
ef60: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
ef70: 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 70  >nVar = 0;.    p
ef80: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->nCursor = 0;. 
ef90: 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a     p->nMem = 0;.
efa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
efb0: 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f  nCursor = nCurso
efc0: 72 3b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  r;.    p->nVar =
efd0: 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20   (ynVar)nVar;.  
efe0: 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70    initMemArray(p
eff0: 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2c 20 64 62  ->aVar, nVar, db
f000: 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
f010: 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b   p->nMem = nMem;
f020: 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61  .    initMemArra
f030: 79 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2c  y(p->aMem, nMem,
f040: 20 64 62 2c 20 4d 45 4d 5f 55 6e 64 65 66 69 6e   db, MEM_Undefin
f050: 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ed);.    memset(
f060: 70 2d 3e 61 70 43 73 72 2c 20 30 2c 20 6e 43 75  p->apCsr, 0, nCu
f070: 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
f080: 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65  Cursor*));.#ifde
f090: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
f0a0: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
f0b0: 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 6e      memset(p->an
f0c0: 45 78 65 63 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a  Exec, 0, p->nOp*
f0d0: 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65  sizeof(i64));.#e
f0e0: 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ndif.  }.  sqlit
f0f0: 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b  e3VdbeRewind(p);
f100: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
f110: 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e  a VDBE cursor an
f120: 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
f130: 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
f140: 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70   cursor .** happ
f150: 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a  ens to hold..*/.
f160: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
f170: 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20  FreeCursor(Vdbe 
f180: 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a  *p, VdbeCursor *
f190: 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d  pCx){.  if( pCx=
f1a0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
f1b0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
f1c0: 70 43 78 2d 3e 70 42 74 78 3d 3d 30 20 7c 7c 20  pCx->pBtx==0 || 
f1d0: 70 43 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  pCx->eCurType==C
f1e0: 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
f1f0: 20 20 73 77 69 74 63 68 28 20 70 43 78 2d 3e 65    switch( pCx->e
f200: 43 75 72 54 79 70 65 20 29 7b 0a 20 20 20 20 63  CurType ){.    c
f210: 61 73 65 20 43 55 52 54 59 50 45 5f 53 4f 52 54  ase CURTYPE_SORT
f220: 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
f230: 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f  te3VdbeSorterClo
f240: 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a  se(p->db, pCx);.
f250: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f260: 20 7d 0a 20 20 20 20 63 61 73 65 20 43 55 52 54   }.    case CURT
f270: 59 50 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20 20  YPE_BTREE: {.   
f280: 20 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 78     if( pCx->pBtx
f290: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f2a0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
f2b0: 78 2d 3e 70 42 74 78 29 3b 0a 20 20 20 20 20 20  x->pBtx);.      
f2c0: 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43    /* The pCx->pC
f2d0: 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c  ursor will be cl
f2e0: 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ose automaticall
f2f0: 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c  y, if it exists,
f300: 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   by.        ** t
f310: 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a  he call above. *
f320: 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /.      }else{. 
f330: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
f340: 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d  Cx->uc.pCursor!=
f350: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
f360: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
f370: 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e 70 43 75  rsor(pCx->uc.pCu
f380: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsor);.      }. 
f390: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f3a0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
f3b0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
f3c0: 4c 45 0a 20 20 20 20 63 61 73 65 20 43 55 52 54  LE.    case CURT
f3d0: 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20  YPE_VTAB: {.    
f3e0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
f3f0: 75 72 73 6f 72 20 2a 70 56 43 75 72 20 3d 20 70  ursor *pVCur = p
f400: 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20  Cx->uc.pVCur;.  
f410: 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
f420: 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
f430: 65 20 3d 20 70 56 43 75 72 2d 3e 70 56 74 61 62  e = pVCur->pVtab
f440: 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20  ->pModule;.     
f450: 20 61 73 73 65 72 74 28 20 70 56 43 75 72 2d 3e   assert( pVCur->
f460: 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b  pVtab->nRef>0 );
f470: 0a 20 20 20 20 20 20 70 56 43 75 72 2d 3e 70 56  .      pVCur->pV
f480: 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  tab->nRef--;.   
f490: 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f     pModule->xClo
f4a0: 73 65 28 70 56 43 75 72 29 3b 0a 20 20 20 20 20  se(pVCur);.     
f4b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
f4c0: 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
f4d0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
f4e0: 6f 72 73 20 69 6e 20 74 68 65 20 63 75 72 72 65  ors in the curre
f4f0: 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61  nt frame..*/.sta
f500: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 43 75  tic void closeCu
f510: 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 56 64 62  rsorsInFrame(Vdb
f520: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
f530: 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74  apCsr ){.    int
f540: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
f550: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
f560: 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43  ++){.      VdbeC
f570: 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61  ursor *pC = p->a
f580: 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69  pCsr[i];.      i
f590: 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20  f( pC ){.       
f5a0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
f5b0: 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20  Cursor(p, pC);. 
f5c0: 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b         p->apCsr[
f5d0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
f5e0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
f5f0: 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75  ** Copy the valu
f600: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  es stored in the
f610: 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63   VdbeFrame struc
f620: 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65  ture to its Vdbe
f630: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65  . This.** is use
f640: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  d, for example, 
f650: 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73  when a trigger s
f660: 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61  ub-program is ha
f670: 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a  lted to restore.
f680: 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68  ** control to th
f690: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a  e main program..
f6a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
f6b0: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56  beFrameRestore(V
f6c0: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
f6d0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
f6e0: 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73  Frame->v;.  clos
f6f0: 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
f700: 76 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  v);.#ifdef SQLIT
f710: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
f720: 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e  ANSTATUS.  v->an
f730: 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61  Exec = pFrame->a
f740: 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20  nExec;.#endif.  
f750: 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->aOp = pFrame-
f760: 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d  >aOp;.  v->nOp =
f770: 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20   pFrame->nOp;.  
f780: 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->aMem = pFrame
f790: 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65  ->aMem;.  v->nMe
f7a0: 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d  m = pFrame->nMem
f7b0: 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70  ;.  v->apCsr = p
f7c0: 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20  Frame->apCsr;.  
f7d0: 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72  v->nCursor = pFr
f7e0: 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20  ame->nCursor;.  
f7f0: 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  v->db->lastRowid
f800: 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52   = pFrame->lastR
f810: 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e  owid;.  v->nChan
f820: 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68  ge = pFrame->nCh
f830: 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e  ange;.  v->db->n
f840: 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
f850: 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 73 71  >nDbChange;.  sq
f860: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
f870: 75 78 44 61 74 61 28 76 2d 3e 64 62 2c 20 26 76  uxData(v->db, &v
f880: 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20  ->pAuxData, -1, 
f890: 30 29 3b 0a 20 20 76 2d 3e 70 41 75 78 44 61 74  0);.  v->pAuxDat
f8a0: 61 20 3d 20 70 46 72 61 6d 65 2d 3e 70 41 75 78  a = pFrame->pAux
f8b0: 44 61 74 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e  Data;.  pFrame->
f8c0: 70 41 75 78 44 61 74 61 20 3d 20 30 3b 0a 20 20  pAuxData = 0;.  
f8d0: 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70  return pFrame->p
f8e0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
f8f0: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
f900: 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73  *.** Also releas
f910: 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65  e any dynamic me
f920: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65  mory held by the
f930: 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e   VM in the Vdbe.
f940: 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20  aMem memory .** 
f950: 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73  cell array. This
f960: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73   is necessary as
f970: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
f980: 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61   array may conta
f990: 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74  in.** pointers t
f9a0: 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  o VdbeFrame obje
f9b0: 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69  cts, which may i
f9c0: 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70  n turn contain p
f9d0: 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70  ointers to.** op
f9e0: 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73  en cursors..*/.s
f9f0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
fa00: 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20  AllCursors(Vdbe 
fa10: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46  *p){.  if( p->pF
fa20: 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
fa30: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20  Frame *pFrame;. 
fa40: 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
fa50: 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d  >pFrame; pFrame-
fa60: 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65  >pParent; pFrame
fa70: 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74  =pFrame->pParent
fa80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
fa90: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70  beFrameRestore(p
faa0: 46 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70  Frame);.    p->p
fab0: 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70  Frame = 0;.    p
fac0: 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20  ->nFrame = 0;.  
fad0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  }.  assert( p->n
fae0: 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c  Frame==0 );.  cl
faf0: 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
fb00: 65 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  e(p);.  if( p->a
fb10: 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  Mem ){.    relea
fb20: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d  seMemArray(p->aM
fb30: 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  em, p->nMem);.  
fb40: 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44  }.  while( p->pD
fb50: 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  elFrame ){.    V
fb60: 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d  dbeFrame *pDel =
fb70: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20   p->pDelFrame;. 
fb80: 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20     p->pDelFrame 
fb90: 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b  = pDel->pParent;
fba0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fbb0: 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c  FrameDelete(pDel
fbc0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
fbd0: 65 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20  ete any auxdata 
fbe0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65  allocations made
fbf0: 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20   by the VM */.  
fc00: 69 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20  if( p->pAuxData 
fc10: 29 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  ) sqlite3VdbeDel
fc20: 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e 64 62  eteAuxData(p->db
fc30: 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20  , &p->pAuxData, 
fc40: 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  -1, 0);.  assert
fc50: 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30  ( p->pAuxData==0
fc60: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   );.}../*.** Cle
fc70: 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74  an up the VM aft
fc80: 65 72 20 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e  er a single run.
fc90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fca0: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
fcb0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
fcc0: 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66  = p->db;..#ifdef
fcd0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
fce0: 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72  /* Execute asser
fcf0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
fd00: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
fd10: 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61  e Vdbe.apCsr[] a
fd20: 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d  nd .  ** Vdbe.aM
fd30: 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65  em[] arrays have
fd40: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c   already been cl
fd50: 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20  eaned up.  */.  
fd60: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
fd70: 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b  apCsr ) for(i=0;
fd80: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
fd90: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
fda0: 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20  pCsr[i]==0 );.  
fdb0: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
fdc0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
fdd0: 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65  >nMem; i++) asse
fde0: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66  rt( p->aMem[i].f
fdf0: 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69  lags==MEM_Undefi
fe00: 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ned );.  }.#endi
fe10: 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  f..  sqlite3DbFr
fe20: 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
fe30: 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
fe40: 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75   = 0;.  p->pResu
fe50: 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ltSet = 0;.}../*
fe60: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
fe70: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
fe80: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
fe90: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
fea0: 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
feb0: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
fec0: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
fed0: 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
fee0: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
fef0: 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
ff00: 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
ff10: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
ff20: 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
ff30: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
ff40: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
ff50: 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
ff60: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
ff70: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
ff80: 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
ff90: 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d  nResColumn){.  M
ffa0: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
ffb0: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
ffc0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
ffd0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
ffe0: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
fff0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
10000 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65  AME_N);.  sqlite
10010 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
10020 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20  ColName);.  n = 
10030 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
10040 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43  ME_N;.  p->nResC
10050 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65  olumn = (u16)nRe
10060 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43  sColumn;.  p->aC
10070 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d  olName = pColNam
10080 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65  e = (Mem*)sqlite
10090 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
100a0 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e  b, sizeof(Mem)*n
100b0 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f   );.  if( p->aCo
100c0 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  lName==0 ) retur
100d0 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d 41 72 72 61  n;.  initMemArra
100e0 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 6e  y(p->aColName, n
100f0 2c 20 70 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c  , p->db, MEM_Nul
10100 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  l);.}../*.** Set
10110 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
10120 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
10130 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
10140 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
10150 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
10160 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
10170 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
10180 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
10190 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
101a0 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
101b0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
101c0 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
101d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c  .**.** The final
101e0 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c   parameter, xDel
101f0 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  , must be one of
10200 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
10210 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a   SQLITE_STATIC.*
10220 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e  * or SQLITE_TRAN
10230 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20  SIENT. If it is 
10240 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
10250 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20  then the buffer 
10260 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
10270 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66   zName will be f
10280 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44  reed by sqlite3D
10290 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  bFree() when the
102a0 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79   vdbe is destroy
102b0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
102c0 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
102d0 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102f0 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69       /* Vdbe bei
10300 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f  ng configured */
10310 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
10320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10330 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
10340 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70  column zName app
10350 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  lies to */.  int
10360 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20   var,           
10370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10380 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e   One of the COLN
10390 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20  AME_* constants 
103a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
103b0 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
103c0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
103d0 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
103e0 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20  ining name */.  
103f0 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
10400 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  d*)             
10410 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67   /* Memory manag
10420 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66  ement strategy f
10430 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  or zName */.){. 
10440 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
10450 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
10460 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43  rt( idx<p->nResC
10470 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
10480 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e  t( var<COLNAME_N
10490 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
104a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
104b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e  .    assert( !zN
104c0 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c  ame || xDel!=SQL
104d0 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20  ITE_DYNAMIC );. 
104e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
104f0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
10500 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43  .  assert( p->aC
10510 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  olName!=0 );.  p
10520 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61  ColName = &(p->a
10530 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a  ColName[idx+var*
10540 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b  p->nResColumn]);
10550 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
10560 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f  dbeMemSetStr(pCo
10570 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31  lName, zName, -1
10580 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78  , SQLITE_UTF8, x
10590 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Del);.  assert( 
105a0 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20  rc!=0 || !zName 
105b0 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c  || (pColName->fl
105c0 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30  ags&MEM_Term)!=0
105d0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
105e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64  .}../*.** A read
105f0 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
10600 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79  ction may or may
10610 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f   not be active o
10620 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
10630 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72  e.** db. If a tr
10640 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
10650 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20  ive, commit it. 
10660 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a  If there is a.**
10670 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
10680 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65  on spanning more
10690 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
106a0 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  se file, this ro
106b0 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63  utine.** takes c
106c0 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  are of the maste
106d0 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65  r journal tricke
106e0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
106f0 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c  t vdbeCommit(sql
10700 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
10710 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
10720 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20  nt nTrans = 0;  
10730 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74  /* Number of dat
10740 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61  abases with an a
10750 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e  ctive write-tran
10760 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  saction.        
10770 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
10780 61 74 20 61 72 65 20 63 61 6e 64 69 64 61 74 65  at are candidate
10790 73 20 66 6f 72 20 61 20 74 77 6f 2d 70 68 61 73  s for a two-phas
107a0 65 20 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20 61  e commit using a
107b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
107c0 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
107d0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 72  urnal */.  int r
107e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
107f0 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74   int needXcommit
10800 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 0;..#ifdef SQ
10810 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
10820 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68  LTABLE.  /* With
10830 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71   this option, sq
10840 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29 20  lite3VtabSync() 
10850 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
10860 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51   simply .  ** SQ
10870 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20  LITE_OK so p is 
10880 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a  not used. .  */.
10890 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
108a0 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ER(p);.#endif.. 
108b0 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
108c0 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
108d0 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29  call the xSync()
108e0 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
108f0 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d  y.  ** virtual m
10900 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69  odule tables wri
10910 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61  tten in this tra
10920 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68  nsaction. This h
10930 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f  as to.  ** be do
10940 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d  ne before determ
10950 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20  ining whether a 
10960 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10970 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71  ile is .  ** req
10980 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79  uired, as an xSy
10990 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61  nc() callback ma
109a0 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65  y add an attache
109b0 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  d database.  ** 
109c0 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
109d0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
109e0 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
109f0 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68  db, p);..  /* Th
10a00 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
10a10 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
10a20 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
10a30 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
10a40 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
10a50 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
10a60 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
10a70 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
10a80 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
10a90 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
10aa0 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
10ab0 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
10ac0 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
10ad0 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
10ae0 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
10af0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
10b00 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
10b10 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
10b20 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
10b30 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
10b40 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
10b50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
10b60 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
10b70 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ){ .    Btree *p
10b80 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
10b90 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBt;.    if( sql
10ba0 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
10bb0 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
10bc0 20 2f 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e   /* Whether or n
10bd0 6f 74 20 61 20 64 61 74 61 62 61 73 65 20 6d 69  ot a database mi
10be0 67 68 74 20 6e 65 65 64 20 61 20 6d 61 73 74 65  ght need a maste
10bf0 72 20 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e 64  r journal depend
10c00 73 20 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  s upon.      ** 
10c10 69 74 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  its journal mode
10c20 20 28 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74 68   (among other th
10c30 69 6e 67 73 29 2e 20 20 54 68 69 73 20 6d 61 74  ings).  This mat
10c40 72 69 78 20 64 65 74 65 72 6d 69 6e 65 73 20 77  rix determines w
10c50 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  hich.      ** jo
10c60 75 72 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65 20  urnal modes use 
10c70 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
10c80 20 61 6e 64 20 77 68 69 63 68 20 64 6f 20 6e 6f   and which do no
10c90 74 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  t */.      stati
10ca0 63 20 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e 65  c const u8 aMJNe
10cb0 65 64 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  eded[] = {.     
10cc0 20 20 20 2f 2a 20 44 45 4c 45 54 45 20 20 20 2a     /* DELETE   *
10cd0 2f 20 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a  /  1,.        /*
10ce0 20 50 45 52 53 49 53 54 20 20 20 2a 2f 20 31 2c   PERSIST   */ 1,
10cf0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 20  .        /* OFF 
10d00 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20        */ 0,.    
10d10 20 20 20 20 2f 2a 20 54 52 55 4e 43 41 54 45 20      /* TRUNCATE 
10d20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f   */ 1,.        /
10d30 2a 20 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20 30  * MEMORY    */ 0
10d40 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c  ,.        /* WAL
10d50 20 20 20 20 20 20 20 2a 2f 20 30 0a 20 20 20 20         */ 0.    
10d60 20 20 7d 3b 0a 20 20 20 20 20 20 50 61 67 65 72    };.      Pager
10d70 20 2a 70 50 61 67 65 72 3b 20 20 20 2f 2a 20 50   *pPager;   /* P
10d80 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  ager associated 
10d90 77 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 20 20  with pBt */.    
10da0 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20    needXcommit = 
10db0 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
10dc0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b  BtreeEnter(pBt);
10dd0 0a 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20  .      pPager = 
10de0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
10df0 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  r(pBt);.      if
10e00 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61 66  ( db->aDb[i].saf
10e10 65 74 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45 52  ety_level!=PAGER
10e20 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46  _SYNCHRONOUS_OFF
10e30 0a 20 20 20 20 20 20 20 26 26 20 61 4d 4a 4e 65  .       && aMJNe
10e40 65 64 65 64 5b 73 71 6c 69 74 65 33 50 61 67 65  eded[sqlite3Page
10e50 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  rGetJournalMode(
10e60 70 50 61 67 65 72 29 5d 0a 20 20 20 20 20 20 29  pPager)].      )
10e70 7b 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  { .        asser
10e80 74 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20  t( i!=1 );.     
10e90 20 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20     nTrans++;.   
10ea0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
10eb0 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
10ec0 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72  usiveLock(pPager
10ed0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10ee0 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b  BtreeLeave(pBt);
10ef0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
10f00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10f10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
10f20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
10f30 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
10f40 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
10f50 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
10f60 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
10f70 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
10f80 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
10f90 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
10fa0 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
10fb0 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
10fc0 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69  ommitArg);.    i
10fd0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
10fe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
10ff0 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f  STRAINT_COMMITHO
11000 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
11010 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63   /* The simple c
11020 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68  ase - no more th
11030 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
11040 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69  file (not counti
11050 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50  ng the.  ** TEMP
11060 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61   database) has a
11070 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74   transaction act
11080 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20  ive.   There is 
11090 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a  no need for the.
110a0 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
110b0 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  nal..  **.  ** I
110c0 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
110d0 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ue of sqlite3Btr
110e0 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20  eeGetFilename() 
110f0 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68  is a zero length
11100 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74  .  ** string, it
11110 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20   means the main 
11120 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d  database is :mem
11130 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66  ory: or a temp f
11140 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74  ile.  In .  ** t
11150 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e  hat case we do n
11160 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69  ot support atomi
11170 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  c multi-file com
11180 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65  mits, so use the
11190 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61   .  ** simple ca
111a0 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a  se then too..  *
111b0 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  /.  if( 0==sqlit
111c0 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74  e3Strlen30(sqlit
111d0 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
111e0 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
111f0 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73  t)).   || nTrans
11200 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72  <=1.  ){.    for
11210 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
11220 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
11230 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
11240 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
11250 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
11260 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
11270 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11280 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
11290 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  One(pBt, 0);.   
112a0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
112b0 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74  /* Do the commit
112c0 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74   only if all dat
112d0 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75  abases successfu
112e0 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61  lly complete pha
112f0 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66  se 1. .    ** If
11300 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65   one of the Btre
11310 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
11320 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74  ) calls fails, t
11330 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e  his indicates an
11340 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72  .    ** IO error
11350 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20   while deleting 
11360 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20  or truncating a 
11370 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74  journal file. It
11380 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20   is unlikely,.  
11390 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68    ** but could h
113a0 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63  appen. In this c
113b0 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  ase abandon proc
113c0 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
113d0 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20  n the error..   
113e0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
113f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11400 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
11410 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
11420 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
11430 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
11440 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
11450 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
11460 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
11470 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
11480 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
11490 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
114a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
114b0 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
114c0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
114d0 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54  complex case - T
114e0 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d  here is a multi-
114f0 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73  file write-trans
11500 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20  action active.. 
11510 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65   ** This require
11520 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
11530 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72  al file to ensur
11540 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
11550 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74  n is.  ** commit
11560 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ted atomically..
11570 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
11580 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
11590 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
115a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
115b0 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68  db->pVfs;.    ch
115c0 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
115d0 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20     /* File-name 
115e0 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a  for the master j
115f0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68  ournal */.    ch
11600 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46  ar const *zMainF
11610 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
11620 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
11630 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
11640 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
11650 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  *pMaster = 0;.  
11660 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
11670 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  ;.    int res;. 
11680 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e     int retryCoun
11690 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  t = 0;.    int n
116a0 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f  MainFile;..    /
116b0 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65  * Select a maste
116c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
116d0 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e  ame */.    nMain
116e0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74  File = sqlite3St
116f0 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65  rlen30(zMainFile
11700 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
11710 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
11720 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58  db, "%s-mjXXXXXX
11730 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65  9XXz", zMainFile
11740 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74  );.    if( zMast
11750 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  er==0 ) return S
11760 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
11770 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
11780 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20   u32 iRandom;.  
11790 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
117a0 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  nt ){.        if
117b0 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30  ( retryCount>100
117c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
117d0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
117e0 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74  _FULL, "MJ delet
117f0 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
11800 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
11810 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
11820 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
11830 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
11840 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
11850 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20  ( retryCount==1 
11860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
11870 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
11880 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64  FULL, "MJ collid
11890 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
118a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
118b0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43    }.      retryC
118c0 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  ount++;.      sq
118d0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
118e0 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29  (sizeof(iRandom)
118f0 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20  , &iRandom);.   
11900 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
11910 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72  ntf(13, &zMaster
11920 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d  [nMainFile], "-m
11930 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20  j%06X9%02X",.   
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11950 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61              (iRa
11960 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66  ndom>>8)&0xfffff
11970 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29  f, iRandom&0xff)
11980 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;.      /* The a
11990 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63  ntipenultimate c
119a0 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
119b0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
119c0 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ame must.      *
119d0 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69  * be "9" to avoi
119e0 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e  d name collision
119f0 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33  s when using 8+3
11a00 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20   filenames. */. 
11a10 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61       assert( zMa
11a20 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c  ster[sqlite3Strl
11a30 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d  en30(zMaster)-3]
11a40 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73  =='9' );.      s
11a50 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
11a60 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61  3(zMainFile, zMa
11a70 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ster);.      rc 
11a80 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
11a90 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
11aa0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
11ab0 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
11ac0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
11ad0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29  LITE_OK && res )
11ae0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
11af0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11b00 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
11b10 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
11b20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11b30 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
11b40 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
11b50 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
11b60 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
11b70 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
11b80 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
11b90 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
11ba0 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
11bb0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
11bc0 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20  JOURNAL, 0.     
11bd0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
11be0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11bf0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11c00 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
11c10 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
11c20 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20  n rc;.    }. .  
11c30 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
11c40 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61  ame of each data
11c50 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
11c60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74   transaction int
11c70 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
11c80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11c90 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  file. If an erro
11ca0 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  r occurs at this
11cb0 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20   point close.   
11cc0 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74   ** and delete t
11cd0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11ce0 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20  l file. All the 
11cf0 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
11d00 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20  al files.    ** 
11d10 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c  still have 'null
11d20 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20  ' as the master 
11d30 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
11d40 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f   so they will ro
11d50 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69  ll.    ** back i
11d60 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20  ndependently if 
11d70 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
11d80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
11d90 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
11da0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
11db0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
11dc0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
11dd0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
11de0 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
11df0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
11e00 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
11e10 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
11e20 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
11e30 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
11e40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11e50 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49   continue;  /* I
11e60 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a  gnore TEMP and :
11e70 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65  memory: database
11e80 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  s */.        }. 
11e90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
11ea0 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  File[0]!=0 );.  
11eb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11ec0 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65  e3OsWrite(pMaste
11ed0 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65  r, zFile, sqlite
11ee0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
11ef0 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  +1, offset);.   
11f00 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73       offset += s
11f10 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11f20 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20  File)+1;.       
11f30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11f40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
11f50 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
11f60 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
11f70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
11f80 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
11f90 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
11fa0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11fb0 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
11fc0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11fd0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
11fe0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
11ff0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61    /* Sync the ma
12000 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12010 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f  e. If the IOCAP_
12020 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63  SEQUENTIAL devic
12030 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  e.    ** flag is
12040 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74   set this is not
12050 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
12060 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71  /.    if( 0==(sq
12070 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
12080 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
12090 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
120a0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20  AP_SEQUENTIAL). 
120b0 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
120c0 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
120d0 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
120e0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
120f0 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
12100 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
12110 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
12120 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
12130 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
12140 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
12150 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
12160 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
12170 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
12180 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
12190 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
121a0 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
121b0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
121c0 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
121d0 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
121e0 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
121f0 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
12200 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
12210 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
12220 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
12230 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
12240 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12250 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
12260 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
12270 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
12280 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
12290 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
122a0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
122b0 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
122c0 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
122d0 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
122e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
122f0 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
12300 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
12310 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
12320 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
12330 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
12340 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
12350 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
12360 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
12370 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
12380 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a   occurred..    *
12390 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
123a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
123b0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
123c0 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
123d0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
123e0 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
123f0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
12400 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
12410 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
12420 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
12430 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
12440 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
12450 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
12460 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
12470 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69  TE_BUSY );.    i
12480 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12490 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
124a0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
124b0 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
124c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
124d0 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
124e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
124f0 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
12500 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
12510 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
12520 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
12530 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
12540 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
12550 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
12560 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
12570 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
12580 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
12590 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
125a0 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
125b0 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
125c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
125d0 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
125e0 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
125f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
12600 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
12610 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
12620 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
12630 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
12640 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
12650 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
12660 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
12670 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
12680 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
12690 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
126a0 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
126b0 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
126c0 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
126d0 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
126e0 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
126f0 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
12700 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
12710 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
12720 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
12730 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
12740 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
12750 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
12760 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
12770 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
12780 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
12790 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
127a0 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
127b0 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
127c0 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
127d0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
127e0 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
127f0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
12800 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
12810 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
12820 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
12830 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
12840 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
12850 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
12860 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
12870 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
12880 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
12890 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
128a0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
128b0 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
128c0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
128d0 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
128e0 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
128f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
12900 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
12910 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12920 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
12930 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63   sqlite3.nVdbeAc
12940 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61  tive count varia
12950 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
12960 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
12970 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
12980 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
12990 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
129a0 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
129b0 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
129c0 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
129d0 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
129e0 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
129f0 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
12a00 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
12a10 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
12a20 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
12a30 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
12a40 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
12a50 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
12a60 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
12a70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
12a80 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
12a90 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
12aa0 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
12ab0 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  nt = 0;.  int nW
12ac0 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rite = 0;.  int 
12ad0 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d  nRead = 0;.  p =
12ae0 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
12af0 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
12b00 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62  ( sqlite3_stmt_b
12b10 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d  usy((sqlite3_stm
12b20 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63  t*)p) ){.      c
12b30 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
12b40 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
12b50 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20   nWrite++;.     
12b60 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65   if( p->bIsReade
12b70 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20  r ) nRead++;.   
12b80 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
12b90 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
12ba0 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62  t( cnt==db->nVdb
12bb0 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73  eActive );.  ass
12bc0 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d  ert( nWrite==db-
12bd0 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
12be0 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d   assert( nRead==
12bf0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
12c00 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
12c10 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
12c20 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
12c30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65  *.** If the Vdbe
12c40 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
12c50 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70  irst argument op
12c60 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74  ened a statement
12c70 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a  -transaction,.**
12c80 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41   close it now. A
12c90 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74  rgument eOp must
12ca0 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50   be either SAVEP
12cb0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
12cc0 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  .** SAVEPOINT_RE
12cd0 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20  LEASE. If it is 
12ce0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
12cf0 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61  CK, then the sta
12d00 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
12d10 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
12d20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20  back. If eOp is 
12d30 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
12d40 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  E, then the .** 
12d50 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
12d60 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
12d70 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
12d80 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
12d90 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
12da0 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
12db0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
12dc0 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   Otherwise SQLIT
12dd0 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
12de0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
12df0 69 6e 74 20 76 64 62 65 43 6c 6f 73 65 53 74 61  int vdbeCloseSta
12e00 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  tement(Vdbe *p, 
12e10 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69  int eOp){.  sqli
12e20 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20  te3 *const db = 
12e30 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
12e40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
12e50 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69 6e  nt i;.  const in
12e60 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  t iSavepoint = p
12e70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a  ->iStatement-1;.
12e80 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d  .  assert( eOp==
12e90 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
12ea0 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50  CK || eOp==SAVEP
12eb0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20  OINT_RELEASE);. 
12ec0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74   assert( db->nSt
12ed0 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
12ee0 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65  ssert( p->iState
12ef0 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74  ment==(db->nStat
12f00 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70  ement+db->nSavep
12f10 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 66 6f 72 28  oint) );..  for(
12f20 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
12f30 69 2b 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72  i++){ .    int r
12f40 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
12f50 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
12f60 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
12f70 0a 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a  .    if( pBt ){.
12f80 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
12f90 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12fa0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32  K ){.        rc2
12fb0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
12fc0 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
12fd0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12fe0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
12ff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13000 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
13010 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d  ){.        rc2 =
13020 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
13030 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
13040 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
13050 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
13060 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
13070 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13080 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
13090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
130a0 20 7d 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d   }.  db->nStatem
130b0 65 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53 74 61  ent--;.  p->iSta
130c0 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 69  tement = 0;..  i
130d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
130e0 20 29 7b 0a 20 20 20 20 69 66 28 20 65 4f 70 3d   ){.    if( eOp=
130f0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
13100 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ACK ){.      rc 
13110 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
13120 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
13130 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
13140 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
13150 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
13160 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13170 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
13180 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
13190 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
131a0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
131b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
131c0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
131d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
131e0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
131f0 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74  , also restore t
13200 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
13210 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72  e handles deferr
13220 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  ed constraint co
13230 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c  unter to the val
13240 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a  ue it had when .
13250 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
13260 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
13270 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20  as opened.  */. 
13280 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
13290 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
132a0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
132b0 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  dCons = p->nStmt
132c0 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 64 62 2d  DefCons;.    db-
132d0 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
132e0 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49  s = p->nStmtDefI
132f0 6d 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20 72 65  mmCons;.  }.  re
13300 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
13310 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
13320 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
13330 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 69 66  , int eOp){.  if
13340 28 20 70 2d 3e 64 62 2d 3e 6e 53 74 61 74 65 6d  ( p->db->nStatem
13350 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65  ent && p->iState
13360 6d 65 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75  ment ){.    retu
13370 72 6e 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74  rn vdbeCloseStat
13380 65 6d 65 6e 74 28 70 2c 20 65 4f 70 29 3b 0a 20  ement(p, eOp);. 
13390 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
133a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
133b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
133c0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
133d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
133e0 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61  ed by the databa
133f0 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73  se .** handle as
13400 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
13410 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
13420 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62  n argument is ab
13430 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  out to be .** co
13440 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72  mmitted. If ther
13450 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
13460 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  g deferred forei
13470 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
13480 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c  t.** violations,
13490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
134a0 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c  RROR. Otherwise,
134b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
134c0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
134d0 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69  utstanding FK vi
134e0 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69  olations and thi
134f0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
13500 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  ns .** SQLITE_ER
13510 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73  ROR, set the res
13520 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f  ult of the VM to
13530 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
13540 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a  NT_FOREIGNKEY.**
13550 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72   and write an er
13560 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69  ror message to i
13570 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53  t. Then return S
13580 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
13590 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
135a0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
135b0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
135c0 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20  heckFk(Vdbe *p, 
135d0 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20  int deferred){. 
135e0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
135f0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66  ->db;.  if( (def
13600 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44  erred && (db->nD
13610 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e  eferredCons+db->
13620 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
13630 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65  )>0) .   || (!de
13640 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b  ferred && p->nFk
13650 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20  Constraint>0) . 
13660 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
13670 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
13680 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20  T_FOREIGNKEY;.  
13690 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
136a0 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20   = OE_Abort;.   
136b0 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
136c0 72 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45  r(p, "FOREIGN KE
136d0 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
136e0 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  led");.    retur
136f0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
13700 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
13710 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
13720 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
13730 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
13740 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74  he when a VDBE t
13750 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49  ries to halt.  I
13760 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61  f the VDBE.** ha
13770 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61  s made changes a
13780 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  nd is in autocom
13790 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63  mit mode, then c
137a0 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63  ommit those.** c
137b0 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f  hanges.  If a ro
137c0 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64  llback is needed
137d0 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f  , then do the ro
137e0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  llback..**.** Th
137f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
13800 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
13810 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
13820 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c  a VM from.** SQL
13830 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f  ITE_MAGIC_RUN to
13840 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
13850 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c  LT.  It is harml
13860 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74  ess to.** call t
13870 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74  his on a VM that
13880 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54   is in the SQLIT
13890 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61  E_MAGIC_HALT sta
138a0 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
138b0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
138c0 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63   If the commit c
138d0 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  ould not complet
138e0 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20  e because of.** 
138f0 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c  lock contention,
13900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
13910 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f  USY.  If SQLITE_
13920 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
13930 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
13940 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20  e close did not 
13950 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73  happen and needs
13960 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e   to be repeated.
13970 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
13980 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29  dbeHalt(Vdbe *p)
13990 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139b0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73      /* Used to s
139c0 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72  tore transient r
139d0 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20  eturn codes */. 
139e0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
139f0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  ->db;..  /* This
13a00 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69   function contai
13a10 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  ns the logic tha
13a20 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  t determines if 
13a30 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20  a statement or. 
13a40 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
13a50 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
13a60 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
13a70 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
13a80 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69  the.  ** executi
13a90 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75  on of this virtu
13aa0 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a  al machine. .  *
13ab0 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66  *.  ** If any of
13ac0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
13ad0 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a  rrors occur:.  *
13ae0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  *.  **     SQLIT
13af0 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20  E_NOMEM.  **    
13b00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20   SQLITE_IOERR.  
13b10 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55  **     SQLITE_FU
13b20 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  LL.  **     SQLI
13b30 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a  TE_INTERRUPT.  *
13b40 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
13b50 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d  internal cache m
13b60 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c  ight have been l
13b70 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
13b80 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74  istent.  ** stat
13b90 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  e.  We need to r
13ba0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74  ollback the stat
13bb0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
13bc0 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20  n, if there is. 
13bd0 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20   ** one, or the 
13be0 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63  complete transac
13bf0 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73  tion if there is
13c00 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
13c10 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
13c20 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
13c30 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
13c40 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
13c50 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
13c60 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
13c70 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  p);.  if( p->mag
13c80 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
13c90 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  UN ){.    return
13ca0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13cb0 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
13cc0 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eCnt(db);..  /* 
13cd0 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  No commit or rol
13ce0 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20  lback needed if 
13cf0 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65  the program neve
13d00 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20  r started or if 
13d10 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  the.  ** SQL sta
13d20 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  tement does not 
13d30 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20  read or write a 
13d40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
13d50 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
13d60 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65  0 && p->bIsReade
13d70 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63  r ){.    int mrc
13d80 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65  ;   /* Primary e
13d90 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70  rror code from p
13da0 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ->rc */.    int 
13db0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30  eStatementOp = 0
13dc0 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63  ;.    int isSpec
13dd0 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20  ialError;       
13de0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
13df0 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61  rue if a 'specia
13e00 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20  l' error */..   
13e10 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72   /* Lock all btr
13e20 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ees used by the 
13e30 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
13e40 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
13e50 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(p);..    /* Ch
13e60 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  eck for one of t
13e70 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
13e80 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70  s */.    mrc = p
13e90 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20  ->rc & 0xff;.   
13ea0 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
13eb0 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  = mrc==SQLITE_NO
13ec0 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
13ed0 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  TE_IOERR.       
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
13ef0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc==SQLITE_INT
13f00 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53  ERRUPT || mrc==S
13f10 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
13f20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72  if( isSpecialErr
13f30 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  or ){.      /* I
13f40 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20  f the query was 
13f50 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68  read-only and th
13f60 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
13f70 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
13f80 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72  , .      ** no r
13f90 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73  ollback is neces
13fa0 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  sary. Otherwise,
13fb0 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65   at least a save
13fc0 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
13fd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
13fe0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
13ff0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
14000 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20  atabase to a .  
14010 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e      ** consisten
14020 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
14030 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20  *.      ** Even 
14040 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
14050 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69   is read-only, i
14060 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
14070 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20  o perform.      
14080 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  ** a statement o
14090 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  r transaction ro
140a0 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
140b0 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a  . If the error .
140c0 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65        ** occurre
140d0 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
140e0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  to the journal, 
140f0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64  sub-journal or d
14100 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
14110 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66   file as part of
14120 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72   an effort to fr
14130 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63  ee up cache spac
14140 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a  e (see function.
14150 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74        ** pagerSt
14160 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e  ress() in pager.
14170 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  c), the rollback
14180 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
14190 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a  restore .      *
141a0 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61  * the pager to a
141b0 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
141c0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
141d0 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
141e0 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54  ly || mrc!=SQLIT
141f0 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20  E_INTERRUPT ){. 
14200 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d         if( (mrc=
14210 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
14220 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
14230 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d  L) && p->usesStm
14240 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
14250 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
14260 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
14270 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
14280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14290 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63    /* We are forc
142a0 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
142b0 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73  the active trans
142c0 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64  action. Before d
142d0 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  oing.          *
142e0 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20  * so, abort any 
142f0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
14300 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72   this handle cur
14310 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76  rently has activ
14320 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
14330 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14340 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
14350 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
14360 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
14370 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
14380 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
14390 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
143a0 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
143b0 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
143c0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
143d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
143e0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
143f0 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69   immediate forei
14400 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e  gn key violation
14410 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  s. */.    if( p-
14420 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
14430 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
14440 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29  dbeCheckFk(p, 0)
14450 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
14460 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
14470 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
14480 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65   and this is the
14490 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69   only active wri
144a0 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20  ter .    ** VM, 
144b0 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65  then we do eithe
144c0 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
144d0 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
144e0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
144f0 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
14500 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
14510 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
14520 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
14530 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
14540 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
14550 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20  has occurred. . 
14560 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73     */.    if( !s
14570 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63  qlite3VtabInSync
14580 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62  (db) .     && db
14590 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20  ->autoCommit .  
145a0 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57     && db->nVdbeW
145b0 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e  rite==(p->readOn
145c0 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20  ly==0) .    ){. 
145d0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
145e0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
145f0 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
14600 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63  _Fail && !isSpec
14610 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20  ialError) ){.   
14620 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14630 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
14640 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
14650 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14660 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e  .          if( N
14670 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  EVER(p->readOnly
14680 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
14690 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
146a0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
146b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
146c0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
146d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
146e0 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
146f0 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a  INT_FOREIGNKEY;.
14700 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a          }else{ .
14710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14720 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
14730 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76  g is true, the v
14740 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20  dbe program was 
14750 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20  successful .    
14760 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20        ** or hit 
14770 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
14780 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72  straint and ther
14790 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65  e are no deferre
147a0 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20  d foreign.      
147b0 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74      ** key const
147c0 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75  raints to hold u
147d0 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
147e0 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  n. This means a 
147f0 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
14800 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
14810 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
14820 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64  c = vdbeCommit(d
14830 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
14840 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
14850 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
14860 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
14870 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14880 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
14890 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
148a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
148b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
148c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
148d0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
148e0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
148f0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
14900 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
14910 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ;.          p->n
14920 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
14930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14940 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
14950 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20  edCons = 0;.    
14960 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
14970 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a  redImmCons = 0;.
14980 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
14990 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44  ags &= ~SQLITE_D
149a0 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20  eferFKs;.       
149b0 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74     sqlite3Commit
149c0 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
149d0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  db);.        }. 
149e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
149f0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
14a00 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
14a10 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70  E_OK);.        p
14a20 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
14a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d       }.      db-
14a40 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
14a50 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
14a60 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29  StatementOp==0 )
14a70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
14a80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
14a90 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
14aa0 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
14ab0 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
14ac0 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  = SAVEPOINT_RELE
14ad0 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ASE;.      }else
14ae0 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74   if( p->errorAct
14af0 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ion==OE_Abort ){
14b00 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
14b10 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
14b20 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
14b30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14b40 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
14b50 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
14b60 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
14b70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
14b80 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
14b90 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
14ba0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
14bb0 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
14bc0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
14bd0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
14be0 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  If eStatementOp 
14bf0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
14c00 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  n a statement tr
14c10 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20  ansaction needs 
14c20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d  to.    ** be com
14c30 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
14c40 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69   back. Call sqli
14c50 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
14c60 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a  ement() to.    *
14c70 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73  * do so. If this
14c80 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72   operation retur
14c90 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64  ns an error, and
14ca0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
14cb0 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72  tement.    ** er
14cc0 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
14cd0 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f  TE_OK or SQLITE_
14ce0 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e  CONSTRAINT, then
14cf0 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20   promote the.   
14d00 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74   ** current stat
14d10 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ement error code
14d20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14d30 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b   eStatementOp ){
14d40 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14d50 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
14d60 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d  ement(p, eStatem
14d70 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66  entOp);.      if
14d80 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
14d90 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
14da0 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30  E_OK || (p->rc&0
14db0 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
14dc0 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20  STRAINT ){.     
14dd0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
14de0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14df0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
14e00 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
14e10 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
14e20 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
14e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
14e40 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
14e50 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
14e60 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
14e70 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
14e80 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
14e90 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
14ea0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
14eb0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
14ec0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
14ed0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
14ee0 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
14ef0 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
14f00 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
14f10 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ansaction.    **
14f20 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64   has been rolled
14f30 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68   back, update th
14f40 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
14f50 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75  ction change-cou
14f60 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  nter. .    */.  
14f70 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
14f80 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  ntOn ){.      if
14f90 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d  ( eStatementOp!=
14fa0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
14fb0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CK ){.        sq
14fc0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
14fd0 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
14fe0 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ge);.      }else
14ff0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15000 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
15010 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  db, 0);.      }.
15020 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
15030 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
15040 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
15050 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
15060 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
15070 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
15080 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
15090 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
150a0 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
150b0 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
150c0 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
150d0 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65  ){.    db->nVdbe
150e0 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66  Active--;.    if
150f0 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ( !p->readOnly )
15100 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d   db->nVdbeWrite-
15110 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49  -;.    if( p->bI
15120 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56  sReader ) db->nV
15130 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61  dbeRead--;.    a
15140 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
15150 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62  Active>=db->nVdb
15160 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73  eRead );.    ass
15170 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65  ert( db->nVdbeRe
15180 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69  ad>=db->nVdbeWri
15190 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  te );.    assert
151a0 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ( db->nVdbeWrite
151b0 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  >=0 );.  }.  p->
151c0 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
151d0 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
151e0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
151f0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
15200 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
15210 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
15220 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
15230 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74  .  /* If the aut
15240 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
15250 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68   set to true, th
15260 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61  en any locks tha
15270 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a  t were held.  **
15280 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64   by connection d
15290 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  b have now been 
152a0 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73  released. Call s
152b0 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
152c0 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a  Unlocked() .  **
152d0 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72   to invoke any r
152e0 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e  equired unlock-n
152f0 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
15300 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
15310 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
15320 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
15330 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b  ionUnlocked(db);
15340 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
15350 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e  db->nVdbeActive>
15360 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  0 || db->autoCom
15370 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53  mit==0 || db->nS
15380 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20  tatement==0 );. 
15390 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d   return (p->rc==
153a0 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51  SQLITE_BUSY ? SQ
153b0 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49  LITE_BUSY : SQLI
153c0 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TE_OK);.}.../*.*
153d0 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64  * Each VDBE hold
153e0 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
153f0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
15400 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
15410 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e  all.** in p->rc.
15420 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
15430 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20  ets that result 
15440 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f  back to SQLITE_O
15450 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  K..*/.void sqlit
15460 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52  e3VdbeResetStepR
15470 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  esult(Vdbe *p){.
15480 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
15490 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
154a0 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  py the error cod
154b0 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
154c0 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
154d0 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64   the VDBE passed
154e0 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
154f0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73   argument to its
15500 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
15510 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77   (so that they w
15520 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72  ill be .** retur
15530 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  ned by calls to 
15540 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
15550 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72  ) and sqlite3_er
15560 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54  rmsg())..**.** T
15570 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
15580 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20  s not clear the 
15590 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20  VDBE error code 
155a0 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74  or message, just
155b0 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20  .** copies them 
155c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
155d0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
155e0 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
155f0 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29  erError(Vdbe *p)
15600 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
15610 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
15620 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28  c = p->rc;.  if(
15630 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20   p->zErrMsg ){. 
15640 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61     db->bBenignMa
15650 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  lloc++;.    sqli
15660 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
15670 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20  lloc();.    if( 
15680 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62  db->pErr==0 ) db
15690 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33  ->pErr = sqlite3
156a0 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20  ValueNew(db);.  
156b0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
156c0 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
156d0 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53  1, p->zErrMsg, S
156e0 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
156f0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
15700 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
15710 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
15720 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c   db->bBenignMall
15730 6f 63 2d 2d 3b 0a 20 20 20 20 64 62 2d 3e 65 72  oc--;.    db->er
15740 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65  rCode = rc;.  }e
15750 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
15760 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20  Error(db, rc);. 
15770 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
15780 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
15790 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f  _ENABLE_SQLLOG./
157a0 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54  *.** If an SQLIT
157b0 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20  E_CONFIG_SQLLOG 
157c0 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72  hook is register
157d0 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61  ed and the VM ha
157e0 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20  s been run, .** 
157f0 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74  invoke it..*/.st
15800 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e  atic void vdbeIn
15810 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20  vokeSqllog(Vdbe 
15820 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *v){.  if( sqlit
15830 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
15840 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d  Sqllog && v->rc=
15850 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d  =SQLITE_OK && v-
15860 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d  >zSql && v->pc>=
15870 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
15880 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74  Expanded = sqlit
15890 65 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28  e3VdbeExpandSql(
158a0 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20  v, v->zSql);.   
158b0 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e   assert( v->db->
158c0 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a  init.busy==0 );.
158d0 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65      if( zExpande
158e0 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
158f0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
15900 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20  Sqllog(.        
15910 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
15920 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
15930 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64  , v->db, zExpand
15940 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20  ed, 1.      );. 
15950 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
15960 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e  ee(v->db, zExpan
15970 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ded);.    }.  }.
15980 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
15990 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
159a0 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  g(x).#endif../*.
159b0 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44  ** Clean up a VD
159c0 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
159d0 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65  on but do not de
159e0 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75  lete the VDBE ju
159f0 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65  st yet..** Write
15a00 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
15a10 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ges into *pzErrM
15a20 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  sg.  Return the 
15a30 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a  result code..**.
15a40 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
15a50 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68  utine is run, th
15a60 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65  e VDBE should be
15a70 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65   ready to be exe
15a80 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a  cuted.** again..
15a90 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74  **.** To look at
15aa0 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c   it another way,
15ab0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
15ac0 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
15ad0 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  f the.** virtual
15ae0 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44   machine from VD
15af0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20  BE_MAGIC_RUN or 
15b00 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
15b10 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f  back to.** VDBE_
15b20 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69  MAGIC_INIT..*/.i
15b30 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
15b40 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  set(Vdbe *p){.  
15b50 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64  sqlite3 *db;.  d
15b60 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
15b70 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e   If the VM did n
15b80 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  ot run to comple
15b90 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e  tion or if it en
15ba0 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a  countered an.  *
15bb0 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74  * error, then it
15bc0 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
15bd0 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70  been halted prop
15be0 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20  erly.  So halt. 
15bf0 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f   ** it now..  */
15c00 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  .  sqlite3VdbeHa
15c10 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  lt(p);..  /* If 
15c20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
15c30 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
15c40 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
15c50 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
15c60 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
15c70 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
15c80 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
15c90 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
15ca0 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
15cb0 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
15cc0 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
15cd0 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
15ce0 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
15cf0 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
15d00 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
15d10 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
15d20 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
15d30 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
15d40 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
15d50 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
15d60 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
15d70 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
15d80 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
15d90 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(p);.    sqlite
15da0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
15db0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
15dc0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
15dd0 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f   if( p->runOnlyO
15de0 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64  nce ) p->expired
15df0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
15e00 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78  ( p->rc && p->ex
15e10 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  pired ){.    /* 
15e20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67  The expired flag
15e30 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20   was set on the 
15e40 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20  VDBE before the 
15e50 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a  first call.    *
15e60 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  * to sqlite3_ste
15e70 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74  p(). For consist
15e80 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69  ency (since sqli
15e90 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20  te3_step() was. 
15ea0 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73     ** called), s
15eb0 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
15ec0 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61  error in this ca
15ed0 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20  se as well..    
15ee0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
15ef0 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70  rorWithMsg(db, p
15f00 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  ->rc, p->zErrMsg
15f10 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e   ? "%s" : 0, p->
15f20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  zErrMsg);.    sq
15f30 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15f40 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
15f50 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
15f60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61  .  }..  /* Recla
15f70 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73  im all memory us
15f80 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20  ed by the VDBE. 
15f90 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29   */.  Cleanup(p)
15fa0 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  ;..  /* Save pro
15fb0 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
15fc0 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
15fd0 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  E run..  */.#ifd
15fe0 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
15ff0 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75    {.    FILE *ou
16000 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f  t = fopen("vdbe_
16010 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61  profile.out", "a
16020 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20  ");.    if( out 
16030 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
16040 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
16050 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20  t, "---- ");.   
16060 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
16070 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
16080 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
16090 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b   "%02x", p->aOp[
160a0 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20  i].opcode);.    
160b0 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
160c0 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
160d0 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20      if( p->zSql 
160e0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
160f0 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20  c, pc = 0;.     
16100 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
16110 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
16120 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d  for(i=0; (c = p-
16130 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b  >zSql[i])!=0; i+
16140 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
16150 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72  ( pc=='\n' ) fpr
16160 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29  intf(out, "-- ")
16170 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 63  ;.          putc
16180 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  (c, out);.      
16190 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20      pc = c;.    
161a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
161b0 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72  ( pc!='\n' ) fpr
161c0 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
161d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
161e0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
161f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
16200 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a  char zHdr[100];.
16210 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
16220 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
16230 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36  zHdr), zHdr, "%6
16240 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22  u %12llu %8llu "
16250 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
16260 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20  aOp[i].cnt,.    
16270 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
16280 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20  .cycles,.       
16290 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
162a0 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e  t>0 ? p->aOp[i].
162b0 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d  cycles/p->aOp[i]
162c0 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20  .cnt : 0.       
162d0 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   );.        fpri
162e0 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
162f0 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Hdr);.        sq
16300 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
16310 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
16320 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
16330 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
16340 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
16350 66 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54  f.  p->iCurrentT
16360 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61  ime = 0;.  p->ma
16370 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
16380 5f 52 45 53 45 54 3b 0a 20 20 72 65 74 75 72 6e  _RESET;.  return
16390 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72   p->rc & db->err
163a0 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20  Mask;.}. ./*.** 
163b0 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c  Clean up and del
163c0 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72  ete a VDBE after
163d0 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74   execution.  Ret
163e0 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
163f0 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72  hich is.** the r
16400 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69  esult code.  Wri
16410 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
16420 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a  sage text into *
16430 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  pzErrMsg..*/.int
16440 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61   sqlite3VdbeFina
16450 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lize(Vdbe *p){. 
16460 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16470 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  _OK;.  if( p->ma
16480 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
16490 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  RUN || p->magic=
164a0 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
164b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
164c0 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29  ite3VdbeReset(p)
164d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72  ;.    assert( (r
164e0 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61  c & p->db->errMa
164f0 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20  sk)==rc );.  }. 
16500 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
16510 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  te(p);.  return 
16520 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
16530 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73  parameter iOp is
16540 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
16550 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
16560 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a   destructor for.
16570 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79  ** all auxiliary
16580 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63   data pointers c
16590 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20  urrently cached 
165a0 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  by the VM passed
165b0 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   as.** the first
165c0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
165d0 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67   Or, if iOp is g
165e0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
165f0 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
16600 65 6e 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  en the destructo
16610 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76  r is.** only inv
16620 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61  oked for those a
16630 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f  uxiliary data po
16640 69 6e 74 65 72 73 20 63 72 65 61 74 65 64 20 62  inters created b
16650 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66  y the user .** f
16660 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20  unction invoked 
16670 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69  by the OP_Functi
16680 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73  on opcode at ins
16690 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20  truction iOp of 
166a0 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e  .** VM pVdbe, an
166b0 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a  d only then if:.
166c0 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  **.**    * the a
166d0 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69  ssociated functi
166e0 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  on parameter is 
166f0 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65  the 32nd or late
16700 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20  r (counting.**  
16710 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f      from left to
16720 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a   right), or.**.*
16730 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65  *    * the corre
16740 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20  sponding bit in 
16750 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73  argument mask is
16760 20 63 6c 65 61 72 20 28 77 68 65 72 65 20 74 68   clear (where th
16770 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20  e first.**      
16780 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
16790 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  er corresponds t
167a0 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a  o bit 0 etc.)..*
167b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
167c0 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
167d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 75 78  sqlite3 *db, Aux
167e0 44 61 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20 69  Data **pp, int i
167f0 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20  Op, int mask){. 
16800 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20   while( *pp ){. 
16810 20 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78     AuxData *pAux
16820 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20   = *pp;.    if( 
16830 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20  (iOp<0).     || 
16840 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20  (pAux->iOp==iOp 
16850 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33  && (pAux->iArg>3
16860 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41  1 || !(mask & MA
16870 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41  SKBIT32(pAux->iA
16880 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20  rg)))).    ){.  
16890 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41      testcase( pA
168a0 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a  ux->iArg==31 );.
168b0 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e        if( pAux->
168c0 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  xDelete ){.     
168d0 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65     pAux->xDelete
168e0 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20  (pAux->pAux);.  
168f0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20      }.      *pp 
16900 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20  = pAux->pNext;. 
16910 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
16920 65 65 28 64 62 2c 20 70 41 75 78 29 3b 0a 20 20  ee(db, pAux);.  
16930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
16940 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b  p= &pAux->pNext;
16950 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
16960 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  .** Free all mem
16970 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
16980 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73  ith the Vdbe pas
16990 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
169a0 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65  d argument,.** e
169b0 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74  xcept for object
169c0 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69   itself, which i
169d0 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a  s preserved..**.
169e0 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
169f0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
16a00 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69  unction and sqli
16a10 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20  te3VdbeDelete() 
16a20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44  is that.** VdbeD
16a30 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c  elete() also unl
16a40 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72  inks the Vdbe fr
16a50 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56  om the list of V
16a60 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  Ms associated wi
16a70 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  th.** the databa
16a80 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e  se connection an
16a90 64 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65  d frees the obje
16aa0 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f  ct itself..*/.vo
16ab0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  id sqlite3VdbeCl
16ac0 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65  earObject(sqlite
16ad0 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b  3 *db, Vdbe *p){
16ae0 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  .  SubProgram *p
16af0 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61  Sub, *pNext;.  a
16b00 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20  ssert( p->db==0 
16b10 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a  || p->db==db );.
16b20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
16b30 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
16b40 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
16b50 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70  NAME_N);.  for(p
16b60 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b  Sub=p->pProgram;
16b70 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78   pSub; pSub=pNex
16b80 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
16b90 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSub->pNext;.   
16ba0 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
16bb0 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20  (db, pSub->aOp, 
16bc0 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20  pSub->nOp);.    
16bd0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16be0 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 69  , pSub);.  }.  i
16bf0 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
16c00 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a  E_MAGIC_INIT ){.
16c10 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72      releaseMemAr
16c20 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
16c30 6e 56 61 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  nVar);.    sqlit
16c40 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16c50 70 56 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  pVList);.    sql
16c60 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16c70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20  ->pFree);.  }.  
16c80 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
16c90 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e  db, p->aOp, p->n
16ca0 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Op);.  sqlite3Db
16cb0 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
16cc0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
16cd0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53  DbFree(db, p->zS
16ce0 71 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ql);.#ifdef SQLI
16cf0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
16d00 43 41 4e 53 54 41 54 55 53 0a 20 20 7b 0a 20 20  CANSTATUS.  {.  
16d10 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
16d20 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e  (i=0; i<p->nScan
16d30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
16d40 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16d50 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d  p->aScan[i].zNam
16d60 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
16d70 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16d80 70 2d 3e 61 53 63 61 6e 29 3b 0a 20 20 7d 0a 23  p->aScan);.  }.#
16d90 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
16da0 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
16db0 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
16dc0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
16dd0 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
16de0 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
16df0 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
16e00 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  turn;.  db = p->
16e10 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
16e20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16e30 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
16e40 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
16e50 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a  rObject(db, p);.
16e60 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
16e70 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
16e80 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
16e90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
16ea0 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65  ssert( db->pVdbe
16eb0 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70  ==p );.    db->p
16ec0 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
16ed0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
16ee0 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
16ef0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
16f00 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e  pPrev;.  }.  p->
16f10 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
16f20 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62  IC_DEAD;.  p->db
16f30 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
16f40 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
16f50 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  ./*.** The curso
16f60 72 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64  r "p" has a pend
16f70 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69  ing seek operati
16f80 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20  on that has not 
16f90 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72  yet been.** carr
16fa0 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74  ied out.  Seek t
16fb0 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20  he cursor now.  
16fc0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
16fd0 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68  rs, return.** th
16fe0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  e appropriate er
16ff0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
17000 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
17010 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65  OINLINE handleDe
17020 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62  ferredMoveto(Vdb
17030 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
17040 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64  nt res, rc;.#ifd
17050 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
17060 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
17070 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
17080 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
17090 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  t( p->deferredMo
170a0 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  veto );.  assert
170b0 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a  ( p->isTable );.
170c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
170d0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
170e0 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73  TREE );.  rc = s
170f0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
17100 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e  oUnpacked(p->uc.
17110 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
17120 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
17130 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20  &res);.  if( rc 
17140 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
17150 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75  f( res!=0 ) retu
17160 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
17170 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53  T_BKPT;.#ifdef S
17180 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
17190 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
171a0 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d  t++;.#endif.  p-
171b0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
171c0 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53  = 0;.  p->cacheS
171d0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
171e0 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ALE;.  return SQ
171f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17200 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20  * Something has 
17210 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22  moved cursor "p"
17220 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20   out of place.  
17230 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74  Maybe the row it
17240 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20   was.** pointed 
17250 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f  to was deleted o
17260 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74  ut from under it
17270 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20  .  Or maybe the 
17280 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62  btree was.** reb
17290 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76  alanced.  Whatev
172a0 65 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72  er the cause, tr
172b0 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22  y to restore "p"
172c0 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74   to the place it
172d0 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20  .** is supposed 
172e0 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20  to be pointing. 
172f0 20 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20   If the row was 
17300 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
17310 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75   under the.** cu
17320 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75  rsor, set the cu
17330 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
17340 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a   a NULL row..*/.
17350 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
17360 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c  E_NOINLINE handl
17370 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62  eMovedCursor(Vdb
17380 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
17390 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f  nt isDifferentRo
173a0 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  w, rc;.  assert(
173b0 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
173c0 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
173d0 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70   assert( p->uc.p
173e0 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61  Cursor!=0 );.  a
173f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
17400 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
17410 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  d(p->uc.pCursor)
17420 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
17430 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
17440 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73  tore(p->uc.pCurs
17450 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74  or, &isDifferent
17460 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65  Row);.  p->cache
17470 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
17480 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69  TALE;.  if( isDi
17490 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e  fferentRow ) p->
174a0 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72  nullRow = 1;.  r
174b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
174c0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75  ** Check to ensu
174d0 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  re that the curs
174e0 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65  or is valid.  Re
174f0 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
17500 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20  .** if need be. 
17510 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20   Return any I/O 
17520 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72  error from the r
17530 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e  estore operation
17540 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17550 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72  VdbeCursorRestor
17560 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  e(VdbeCursor *p)
17570 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  {.  assert( p->e
17580 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
17590 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20  _BTREE );.  if( 
175a0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
175b0 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63  orHasMoved(p->uc
175c0 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  .pCursor) ){.   
175d0 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f   return handleMo
175e0 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  vedCursor(p);.  
175f0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
17600 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
17610 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72  ake sure the cur
17620 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74  sor p is ready t
17630 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
17640 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68  the row to which
17650 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
17660 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74  positioned.  Ret
17670 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
17680 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  e if an OOM faul
17690 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a  t or I/O error.*
176a0 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  * prevents us fr
176b0 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74  om positioning t
176c0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73  he cursor to its
176d0 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f   correct positio
176e0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f  n..**.** If a Mo
176f0 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69  veTo operation i
17700 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  s pending on the
17710 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74   given cursor, t
17720 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d  hen do that.** M
17730 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e  oveTo now.  If n
17740 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e  o move is pendin
17750 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  g, check to see 
17760 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62  if the row has b
17770 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f  een.** deleted o
17780 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
17790 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20  e cursor and if 
177a0 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65  it has, mark the
177b0 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c   row as.** a NUL
177c0 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  L row..**.** If 
177d0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
177e0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
177f0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f  o the correct ro
17800 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68  w and that row h
17810 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64  as.** not been d
17820 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
17830 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
17840 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
17850 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
17860 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
17870 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56  beCursorMoveto(V
17880 64 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20  dbeCursor **pp, 
17890 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56  int *piCol){.  V
178a0 64 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a  dbeCursor *p = *
178b0 70 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 43 75  pp;.  if( p->eCu
178c0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
178d0 54 52 45 45 20 29 7b 0a 20 20 20 20 69 66 28 20  TREE ){.    if( 
178e0 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
178f0 6f 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  o ){.      int i
17900 4d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Map;.      if( p
17910 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69 4d  ->aAltMap && (iM
17920 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b  ap = p->aAltMap[
17930 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a  1+*piCol])>0 ){.
17940 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d          *pp = p-
17950 3e 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20  >pAltCursor;.   
17960 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d       *piCol = iM
17970 61 70 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  ap - 1;.        
17980 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
179a0 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66  return handleDef
179b0 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a  erredMoveto(p);.
179c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
179d0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
179e0 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70  HasMoved(p->uc.p
179f0 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20  Cursor) ){.     
17a00 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f   return handleMo
17a10 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  vedCursor(p);.  
17a20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17a30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17a40 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
17a50 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
17a60 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
17a70 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
17a80 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17a90 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
17aa0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
17ab0 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
17ac0 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
17ad0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17ae0 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
17af0 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
17b00 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
17b10 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
17b20 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
17b30 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
17b40 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
17b50 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
17b60 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
17b70 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
17b80 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
17b90 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
17ba0 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
17bb0 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
17bc0 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
17bd0 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
17be0 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
17bf0 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
17c00 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
17c10 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
17c20 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
17c30 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
17c40 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
17c50 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
17c60 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
17c70 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
17c80 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
17c90 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
17ca0 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
17cb0 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
17cc0 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
17cd0 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
17ce0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
17cf0 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
17d00 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
17d10 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79   blob separately
17d20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
17d30 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
17d40 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
17d50 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
17d60 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
17d70 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
17d80 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
17d90 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
17da0 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
17db0 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
17dc0 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
17dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
17de0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
17df0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
17e00 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
17e10 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
17e20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
17e30 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
17e40 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
17e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e60 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
17e70 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
17e80 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
17e90 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
17ea0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
17eb0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
17ec0 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
17ed0 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
17ee0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
17ef0 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f10 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
17f20 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17f30 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
17f40 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
17f50 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17f60 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f80 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
17f90 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
17fa0 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
17fb0 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
17fc0 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
17fd0 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
17fe0 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
17ff0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
18000 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
18010 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
18020 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18040 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
18050 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
18060 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
18070 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
18080 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
18090 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
180a0 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
180b0 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
180c0 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
180d0 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
180e0 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
180f0 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
18100 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
18110 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
18120 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
18130 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
18140 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18150 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
18160 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
18170 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
18180 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
18190 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
181a0 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
181b0 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20  t, u32 *pLen){. 
181c0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
181d0 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32 20  m->flags;.  u32 
181e0 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c  n;..  assert( pL
181f0 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66  en!=0 );.  if( f
18200 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
18210 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a  .    *pLen = 0;.
18220 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18230 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
18240 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  M_Int ){.    /* 
18250 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
18260 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
18270 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
18280 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
18290 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
182a0 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32  )0x00008000)<<32
182b0 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
182c0 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
182d0 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69  u64 u;.    if( i
182e0 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20  <0 ){.      u = 
182f0 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ~i;.    }else{. 
18300 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20       u = i;.    
18310 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  }.    if( u<=127
18320 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69   ){.      if( (i
18330 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66  &1)==i && file_f
18340 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20  ormat>=4 ){.    
18350 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20      *pLen = 0;. 
18360 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b         return 8+
18370 28 75 33 32 29 75 3b 0a 20 20 20 20 20 20 7d 65  (u32)u;.      }e
18380 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c  lse{.        *pL
18390 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
183a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
183b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
183c0 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c 65  u<=32767 ){ *pLe
183d0 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e 20 32 3b  n = 2; return 2;
183e0 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33   }.    if( u<=83
183f0 38 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d  88607 ){ *pLen =
18400 20 33 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a   3; return 3; }.
18410 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34      if( u<=21474
18420 38 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d  83647 ){ *pLen =
18430 20 34 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a   4; return 4; }.
18440 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
18450 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  BYTE ){ *pLen = 
18460 36 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20  6; return 5; }. 
18470 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20     *pLen = 8;.  
18480 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
18490 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
184a0 52 65 61 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65  Real ){.    *pLe
184b0 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72  n = 8;.    retur
184c0 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 7;.  }.  asser
184d0 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c  t( pMem->db->mal
184e0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61  locFailed || fla
184f0 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  gs&(MEM_Str|MEM_
18500 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72  Blob) );.  asser
18510 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b  t( pMem->n>=0 );
18520 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d  .  n = (u32)pMem
18530 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ->n;.  if( flags
18540 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
18550 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e     n += pMem->u.
18560 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c  nZero;.  }.  *pL
18570 65 6e 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  en = n;.  return
18580 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28   ((n*2) + 12 + (
18590 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21  (flags&MEM_Str)!
185a0 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  =0));.}../*.** T
185b0 68 65 20 73 69 7a 65 73 20 66 6f 72 20 73 65 72  he sizes for ser
185c0 69 61 6c 20 74 79 70 65 73 20 6c 65 73 73 20 74  ial types less t
185d0 68 61 6e 20 31 32 38 0a 2a 2f 0a 73 74 61 74 69  han 128.*/.stati
185e0 63 20 63 6f 6e 73 74 20 75 38 20 73 71 6c 69 74  c const u8 sqlit
185f0 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
18600 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
18610 2a 20 20 30 20 20 20 31 20 20 20 32 20 20 20 33  *  0   1   2   3
18620 20 20 20 34 20 20 20 35 20 20 20 36 20 20 20 37     4   5   6   7
18630 20 20 20 38 20 20 20 39 20 2a 2f 20 20 20 0a 2f     8   9 */   ./
18640 2a 20 20 20 30 20 2a 2f 20 20 20 30 2c 20 20 31  *   0 */   0,  1
18650 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 36  ,  2,  3,  4,  6
18660 2c 20 20 38 2c 20 20 38 2c 20 20 30 2c 20 20 30  ,  8,  8,  0,  0
18670 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20 20 20 30 2c  ,./*  10 */   0,
18680 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c    0,  0,  0,  1,
18690 20 20 31 2c 20 20 32 2c 20 20 32 2c 20 20 33 2c    1,  2,  2,  3,
186a0 20 20 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20 20    3,./*  20 */  
186b0 20 34 2c 20 20 34 2c 20 20 35 2c 20 20 35 2c 20   4,  4,  5,  5, 
186c0 20 36 2c 20 20 36 2c 20 20 37 2c 20 20 37 2c 20   6,  6,  7,  7, 
186d0 20 38 2c 20 20 38 2c 0a 2f 2a 20 20 33 30 20 2a   8,  8,./*  30 *
186e0 2f 20 20 20 39 2c 20 20 39 2c 20 31 30 2c 20 31  /   9,  9, 10, 1
186f0 30 2c 20 31 31 2c 20 31 31 2c 20 31 32 2c 20 31  0, 11, 11, 12, 1
18700 32 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a 20 20 34  2, 13, 13,./*  4
18710 30 20 2a 2f 20 20 31 34 2c 20 31 34 2c 20 31 35  0 */  14, 14, 15
18720 2c 20 31 35 2c 20 31 36 2c 20 31 36 2c 20 31 37  , 15, 16, 16, 17
18730 2c 20 31 37 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a  , 17, 18, 18,./*
18740 20 20 35 30 20 2a 2f 20 20 31 39 2c 20 31 39 2c    50 */  19, 19,
18750 20 32 30 2c 20 32 30 2c 20 32 31 2c 20 32 31 2c   20, 20, 21, 21,
18760 20 32 32 2c 20 32 32 2c 20 32 33 2c 20 32 33 2c   22, 22, 23, 23,
18770 0a 2f 2a 20 20 36 30 20 2a 2f 20 20 32 34 2c 20  ./*  60 */  24, 
18780 32 34 2c 20 32 35 2c 20 32 35 2c 20 32 36 2c 20  24, 25, 25, 26, 
18790 32 36 2c 20 32 37 2c 20 32 37 2c 20 32 38 2c 20  26, 27, 27, 28, 
187a0 32 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20 20 32  28,./*  70 */  2
187b0 39 2c 20 32 39 2c 20 33 30 2c 20 33 30 2c 20 33  9, 29, 30, 30, 3
187c0 31 2c 20 33 31 2c 20 33 32 2c 20 33 32 2c 20 33  1, 31, 32, 32, 3
187d0 33 2c 20 33 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f  3, 33,./*  80 */
187e0 20 20 33 34 2c 20 33 34 2c 20 33 35 2c 20 33 35    34, 34, 35, 35
187f0 2c 20 33 36 2c 20 33 36 2c 20 33 37 2c 20 33 37  , 36, 36, 37, 37
18800 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a 20 20 39 30  , 38, 38,./*  90
18810 20 2a 2f 20 20 33 39 2c 20 33 39 2c 20 34 30 2c   */  39, 39, 40,
18820 20 34 30 2c 20 34 31 2c 20 34 31 2c 20 34 32 2c   40, 41, 41, 42,
18830 20 34 32 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a 20   42, 43, 43,./* 
18840 31 30 30 20 2a 2f 20 20 34 34 2c 20 34 34 2c 20  100 */  44, 44, 
18850 34 35 2c 20 34 35 2c 20 34 36 2c 20 34 36 2c 20  45, 45, 46, 46, 
18860 34 37 2c 20 34 37 2c 20 34 38 2c 20 34 38 2c 0a  47, 47, 48, 48,.
18870 2f 2a 20 31 31 30 20 2a 2f 20 20 34 39 2c 20 34  /* 110 */  49, 4
18880 39 2c 20 35 30 2c 20 35 30 2c 20 35 31 2c 20 35  9, 50, 50, 51, 5
18890 31 2c 20 35 32 2c 20 35 32 2c 20 35 33 2c 20 35  1, 52, 52, 53, 5
188a0 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20 20 35 34  3,./* 120 */  54
188b0 2c 20 35 34 2c 20 35 35 2c 20 35 35 2c 20 35 36  , 54, 55, 55, 56
188c0 2c 20 35 36 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a  , 56, 57, 57.};.
188d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
188e0 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
188f0 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
18900 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
18910 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
18920 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
18930 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
18940 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
18950 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
18960 79 70 65 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20  ype>=128 ){.    
18970 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
18980 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c  ype-12)/2;.  }el
18990 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
189a0 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 0a  serial_type<12 .
189b0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
189c0 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
189d0 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
189e0 5d 3d 3d 28 73 65 72 69 61 6c 5f 74 79 70 65 20  ]==(serial_type 
189f0 2d 20 31 32 29 2f 32 20 29 3b 0a 20 20 20 20 72  - 12)/2 );.    r
18a00 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61  eturn sqlite3Sma
18a10 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
18a20 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
18a30 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 4f 6e  u8 sqlite3VdbeOn
18a40 65 42 79 74 65 53 65 72 69 61 6c 54 79 70 65 4c  eByteSerialTypeL
18a50 65 6e 28 75 38 20 73 65 72 69 61 6c 5f 74 79 70  en(u8 serial_typ
18a60 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 65  e){.  assert( se
18a70 72 69 61 6c 5f 74 79 70 65 3c 31 32 38 20 29 3b  rial_type<128 );
18a80 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
18a90 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
18aa0 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 20 20 0a  serial_type];  .
18ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
18ac0 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
18ad0 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
18ae0 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
18af0 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
18b00 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
18b10 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
18b20 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
18b30 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
18b40 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
18b50 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
18b60 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
18b70 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
18b80 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
18b90 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
18ba0 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
18bb0 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
18bc0 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
18bd0 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
18be0 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
18bf0 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
18c00 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
18c10 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
18c20 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
18c30 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
18c40 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
18c50 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
18c60 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
18c70 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
18c80 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
18c90 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
18ca0 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
18cb0 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
18cc0 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
18cd0 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
18ce0 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
18cf0 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
18d00 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
18d10 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
18d20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
18d30 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
18d40 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
18d50 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
18d60 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
18d70 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
18d80 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
18d90 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
18da0 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
18db0 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
18dc0 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
18dd0 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
18de0 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
18df0 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
18e00 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
18e10 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
18e20 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
18e30 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
18e40 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
18e50 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
18e60 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
18e70 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
18e80 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
18e90 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
18ea0 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
18eb0 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
18ec0 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
18ed0 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
18ee0 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
18ef0 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
18f00 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
18f10 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
18f20 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
18f30 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
18f40 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
18f50 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
18f60 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
18f70 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
18f80 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
18f90 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
18fa0 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
18fb0 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
18fc0 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
18fd0 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
18fe0 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
18ff0 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
19000 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
19010 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
19020 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
19030 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
19040 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
19050 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
19060 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
19070 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
19080 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
19090 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
190a0 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
190b0 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
190c0 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
190d0 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
190e0 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
190f0 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
19100 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
19110 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
19120 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
19130 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
19140 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
19150 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
19160 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
19170 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
19180 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
19190 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
191a0 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
191b0 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
191c0 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
191d0 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
191e0 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
191f0 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
19200 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
19210 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
19220 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
19230 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
19240 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
19250 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
19260 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
19270 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
19280 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
19290 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
192a0 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
192b0 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
192c0 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
192d0 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
192e0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
192f0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
19300 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
19310 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
19320 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
19330 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
19340 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63  in buf[].  The c
19350 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
19360 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f  ible.** for allo
19370 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70  cating enough sp
19380 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20  ace to buf[] to 
19390 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
193a0 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65  field, exclusive
193b0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d  .** of the pMem-
193c0 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66  >u.nZero bytes f
193d0 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61  or a MEM_Zero va
193e0 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lue..**.** Retur
193f0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
19400 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77  bytes actually w
19410 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b  ritten into buf[
19420 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  ].  The number.*
19430 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  * of bytes in th
19440 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
19450 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  il is included i
19460 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
19470 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  ue only.** if th
19480 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a  ose bytes were z
19490 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a  eroed in buf[]..
194a0 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
194b0 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20  dbeSerialPut(u8 
194c0 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  *buf, Mem *pMem,
194d0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
194e0 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20  ){.  u32 len;.. 
194f0 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
19500 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
19510 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20  rial_type<=7 && 
19520 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b  serial_type>0 ){
19530 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20  .    u64 v;.    
19540 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73  u32 i;.    if( s
19550 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
19560 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
19570 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66  izeof(v)==sizeof
19580 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20  (pMem->u.r) );. 
19590 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
195a0 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65  &pMem->u.r, size
195b0 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77  of(v));.      sw
195c0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
195d0 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  at(v);.    }else
195e0 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d  {.      v = pMem
195f0 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20  ->u.i;.    }.   
19600 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74   len = i = sqlit
19610 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
19620 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
19630 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
19640 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
19650 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28  buf[--i] = (u8)(
19660 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76  v&0xFF);.      v
19670 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69   >>= 8;.    }whi
19680 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74  le( i );.    ret
19690 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
196a0 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
196b0 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
196c0 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
196d0 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
196e0 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
196f0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
19700 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20  em->u.nZero:0). 
19710 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28              == (
19720 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53  int)sqlite3VdbeS
19730 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
19740 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20  ial_type) );.   
19750 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
19760 20 20 20 20 69 66 28 20 6c 65 6e 3e 30 20 29 20      if( len>0 ) 
19770 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d  memcpy(buf, pMem
19780 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72  ->z, len);.    r
19790 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
197a0 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e    /* NULL or con
197b0 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f  stants 0 or 1 */
197c0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
197d0 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73 20  /* Input "x" is 
197e0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e  a sequence of un
197f0 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72  signed character
19800 73 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  s that represent
19810 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e   a.** big-endian
19820 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72   integer.  Retur
19830 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  n the equivalent
19840 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a   native integer.
19850 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42  */.#define ONE_B
19860 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28  YTE_INT(x)    ((
19870 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69  i8)(x)[0]).#defi
19880 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  ne TWO_BYTE_INT(
19890 78 29 20 20 20 20 28 32 35 36 2a 28 69 38 29 28  x)    (256*(i8)(
198a0 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a  (x)[0])|(x)[1]).
198b0 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59  #define THREE_BY
198c0 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33  TE_INT(x)  (6553
198d0 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
198e0 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32  (x)[1]<<8)|(x)[2
198f0 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f  ]).#define FOUR_
19900 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28  BYTE_UINT(x)  ((
19910 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29  (u32)(x)[0]<<24)
19920 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28  |((x)[1]<<16)|((
19930 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d  x)[2]<<8)|(x)[3]
19940 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42  ).#define FOUR_B
19950 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37  YTE_INT(x) (1677
19960 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  7216*(i8)((x)[0]
19970 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28  )|((x)[1]<<16)|(
19980 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33  (x)[2]<<8)|(x)[3
19990 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69  ])../*.** Deseri
199a0 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62  alize the data b
199b0 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lob pointed to b
199c0 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20  y buf as serial 
199d0 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65  type serial_type
199e0 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
199f0 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d  e result in pMem
19a00 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
19a10 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
19a20 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ad..**.** This f
19a30 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  unction is imple
19a40 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65  mented as two se
19a50 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20  parate routines 
19a60 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  for performance.
19a70 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73 65  .** The few case
19a80 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c  s that require l
19a90 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61  ocal variables a
19aa0 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e  re broken out in
19ab0 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a  to a separate.**
19ac0 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74   routine so that
19ad0 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74   in most cases t
19ae0 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d  he overhead of m
19af0 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20  oving the stack 
19b00 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76  pointer.** is av
19b10 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69  oided..*/ .stati
19b20 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49  c u32 SQLITE_NOI
19b30 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28  NLINE serialGet(
19b40 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
19b50 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
19b60 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
19b70 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
19b80 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
19b90 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
19ba0 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
19bb0 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
19bc0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
19bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19be0 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
19bf0 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
19c00 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36   into */.){.  u6
19c10 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  4 x = FOUR_BYTE_
19c20 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32  UINT(buf);.  u32
19c30 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
19c40 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20  INT(buf+4);.  x 
19c50 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20  = (x<<32) + y;. 
19c60 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
19c70 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ==6 ){.    /* EV
19c80 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38  IDENCE-OF: R-298
19c90 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20 69  51-52272 Value i
19ca0 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 36  s a big-endian 6
19cb0 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f  4-bit.    ** two
19cc0 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
19cd0 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65  eger. */.    pMe
19ce0 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
19cf0 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  &x;.    pMem->fl
19d00 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
19d10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
19d20 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65  m->u.i<0 );.  }e
19d30 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
19d40 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33  ENCE-OF: R-57343
19d50 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69 73 20  -49114 Value is 
19d60 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45 45  a big-endian IEE
19d70 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62 69  E 754-2008 64-bi
19d80 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e  t.    ** floatin
19d90 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20  g point number. 
19da0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
19db0 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
19dc0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
19dd0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
19de0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
19df0 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  at integers and 
19e00 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
19e10 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61  alues use the sa
19e20 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f  me.    ** byte o
19e30 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20  rder.  Or, that 
19e40 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  if SQLITE_MIXED_
19e50 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
19e60 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66  AT is.    ** def
19e70 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74  ined that 64-bit
19e80 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
19e90 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72  values really ar
19ea0 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65  e mixed.    ** e
19eb0 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ndian..    */.  
19ec0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
19ed0 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
19ee0 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
19ef0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
19f00 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b  double r1 = 1.0;
19f10 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31  .    u64 t2 = t1
19f20 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45  ;.    swapMixedE
19f30 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a  ndianFloat(t2);.
19f40 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
19f50 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74  of(r1)==sizeof(t
19f60 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31  2) && memcmp(&r1
19f70 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31  , &t2, sizeof(r1
19f80 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ))==0 );.#endif.
19f90 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
19fa0 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65  of(x)==8 && size
19fb0 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38  of(pMem->u.r)==8
19fc0 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65   );.    swapMixe
19fd0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b  dEndianFloat(x);
19fe0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65  .    memcpy(&pMe
19ff0 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65  m->u.r, &x, size
1a000 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d  of(x));.    pMem
1a010 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  ->flags = sqlite
1a020 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72  3IsNaN(pMem->u.r
1a030 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d  ) ? MEM_Null : M
1a040 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72  EM_Real;.  }.  r
1a050 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73  eturn 8;.}.u32 s
1a060 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1a070 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
1a080 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
1a090 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
1a0a0 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
1a0b0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
1a0c0 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
1a0d0 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
1a0e0 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
1a0f0 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
1a100 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
1a110 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
1a120 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
1a130 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
1a140 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
1a150 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
1a160 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 10:   /* Reser
1a170 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
1a180 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31  se */.    case 1
1a190 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  1:   /* Reserved
1a1a0 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
1a1b0 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b  */.    case 0: {
1a1c0 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20    /* Null */.   
1a1d0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a1e0 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35  F: R-24078-09375
1a1f0 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c   Value is a NULL
1a200 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1a210 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
1a220 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
1a230 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
1a240 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
1a250 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38  DENCE-OF: R-4488
1a260 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69 73  5-25196 Value is
1a270 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63   an 8-bit twos-c
1a280 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20  omplement.      
1a290 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  ** integer. */. 
1a2a0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1a2b0 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75   ONE_BYTE_INT(bu
1a2c0 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1a2d0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1a2e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a2f0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1a300 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1a310 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
1a320 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
1a330 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1a340 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1a350 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35  E-OF: R-49794-35
1a360 30 32 36 20 56 61 6c 75 65 20 69 73 20 61 20 62  026 Value is a b
1a370 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74  ig-endian 16-bit
1a380 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1a390 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1a3a0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1a3b0 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45  ->u.i = TWO_BYTE
1a3c0 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
1a3d0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1a3e0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
1a3f0 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
1a400 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
1a410 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
1a420 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
1a430 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1a440 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ger */.      /* 
1a450 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
1a460 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65  7839-54301 Value
1a470 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
1a480 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   24-bit.      **
1a490 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
1a4a0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
1a4b0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54     pMem->u.i = T
1a4c0 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75  HREE_BYTE_INT(bu
1a4d0 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1a4e0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1a4f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a500 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1a510 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
1a520 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
1a530 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
1a540 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1a550 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1a560 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36  E-OF: R-01849-26
1a570 30 37 39 20 56 61 6c 75 65 20 69 73 20 61 20 62  079 Value is a b
1a580 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74  ig-endian 32-bit
1a590 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1a5a0 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1a5b0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1a5c0 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54  ->u.i = FOUR_BYT
1a5d0 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66 64  E_INT(buf);.#ifd
1a5e0 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20  ef __HP_cc .    
1a5f0 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64    /* Work around
1a600 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f   a sign-extensio
1a610 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48 50 20  n bug in the HP 
1a620 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50 2f  compiler for HP/
1a630 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  UX */.      if( 
1a640 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70 4d  buf[0]&0x80 ) pM
1a650 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66  em->u.i |= 0xfff
1a660 66 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c 3b  fffff80000000LL;
1a670 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4d  .#endif.      pM
1a680 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1a690 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1a6a0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1a6b0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1a6c0 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   4;.    }.    ca
1a6d0 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
1a6e0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1a6f0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1a700 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38  DENCE-OF: R-5038
1a710 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69 73  5-09674 Value is
1a720 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38   a big-endian 48
1a730 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
1a740 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
1a750 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1a760 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
1a770 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32  _BYTE_UINT(buf+2
1a780 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1a790 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1a7a0 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1a7b0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1a7c0 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1a7d0 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1a7e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
1a7f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a800 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
1a810 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1a820 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
1a830 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
1a840 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
1a850 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63  /* These use loc
1a860 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f  al variables, so
1a870 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65   do them in a se
1a880 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20  parate routine. 
1a890 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64       ** to avoid
1a8a0 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20   having to move 
1a8b0 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65  the frame pointe
1a8c0 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  r in the common 
1a8d0 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  case */.      re
1a8e0 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62  turn serialGet(b
1a8f0 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70  uf,serial_type,p
1a900 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mem);.    }.    
1a910 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e  case 8:    /* In
1a920 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63  teger 0 */.    c
1a930 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74  ase 9: {  /* Int
1a940 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20  eger 1 */.      
1a950 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a960 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56 61  R-12976-22893 Va
1a970 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67  lue is the integ
1a980 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  er 0. */.      /
1a990 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a9a0 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c  -18143-12121 Val
1a9b0 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65  ue is the intege
1a9c0 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  r 1. */.      pM
1a9d0 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c  em->u.i = serial
1a9e0 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
1a9f0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1aa00 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
1aa10 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1aa20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1aa30 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1aa40 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56   R-14606-31564 V
1aa50 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74  alue is a BLOB t
1aa60 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20  hat is (N-12)/2 
1aa70 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a  bytes in.      *
1aa80 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20  * length..      
1aa90 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
1aaa0 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56 61  R-28401-00140 Va
1aab0 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  lue is a string 
1aac0 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f  in the text enco
1aad0 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a  ding and.      *
1aae0 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73  * (N-13)/2 bytes
1aaf0 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20   in length. */. 
1ab00 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
1ab10 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20  t u16 aFlag[] = 
1ab20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45  { MEM_Blob|MEM_E
1ab30 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45  phem, MEM_Str|ME
1ab40 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20  M_Ephem };.     
1ab50 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
1ab60 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
1ab70 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em->n = (serial_
1ab80 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
1ab90 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1aba0 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70  aFlag[serial_typ
1abb0 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75  e&1];.      retu
1abc0 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20  rn pMem->n;.    
1abd0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1abe0 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ;.}./*.** This r
1abf0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
1ac00 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69  o allocate suffi
1ac10 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20  cient space for 
1ac20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  an UnpackedRecor
1ac30 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c  d.** structure l
1ac40 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62  arge enough to b
1ac50 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69  e used with sqli
1ac60 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1ac70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20  ack() if.** the 
1ac80 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1ac90 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b  s a pointer to K
1aca0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1acb0 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a   pKeyInfo..**.**
1acc0 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69   The space is ei
1acd0 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75  ther allocated u
1ace0 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61  sing sqlite3DbMa
1acf0 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f  llocRaw() or fro
1ad00 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20  m within.** the 
1ad10 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72  unaligned buffer
1ad20 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20   passed via the 
1ad30 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64  second and third
1ad40 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73   arguments (pres
1ad50 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20  umably.** stack 
1ad60 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66  space). If the f
1ad70 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46  ormer, then *ppF
1ad80 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20  ree is set to a 
1ad90 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f  pointer that sho
1ada0 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75  uld.** be eventu
1adb0 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68  ally freed by th
1adc0 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
1add0 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20  qlite3DbFree(). 
1ade0 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61  Or, if the .** a
1adf0 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20  llocation comes 
1ae00 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f  from the pSpace/
1ae10 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20  szSpace buffer, 
1ae20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
1ae30 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65  o NULL.** before
1ae40 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
1ae50 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
1ae60 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
1ae70 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55  s returned..*/.U
1ae80 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73  npackedRecord *s
1ae90 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
1aea0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20  npackedRecord(. 
1aeb0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1aec0 66 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  fo              
1aed0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1aee0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  of the record */
1aef0 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  .){.  UnpackedRe
1af00 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20  cord *p;        
1af10 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
1af20 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75  d record to retu
1af30 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  rn */.  int nByt
1af40 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1af50 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1af60 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
1af70 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 20 20  red for *p */.  
1af80 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
1af90 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
1afa0 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28  cord)) + sizeof(
1afb0 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e  Mem)*(pKeyInfo->
1afc0 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d  nField+1);.  p =
1afd0 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
1afe0 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
1aff0 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e  ocRaw(pKeyInfo->
1b000 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66  db, nByte);.  if
1b010 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ( !p ) return 0;
1b020 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65  .  p->aMem = (Me
1b030 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52  m*)&((char*)p)[R
1b040 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70  OUND8(sizeof(Unp
1b050 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a  ackedRecord))];.
1b060 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1b070 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1b080 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e  0 );.  p->pKeyIn
1b090 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
1b0a0 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65   p->nField = pKe
1b0b0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
1b0c0 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  1;.  return p;.}
1b0d0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
1b0e0 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
1b0f0 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
1b100 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75   in pKey[], popu
1b110 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70  late the .** Unp
1b120 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
1b130 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20  cture indicated 
1b140 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72  by the fourth ar
1b150 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a  gument with the.
1b160 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1b170 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72  he decoded recor
1b180 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  d..*/ .void sqli
1b190 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1b1a0 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ack(.  KeyInfo *
1b1b0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a  pKeyInfo,     /*
1b1c0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
1b1d0 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  ut the record fo
1b1e0 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rmat */.  int nK
1b1f0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
1b200 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1b210 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
1b220 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1b230 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
1b240 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
1b250 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1b260 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f  rd *p      /* Po
1b270 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75  pulate this stru
1b280 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74  cture before ret
1b290 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20  urning. */.){.  
1b2a0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1b2b0 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
1b2c0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1b2d0 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64   *)pKey;.  int d
1b2e0 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20  ; .  u32 idx;   
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b300 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1b310 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64  n aKey[] to read
1b320 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75   from */.  u16 u
1b330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1b350 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1b360 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ter */.  u32 szH
1b370 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  dr;.  Mem *pMem 
1b380 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d  = p->aMem;..  p-
1b390 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b  >default_rc = 0;
1b3a0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
1b3b0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
1b3c0 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d  pMem) );.  idx =
1b3d0 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1b3e0 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d  y, szHdr);.  d =
1b3f0 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b   szHdr;.  u = 0;
1b400 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
1b410 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29  Hdr && d<=nKey )
1b420 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1b430 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20  _type;..    idx 
1b440 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
1b450 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61  aKey[idx], seria
1b460 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65  l_type);.    pMe
1b470 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m->enc = pKeyInf
1b480 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d  o->enc;.    pMem
1b490 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ->db = pKeyInfo-
1b4a0 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d  >db;.    /* pMem
1b4b0 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20  ->flags = 0; // 
1b4c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1b4d0 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20  lGet() will set 
1b4e0 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20  this for us */. 
1b4f0 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f     pMem->szMallo
1b500 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d  c = 0;.    pMem-
1b510 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  >z = 0;.    d +=
1b520 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1b530 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
1b540 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
1b550 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
1b560 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70      if( (++u)>=p
1b570 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b  ->nField ) break
1b580 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1b590 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  u<=pKeyInfo->nFi
1b5a0 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e  eld + 1 );.  p->
1b5b0 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23  nField = u;.}..#
1b5c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1b5d0 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  UG./*.** This fu
1b5e0 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
1b5f0 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62  two index or tab
1b600 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69  le record keys i
1b610 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a  n the same way.*
1b620 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33  * as the sqlite3
1b630 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1b640 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c  e() routine. Unl
1b650 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ike VdbeRecordCo
1b660 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73  mpare(),.** this
1b670 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69   function deseri
1b680 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61  alizes and compa
1b690 72 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67  res values using
1b6a0 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56   the.** sqlite3V
1b6b0 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61  dbeSerialGet() a
1b6c0 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  nd sqlite3MemCom
1b6d0 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73  pare() functions
1b6e0 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20  . It is used.** 
1b6f0 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1b700 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65  ements to ensure
1b710 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69   that the optimi
1b720 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73  zed code in.** s
1b730 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1b740 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e  Compare() return
1b750 73 20 72 65 73 75 6c 74 73 20 77 69 74 68 20 74  s results with t
1b760 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69  hese two primiti
1b770 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ves..**.** Retur
1b780 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65  n true if the re
1b790 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73  sult of comparis
1b7a0 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  on is equivalent
1b7b0 20 74 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c   to desiredResul
1b7c0 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c  t..** Return fal
1b7d0 73 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  se if there is a
1b7e0 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a   disagreement..*
1b7f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1b800 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1b810 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  bug(.  int nKey1
1b820 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1b830 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
1b840 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61   */.  const Unpa
1b850 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1b860 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79  y2, /* Right key
1b870 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65   */.  int desire
1b880 64 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20  dResult         
1b890 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61      /* Correct a
1b8a0 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33  nswer */.){.  u3
1b8b0 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  2 d1;           
1b8c0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
1b8d0 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
1b8e0 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
1b8f0 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
1b900 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1b910 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
1b920 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
1b930 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
1b940 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1b950 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68  er of bytes in h
1b960 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  eader */.  int i
1b970 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
1b980 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   0;.  const unsi
1b990 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
1b9a0 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1b9b0 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
1b9c0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1b9d0 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31  Info;.  Mem mem1
1b9e0 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  ;..  pKeyInfo = 
1b9f0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1ba00 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
1ba10 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  ->db==0 ) return
1ba20 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d   1;.  mem1.enc =
1ba30 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
1ba40 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
1ba50 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d  Info->db;.  /* m
1ba60 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20  em1.flags = 0;  
1ba70 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69  // Will be initi
1ba80 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alized by sqlite
1ba90 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
1baa0 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20   */.  VVA_ONLY( 
1bab0 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20  mem1.szMalloc = 
1bac0 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  0; ) /* Only nee
1bad0 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20  ded by assert() 
1bae0 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20  statements */.. 
1baf0 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61   /* Compilers ma
1bb00 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20  y complain that 
1bb10 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65  mem1.u.i is pote
1bb20 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61  ntially uninitia
1bb30 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63  lized..  ** We c
1bb40 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20  ould initialize 
1bb50 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72  it, as shown her
1bb60 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68  e, to silence th
1bb70 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a  ose complaints..
1bb80 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74    ** But in fact
1bb90 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20  , mem1.u.i will 
1bba0 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62  never actually b
1bbb0 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c  e used uninitial
1bbc0 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20  ized, and doing 
1bbd0 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65  .  ** the unnece
1bbe0 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61  ssary initializa
1bbf0 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75  tion has a measu
1bc00 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70  rable negative p
1bc10 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20  erformance.  ** 
1bc20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68  impact, since th
1bc30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1bc40 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72  very high runner
1bc50 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68  .  And so, we ch
1bc60 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e  oose.  ** to ign
1bc70 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ore the compiler
1bc80 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65   warnings and le
1bc90 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c  ave this variabl
1bca0 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  e uninitialized.
1bcb0 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31  .  */.  /*  mem1
1bcc0 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f  .u.i = 0;  // no
1bcd0 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74  t needed, here t
1bce0 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c  o silence compil
1bcf0 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20  er warning */.  
1bd00 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72  .  idx1 = getVar
1bd10 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
1bd20 64 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48 64  dr1);.  if( szHd
1bd30 72 31 3e 39 38 33 30 37 20 29 20 72 65 74 75 72  r1>98307 ) retur
1bd40 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1bd50 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
1bd60 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
1bd70 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79  nfo->nField+pKey
1bd80 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70  Info->nXField>=p
1bd90 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c  PKey2->nField ||
1bda0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1bdb0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1bdc0 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
1bdd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
1bde0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30  eyInfo->nField>0
1bdf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
1be00 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f  x1<=szHdr1 || CO
1be10 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f  RRUPT_DB );.  do
1be20 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
1be30 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20  _type1;..    /* 
1be40 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20  Read the serial 
1be50 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65  types for the ne
1be60 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61  xt element in ea
1be70 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69  ch key. */.    i
1be80 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  dx1 += getVarint
1be90 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20  32( aKey1+idx1, 
1bea0 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a  serial_type1 );.
1beb0 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
1bec0 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f  hat there is eno
1bed0 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72 65  ugh key space re
1bee0 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64  maining to avoid
1bef0 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72  .    ** a buffer
1bf00 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65 20   overread.  The 
1bf10 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31  "d1+serial_type1
1bf20 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69 6f  +2" subexpressio
1bf30 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c  n will.    ** al
1bf40 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72 20  ways be greater 
1bf50 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1bf60 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72   the amount of r
1bf70 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61 63  equired key spac
1bf80 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68  e..    ** Use th
1bf90 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e  at approximation
1bfa0 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f   to avoid the mo
1bfb0 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c  re expensive cal
1bfc0 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
1bfd0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1bfe0 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f  eLen() in the co
1bff0 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a  mmon case..    *
1c000 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65 72  /.    if( d1+ser
1c010 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32  ial_type1+2>(u32
1c020 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64  )nKey1.     && d
1c030 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  1+sqlite3VdbeSer
1c040 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
1c050 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b  l_type1)>(u32)nK
1c060 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ey1 .    ){.    
1c070 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1c080 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
1c090 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
1c0a0 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
1c0b0 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
1c0c0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1c0d0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
1c0e0 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
1c0f0 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  ;..    /* Do the
1c100 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
1c110 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1c120 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d  te3MemCompare(&m
1c130 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d  em1, &pPKey2->aM
1c140 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d  em[i], pKeyInfo-
1c150 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  >aColl[i]);.    
1c160 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1c170 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e     assert( mem1.
1c180 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20  szMalloc==0 );  
1c190 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62  /* See comment b
1c1a0 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66  elow */.      if
1c1b0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1c1c0 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
1c1d0 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20       rc = -rc;  
1c1e0 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 65  /* Invert the re
1c1f0 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f  sult for DESC so
1c200 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20  rt order. */.   
1c210 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1c220 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b  debugCompareEnd;
1c230 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a  .    }.    i++;.
1c240 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73    }while( idx1<s
1c250 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79  zHdr1 && i<pPKey
1c260 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20  2->nField );..  
1c270 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
1c280 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
1c290 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
1c2a0 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
1c2b0 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
1c2c0 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
1c2d0 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
1c2e0 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
1c2f0 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
1c300 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
1c310 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
1c320 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1c330 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  em1)..  */.  ass
1c340 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1c350 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72  oc==0 );..  /* r
1c360 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20  c==0 here means 
1c370 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
1c380 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
1c390 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
1c3a0 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
1c3b0 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
1c3c0 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75  were equal. Retu
1c3d0 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72  rn the default_r
1c3e0 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a  c.  ** value.  *
1c3f0 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d  /.  rc = pPKey2-
1c400 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65  >default_rc;..de
1c410 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20  bugCompareEnd:. 
1c420 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75   if( desiredResu
1c430 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20 29  lt==0 && rc==0 )
1c440 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1c450 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c 30   desiredResult<0
1c460 20 26 26 20 72 63 3c 30 20 29 20 72 65 74 75 72   && rc<0 ) retur
1c470 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72  n 1;.  if( desir
1c480 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72 63  edResult>0 && rc
1c490 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  >0 ) return 1;. 
1c4a0 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20   if( CORRUPT_DB 
1c4b0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1c4c0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e  ( pKeyInfo->db->
1c4d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
1c4e0 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
1c4f0 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  n 0;.}.#endif..#
1c500 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1c510 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  UG./*.** Count t
1c520 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  he number of fie
1c530 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75  lds (a.k.a. colu
1c540 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f  mns) in the reco
1c550 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70  rd given by.** p
1c560 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76  Key,nKey.  The v
1c570 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
1c580 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68  count is less th
1c590 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1c5a0 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65  he.** limit give
1c5b0 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  n by pKeyInfo->n
1c5c0 46 69 65 6c 64 20 2b 20 70 4b 65 79 49 6e 66 6f  Field + pKeyInfo
1c5d0 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  ->nXField..**.**
1c5e0 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61   If this constra
1c5f0 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73  int is not satis
1c600 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74  fied, it means t
1c610 68 61 74 20 74 68 65 20 68 69 67 68 2d 73 70 65  hat the high-spe
1c620 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 64  ed.** vdbeRecord
1c630 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64  CompareInt() and
1c640 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1c650 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75 74 69  reString() routi
1c660 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20  nes will.** not 
1c670 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20  work correctly. 
1c680 20 49 66 20 74 68 69 73 20 61 73 73 65 72 74 28   If this assert(
1c690 29 20 65 76 65 72 20 66 69 72 65 73 2c 20 69 74  ) ever fires, it
1c6a0 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a   probably means.
1c6b0 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65 79 49  ** that the KeyI
1c6c0 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f 72 20 4b 65  nfo.nField or Ke
1c6d0 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 76 61  yInfo.nXField va
1c6e0 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74  lues were comput
1c6f0 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  ed.** incorrectl
1c700 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
1c710 64 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c  d vdbeAssertFiel
1c720 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
1c730 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20  ts(.  int nKey, 
1c740 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1c750 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72  ,   /* The recor
1c760 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a  d to verify */ .
1c770 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20    const KeyInfo 
1c780 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20  *pKeyInfo       
1c790 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20  /* Compare size 
1c7a0 77 69 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66  with this KeyInf
1c7b0 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46  o */.){.  int nF
1c7c0 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20  ield = 0;.  u32 
1c7d0 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78  szHdr;.  u32 idx
1c7e0 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  ;.  u32 notUsed;
1c7f0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1c800 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
1c810 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1c820 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66  har*)pKey;..  if
1c830 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
1c840 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67  eturn;.  idx = g
1c850 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
1c860 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72   szHdr);.  asser
1c870 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20  t( nKey>=0 );.  
1c880 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28  assert( szHdr<=(
1c890 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68  u32)nKey );.  wh
1c8a0 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29  ile( idx<szHdr )
1c8b0 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  {.    idx += get
1c8c0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64  Varint32(aKey+id
1c8d0 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20  x, notUsed);.   
1c8e0 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20   nField++;.  }. 
1c8f0 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20   assert( nField 
1c900 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  <= pKeyInfo->nFi
1c910 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  eld+pKeyInfo->nX
1c920 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  Field );.}.#else
1c930 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 41 73  .# define vdbeAs
1c940 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
1c950 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43  thinLimits(A,B,C
1c960 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1c970 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20  Both *pMem1 and 
1c980 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73  *pMem2 contain s
1c990 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f  tring values. Co
1c9a0 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20 76 61  mpare the two va
1c9b0 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68  lues.** using th
1c9c0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1c9d0 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75  ence pColl. As u
1c9e0 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e  sual, return a n
1c9f0 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a  egative , zero.*
1ca00 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61  * or positive va
1ca10 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73  lue if *pMem1 is
1ca20 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1ca30 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20  l to or greater 
1ca40 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c  than .** *pMem2,
1ca50 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53   respectively. S
1ca60 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74  imilar in spirit
1ca70 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d   to "rc = (*pMem
1ca80 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e  1) - (*pMem2);".
1ca90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1caa0 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1cab0 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  ing(.  const Mem
1cac0 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74   *pMem1,.  const
1cad0 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63   Mem *pMem2,.  c
1cae0 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
1caf0 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72  oll,.  u8 *prcEr
1cb00 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1cb10 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
1cb20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20  OOM occurs, set 
1cb30 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
1cb40 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d  */.){.  if( pMem
1cb50 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65  1->enc==pColl->e
1cb60 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  nc ){.    /* The
1cb70 20 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72   strings are alr
1cb80 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72  eady in the corr
1cb90 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43  ect encoding.  C
1cba0 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20  all the.     ** 
1cbb0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1cbc0 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a  ion directly */.
1cbd0 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c      return pColl
1cbe0 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
1cbf0 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65  ser,pMem1->n,pMe
1cc00 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70  m1->z,pMem2->n,p
1cc10 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73  Mem2->z);.  }els
1cc20 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  e{.    int rc;. 
1cc30 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76     const void *v
1cc40 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20  1, *v2;.    int 
1cc50 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20  n1, n2;.    Mem 
1cc60 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a  c1;.    Mem c2;.
1cc70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1cc80 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d  emInit(&c1, pMem
1cc90 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1cca0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1ccb0 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d  eMemInit(&c2, pM
1ccc0 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c  em1->db, MEM_Nul
1ccd0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  l);.    sqlite3V
1cce0 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
1ccf0 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45  y(&c1, pMem1, ME
1cd00 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71  M_Ephem);.    sq
1cd10 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
1cd20 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65  lowCopy(&c2, pMe
1cd30 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  m2, MEM_Ephem);.
1cd40 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33      v1 = sqlite3
1cd50 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
1cd60 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70  e3_value*)&c1, p
1cd70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
1cd80 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a  n1 = v1==0 ? 0 :
1cd90 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20   c1.n;.    v2 = 
1cda0 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
1cdb0 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
1cdc0 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c2, pColl->enc
1cdd0 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d  );.    n2 = v2==
1cde0 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20  0 ? 0 : c2.n;.  
1cdf0 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43    rc = pColl->xC
1ce00 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
1ce10 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29   n1, v1, n2, v2)
1ce20 3b 0a 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30  ;.    if( (v1==0
1ce30 20 7c 7c 20 76 32 3d 3d 30 29 20 26 26 20 70 72   || v2==0) && pr
1ce40 63 45 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d  cErr ) *prcErr =
1ce50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1ce60 50 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  PT;.    sqlite3V
1ce70 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
1ce80 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
1ce90 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63  dbeMemRelease(&c
1cea0 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  2);.    return r
1ceb0 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
1cec0 54 68 65 20 69 6e 70 75 74 20 70 42 6c 6f 62 20  The input pBlob 
1ced0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1cee0 20 62 65 20 61 20 42 6c 6f 62 20 74 68 61 74 20   be a Blob that 
1cef0 69 73 20 6e 6f 74 20 6d 61 72 6b 65 64 0a 2a 2a  is not marked.**
1cf00 20 77 69 74 68 20 4d 45 4d 5f 5a 65 72 6f 2e 20   with MEM_Zero. 
1cf10 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1cf20 69 74 20 63 6f 75 6c 64 20 62 65 20 61 20 7a 65  it could be a ze
1cf30 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74  ro-blob..*/.stat
1cf40 69 63 20 69 6e 74 20 69 73 41 6c 6c 5a 65 72 6f  ic int isAllZero
1cf50 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
1cf60 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  int n){.  int i;
1cf70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
1cf80 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
1cf90 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  [i] ) return 0;.
1cfa0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
1cfb0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1cfc0 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74   two blobs.  Ret
1cfd0 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
1cfe0 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1cff0 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  if the first.** 
1d000 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1d010 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1d020 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1d030 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  nd, respectively
1d040 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62  ..** If one blob
1d050 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
1d060 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20  the other, then 
1d070 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20 74  the shorter is t
1d080 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74  he lessor..*/.st
1d090 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
1d0a0 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33  LINE int sqlite3
1d0b0 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73  BlobCompare(cons
1d0c0 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73  t Mem *pB1, cons
1d0d0 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69  t Mem *pB2){.  i
1d0e0 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e 31 20 3d  nt c;.  int n1 =
1d0f0 20 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74 20 6e   pB1->n;.  int n
1d100 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20 20 2f  2 = pB2->n;..  /
1d110 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  * It is possible
1d120 20 74 6f 20 68 61 76 65 20 61 20 42 6c 6f 62 20   to have a Blob 
1d130 76 61 6c 75 65 20 74 68 61 74 20 68 61 73 20 73  value that has s
1d140 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63 6f 6e  ome non-zero con
1d150 74 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77  tent.  ** follow
1d160 65 64 20 62 79 20 7a 65 72 6f 20 63 6f 6e 74 65  ed by zero conte
1d170 6e 74 2e 20 20 42 75 74 20 74 68 61 74 20 6f 6e  nt.  But that on
1d180 6c 79 20 63 6f 6d 65 73 20 75 70 20 66 6f 72 20  ly comes up for 
1d190 42 6c 6f 62 73 20 66 6f 72 6d 65 64 0a 20 20 2a  Blobs formed.  *
1d1a0 2a 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  * by the OP_Make
1d1b0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2c 20 61  Record opcode, a
1d1c0 6e 64 20 73 75 63 68 20 42 6c 6f 62 73 20 6e 65  nd such Blobs ne
1d1d0 76 65 72 20 67 65 74 20 70 61 73 73 65 64 20 69  ver get passed i
1d1e0 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  nto.  ** sqlite3
1d1f0 4d 65 6d 43 6f 6d 70 61 72 65 28 29 2e 20 2a 2f  MemCompare(). */
1d200 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 31 2d  .  assert( (pB1-
1d210 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1d220 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30 20 29  o)==0 || n1==0 )
1d230 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 32  ;.  assert( (pB2
1d240 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1d250 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d 30 20  ro)==0 || n2==0 
1d260 29 3b 0a 0a 20 20 69 66 28 20 28 70 42 31 2d 3e  );..  if( (pB1->
1d270 66 6c 61 67 73 7c 70 42 32 2d 3e 66 6c 61 67 73  flags|pB2->flags
1d280 29 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  ) & MEM_Zero ){.
1d290 20 20 20 20 69 66 28 20 70 42 31 2d 3e 66 6c 61      if( pB1->fla
1d2a0 67 73 20 26 20 70 42 32 2d 3e 66 6c 61 67 73 20  gs & pB2->flags 
1d2b0 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
1d2c0 20 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e      return pB1->
1d2d0 75 2e 6e 5a 65 72 6f 20 2d 20 70 42 32 2d 3e 75  u.nZero - pB2->u
1d2e0 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 6c 73  .nZero;.    }els
1d2f0 65 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73  e if( pB1->flags
1d300 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
1d310 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a       if( !isAllZ
1d320 65 72 6f 28 70 42 32 2d 3e 7a 2c 20 70 42 32 2d  ero(pB2->z, pB2-
1d330 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  >n) ) return -1;
1d340 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42  .      return pB
1d350 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32 3b  1->u.nZero - n2;
1d360 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d370 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f    if( !isAllZero
1d380 28 70 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 29  (pB1->z, pB1->n)
1d390 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1d3a0 20 20 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20      return n1 - 
1d3b0 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  pB2->u.nZero;.  
1d3c0 20 20 7d 0a 20 20 7d 0a 20 20 63 20 3d 20 6d 65    }.  }.  c = me
1d3d0 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32  mcmp(pB1->z, pB2
1d3e0 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e 32 20  ->z, n1>n2 ? n2 
1d3f0 3a 20 6e 31 29 3b 0a 20 20 69 66 28 20 63 20 29  : n1);.  if( c )
1d400 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74   return c;.  ret
1d410 75 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d 0a 0a  urn n1 - n2;.}..
1d420 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61  /*.** Do a compa
1d430 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20  rison between a 
1d440 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e  64-bit signed in
1d450 74 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62  teger and a 64-b
1d460 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  it floating-poin
1d470 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65  t.** number.  Re
1d480 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a  turn negative, z
1d490 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
1d4a0 20 69 66 20 74 68 65 20 66 69 72 73 74 20 28 69   if the first (i
1d4b0 36 34 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  64) is less than
1d4c0 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f  ,.** equal to, o
1d4d0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1d4e0 68 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c  he second (doubl
1d4f0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
1d500 74 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  t sqlite3IntFloa
1d510 74 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20  tCompare(i64 i, 
1d520 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28  double r){.  if(
1d530 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42   sizeof(LONGDOUB
1d540 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20  LE_TYPE)>8 ){.  
1d550 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50    LONGDOUBLE_TYP
1d560 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c  E x = (LONGDOUBL
1d570 45 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66  E_TYPE)i;.    if
1d580 28 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d  ( x<r ) return -
1d590 31 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29  1;.    if( x>r )
1d5a0 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1d5b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
1d5c0 65 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20  e{.    i64 y;.  
1d5d0 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20    double s;.    
1d5e0 69 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33  if( r<-922337203
1d5f0 36 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72  6854775808.0 ) r
1d600 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66  eturn +1;.    if
1d610 28 20 72 3e 39 32 32 33 33 37 32 30 33 36 38 35  ( r>922337203685
1d620 34 37 37 35 38 30 37 2e 30 20 29 20 72 65 74 75  4775807.0 ) retu
1d630 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28  rn -1;.    y = (
1d640 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69  i64)r;.    if( i
1d650 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <y ) return -1;.
1d660 20 20 20 20 69 66 28 20 69 3e 79 20 29 7b 0a 20      if( i>y ){. 
1d670 20 20 20 20 20 69 66 28 20 79 3d 3d 53 4d 41 4c       if( y==SMAL
1d680 4c 45 53 54 5f 49 4e 54 36 34 20 26 26 20 72 3e  LEST_INT64 && r>
1d690 30 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  0.0 ) return -1;
1d6a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2b 31  .      return +1
1d6b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20  ;.    }.    s = 
1d6c0 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20 69  (double)i;.    i
1d6d0 66 28 20 73 3c 72 20 29 20 72 65 74 75 72 6e 20  f( s<r ) return 
1d6e0 2d 31 3b 0a 20 20 20 20 69 66 28 20 73 3e 72 20  -1;.    if( s>r 
1d6f0 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1d700 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
1d710 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1d720 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61  the values conta
1d730 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f 20  ined by the two 
1d740 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65  memory cells, re
1d750 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74  turning.** negat
1d760 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73  ive, zero or pos
1d770 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69  itive if pMem1 i
1d780 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1d790 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
1d7a0 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e  r.** than pMem2.
1d7b0 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69   Sorting order i
1d7c0 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20  s NULL's first, 
1d7d0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62  followed by numb
1d7e0 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a  ers (integers.**
1d7f0 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74   and reals) sort
1d800 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20  ed numerically, 
1d810 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74  followed by text
1d820 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 65 20   ordered by the 
1d830 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
1d840 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20  uence pColl and 
1d850 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f  finally blob's o
1d860 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70  rdered by memcmp
1d870 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55  ()..**.** Two NU
1d880 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  LL values are co
1d890 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20 62  nsidered equal b
1d8a0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
1d8b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d  .*/.int sqlite3M
1d8c0 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  emCompare(const 
1d8d0 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73  Mem *pMem1, cons
1d8e0 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f  t Mem *pMem2, co
1d8f0 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  nst CollSeq *pCo
1d900 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66  ll){.  int f1, f
1d910 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65  2;.  int combine
1d920 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d  d_flags;..  f1 =
1d930 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20   pMem1->flags;. 
1d940 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61   f2 = pMem2->fla
1d950 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66  gs;.  combined_f
1d960 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20  lags = f1|f2;.  
1d970 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65  assert( (combine
1d980 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  d_flags & MEM_Ro
1d990 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20  wSet)==0 );. .  
1d9a0 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
1d9b0 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c  is NULL, it is l
1d9c0 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68  ess than the oth
1d9d0 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75  er. If both valu
1d9e0 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c  es.  ** are NULL
1d9f0 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f  , return 0..  */
1da00 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1da10 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
1da20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66 32  {.    return (f2
1da30 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31  &MEM_Null) - (f1
1da40 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a  &MEM_Null);.  }.
1da50 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f  .  /* At least o
1da60 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 76 61  ne of the two va
1da70 6c 75 65 73 20 69 73 20 61 20 6e 75 6d 62 65 72  lues is a number
1da80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1da90 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f  ined_flags&(MEM_
1daa0 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b  Int|MEM_Real) ){
1dab0 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66  .    if( (f1 & f
1dac0 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  2 & MEM_Int)!=0 
1dad0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ){.      if( pMe
1dae0 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d  m1->u.i < pMem2-
1daf0 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31  >u.i ) return -1
1db00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
1db10 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e  1->u.i > pMem2->
1db20 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  u.i ) return +1;
1db30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1db40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1db50 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65  f1 & f2 & MEM_Re
1db60 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1db70 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c  if( pMem1->u.r <
1db80 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65   pMem2->u.r ) re
1db90 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69  turn -1;.      i
1dba0 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20  f( pMem1->u.r > 
1dbb0 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74  pMem2->u.r ) ret
1dbc0 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65  urn +1;.      re
1dbd0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1dbe0 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e    if( (f1&MEM_In
1dbf0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  t)!=0 ){.      i
1dc00 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29  f( (f2&MEM_Real)
1dc10 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1dc20 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74  eturn sqlite3Int
1dc30 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65  FloatCompare(pMe
1dc40 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e  m1->u.i, pMem2->
1dc50 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
1dc60 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
1dc70 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n -1;.      }.  
1dc80 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26    }.    if( (f1&
1dc90 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1dca0 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45        if( (f2&ME
1dcb0 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
1dcc0 20 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71 6c       return -sql
1dcd0 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
1dce0 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20  are(pMem2->u.i, 
1dcf0 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20  pMem1->u.r);.   
1dd00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dd10 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1dd20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
1dd30 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20  eturn +1;.  }.. 
1dd40 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
1dd50 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64   is a string and
1dd60 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 61 20   the other is a 
1dd70 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67  blob, the string
1dd80 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49   is less..  ** I
1dd90 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e  f both are strin
1dda0 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e  gs, compare usin
1ddb0 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  g the collating 
1ddc0 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  functions..  */.
1ddd0 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66    if( combined_f
1dde0 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a  lags&MEM_Str ){.
1ddf0 20 20 20 20 69 66 28 20 28 66 31 20 26 20 4d 45      if( (f1 & ME
1de00 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Str)==0 ){.   
1de10 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1de20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20 26   }.    if( (f2 &
1de30 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a   MEM_Str)==0 ){.
1de40 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1de50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
1de60 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  rt( pMem1->enc==
1de70 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d  pMem2->enc || pM
1de80 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  em1->db->mallocF
1de90 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73  ailed );.    ass
1dea0 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
1deb0 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20  =SQLITE_UTF8 || 
1dec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65  .            pMe
1ded0 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1dee0 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31  UTF16LE || pMem1
1def0 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1df00 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a  F16BE );..    /*
1df10 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   The collation s
1df20 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20  equence must be 
1df30 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73 20  defined at this 
1df40 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20  point, even if. 
1df50 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64     ** the user d
1df60 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61  eletes the colla
1df70 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66  tion sequence af
1df80 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72 6f  ter the vdbe pro
1df90 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63  gram is.    ** c
1dfa0 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77 61  ompiled (this wa
1dfb0 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65  s not always the
1dfc0 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20   case)..    */. 
1dfd0 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c     assert( !pCol
1dfe0 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  l || pColl->xCmp
1dff0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f   );..    if( pCo
1e000 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ll ){.      retu
1e010 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65  rn vdbeCompareMe
1e020 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70  mString(pMem1, p
1e030 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b  Mem2, pColl, 0);
1e040 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66  .    }.    /* If
1e050 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
1e060 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74 68  was passed as th
1e070 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69  e collate functi
1e080 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  on, fall through
1e090 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62  .    ** to the b
1e0a0 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73 65  lob case and use
1e0b0 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20   memcmp().  */. 
1e0c0 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76   }. .  /* Both v
1e0d0 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c  alues must be bl
1e0e0 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73  obs.  Compare us
1e0f0 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  ing memcmp().  *
1e100 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
1e110 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d  e3BlobCompare(pM
1e120 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a  em1, pMem2);.}..
1e130 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
1e140 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
1e150 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1e160 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79  n is a serial-ty
1e170 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65  pe that.** corre
1e180 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74  sponds to an int
1e190 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65  eger - all value
1e1a0 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
1e1b0 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20  9 inclusive .** 
1e1c0 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 65  except 7. The se
1e1d0 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61  cond points to a
1e1e0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1e1f0 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  ng an integer va
1e200 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65  lue.** serialize
1e210 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73  d according to s
1e220 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73  erial_type. This
1e230 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69   function deseri
1e240 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65  alizes.** and re
1e250 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e  turns the value.
1e260 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76  .*/.static i64 v
1e270 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49  dbeRecordDecodeI
1e280 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  nt(u32 serial_ty
1e290 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  pe, const u8 *aK
1e2a0 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20  ey){.  u32 y;.  
1e2b0 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
1e2c0 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79  DB || (serial_ty
1e2d0 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f  pe>=1 && serial_
1e2e0 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61  type<=9 && seria
1e2f0 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20  l_type!=7) );.  
1e300 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
1e310 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
1e320 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20  0:.    case 1:. 
1e330 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1e340 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1e350 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f       return ONE_
1e360 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1e370 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20      case 2:.    
1e380 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1e390 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1e3a0 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54    return TWO_BYT
1e3b0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1e3c0 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74   case 3:.      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 54 48 52 45 45 5f 42 59 54 45  eturn THREE_BYTE
1e400 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1e410 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20  case 4: {.      
1e420 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1e430 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1e440 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
1e450 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1e460 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e  return (i64)*(in
1e470 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20  t*)&y;.    }.   
1e480 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20   case 5: {.     
1e490 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1e4a0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1e4b0 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54   return FOUR_BYT
1e4c0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
1e4d0 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
1e4e0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1e4f0 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  y);.    }.    ca
1e500 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36  se 6: {.      u6
1e510 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  4 x = FOUR_BYTE_
1e520 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1e530 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1e540 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1e550 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
1e560 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1e570 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65  Key+4);.      re
1e580 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a  turn (i64)*(i64*
1e590 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  )&x;.    }.  }..
1e5a0 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
1e5b0 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f  _type - 8);.}../
1e5c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e5d0 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  on compares the 
1e5e0 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f  two table rows o
1e5f0 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a  r index records.
1e600 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
1e610 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61  {nKey1, pKey1} a
1e620 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72  nd pPKey2.  It r
1e630 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76  eturns a negativ
1e640 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f  e, zero.** or po
1e650 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69  sitive integer i
1e660 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  f key1 is less t
1e670 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
1e680 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61   .** greater tha
1e690 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b  n key2.  The {nK
1e6a0 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20  ey1, pKey1} key 
1e6b0 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a  must be a blob.*
1e6c0 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  * created by the
1e6d0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
1e6e0 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
1e6f0 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a  E.  The pPKey2.*
1e700 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  * key must be a 
1e710 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20  parsed key such 
1e720 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
1e730 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50  .** sqlite3VdbeP
1e740 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  arseRecord..**.*
1e750 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53  * If argument bS
1e760 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
1e770 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1e780 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
1e790 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65  as already.** de
1e7a0 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68  termined that th
1e7b0 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
1e7c0 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65  f the keys are e
1e7d0 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31  qual..**.** Key1
1e7e0 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74   and Key2 do not
1e7f0 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e   have to contain
1e800 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1e810 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61   of fields. If a
1e820 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68  ll .** fields th
1e830 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74  at appear in bot
1e840 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  h keys are equal
1e850 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64  , then pPKey2->d
1e860 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a  efault_rc is .**
1e870 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1e880 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   If database cor
1e890 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f  ruption is disco
1e8a0 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79  vered, set pPKey
1e8b0 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a  2->errCode to .*
1e8c0 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
1e8d0 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49   and return 0. I
1e8e0 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69  f an OOM error i
1e8f0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a  s encountered, .
1e900 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  ** pPKey2->errCo
1e910 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  de is set to SQL
1e920 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69  ITE_NOMEM and, i
1e930 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  f it is not NULL
1e940 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d  , the.** malloc-
1e950 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20  failed flag set 
1e960 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
1e970 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79  le (pPKey2->pKey
1e980 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e  Info->db)..*/.in
1e990 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
1e9a0 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
1e9b0 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ip(.  int nKey1,
1e9c0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1e9d0 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65  y1,   /* Left ke
1e9e0 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1e9f0 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20  ecord *pPKey2,  
1ea00 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
1ea10 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b  key */.  int bSk
1ea20 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ip              
1ea30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1ea40 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69  rue, skip the fi
1ea50 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  rst field */.){.
1ea60 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20    u32 d1;       
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1ea90 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1eaa0 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
1eab0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65    /* Index of ne
1eae0 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70  xt field to comp
1eaf0 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  are */.  u32 szH
1eb00 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
1eb10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1eb20 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64 65   of record heade
1eb30 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
1eb40 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72  /* Offset of fir
1eb70 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 64 65  st type in heade
1eb80 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
1eb90 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1eba0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1ebb0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20   value */.  Mem 
1ebc0 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e  *pRhs = pPKey2->
1ebd0 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e  aMem;       /* N
1ebe0 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b  ext field of pPK
1ebf0 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  ey2 to compare *
1ec00 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
1ec10 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
1ec20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73  pKeyInfo;.  cons
1ec30 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1ec40 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
1ec50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1ec60 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d  pKey1;.  Mem mem
1ec70 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69  1;..  /* If bSki
1ec80 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  p is true, then 
1ec90 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
1eca0 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65  lready determine
1ecb0 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
1ecc0 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e  .  ** two elemen
1ecd0 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61  ts in the keys a
1ece0 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68  re equal. Fix th
1ecf0 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20  e various stack 
1ed00 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a  variables so.  *
1ed10 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  * that this rout
1ed20 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61  ine begins compa
1ed30 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f  ring at the seco
1ed40 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69  nd field. */.  i
1ed50 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( bSkip ){.    
1ed60 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31  u32 s1;.    idx1
1ed70 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74   = 1 + getVarint
1ed80 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31  32(&aKey1[1], s1
1ed90 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20  );.    szHdr1 = 
1eda0 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31  aKey1[0];.    d1
1edb0 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69   = szHdr1 + sqli
1edc0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1edd0 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20  eLen(s1);.    i 
1ede0 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b  = 1;.    pRhs++;
1edf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64  .  }else{.    id
1ee00 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
1ee10 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
1ee20 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
1ee30 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e  ;.    if( d1>(un
1ee40 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20  signed)nKey1 ){ 
1ee50 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  .      pPKey2->e
1ee60 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1ee70 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ee80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1ee90 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e  ;  /* Corruption
1eea0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20   */.    }.    i 
1eeb0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f  = 0;.  }..  VVA_
1eec0 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  ONLY( mem1.szMal
1eed0 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
1eee0 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
1eef0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1ef00 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1ef10 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1ef20 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70  nField+pPKey2->p
1ef30 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1ef40 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  >=pPKey2->nField
1ef50 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52   .       || CORR
1ef60 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
1ef70 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1ef80 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1ef90 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1efa0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1efb0 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20  o->nField>0 );. 
1efc0 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73   assert( idx1<=s
1efd0 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54  zHdr1 || CORRUPT
1efe0 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  _DB );.  do{.   
1eff0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1f000 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  ;..    /* RHS is
1f010 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20   an integer */. 
1f020 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61     if( pRhs->fla
1f030 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a  gs & MEM_Int ){.
1f040 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1f050 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1f060 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1f070 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
1f080 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
1f090 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b  rial_type>=10 ){
1f0a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
1f0b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1f0c0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30  ( serial_type==0
1f0d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1f0e0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1f0f0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1f100 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==7 ){.        s
1f110 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1f120 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
1f130 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65  serial_type, &me
1f140 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  m1);.        rc 
1f150 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f  = -sqlite3IntFlo
1f160 61 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e  atCompare(pRhs->
1f170 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a  u.i, mem1.u.r);.
1f180 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f190 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76       i64 lhs = v
1f1a0 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49  dbeRecordDecodeI
1f1b0 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  nt(serial_type, 
1f1c0 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20  &aKey1[d1]);.   
1f1d0 20 20 20 20 20 69 36 34 20 72 68 73 20 3d 20 70       i64 rhs = p
1f1e0 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20  Rhs->u.i;.      
1f1f0 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b    if( lhs<rhs ){
1f200 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f210 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
1f220 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b  e if( lhs>rhs ){
1f230 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f240 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
1f250 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1f260 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20   /* RHS is real 
1f270 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
1f280 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1f290 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
1f2a0 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b  serial_type = aK
1f2b0 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20  ey1[idx1];.     
1f2c0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1f2d0 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >=10 ){.        
1f2e0 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73 20  /* Serial types 
1f2f0 31 32 20 6f 72 20 67 72 65 61 74 65 72 20 61 72  12 or greater ar
1f300 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c  e strings and bl
1f310 6f 62 73 20 28 67 72 65 61 74 65 72 20 74 68 61  obs (greater tha
1f320 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  n.        ** num
1f330 62 65 72 73 29 2e 20 54 79 70 65 73 20 31 30 20  bers). Types 10 
1f340 61 6e 64 20 31 31 20 61 72 65 20 63 75 72 72 65  and 11 are curre
1f350 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64 20 66  ntly "reserved f
1f360 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20 20 20  or future .     
1f370 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69     ** use", so i
1f380 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79  t doesn't really
1f390 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68 65   matter what the
1f3a0 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70   results of comp
1f3b0 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  aring.        **
1f3c0 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69   them to numberi
1f3d0 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a  c values are.  *
1f3e0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  /.        rc = +
1f3f0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1f400 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1f410 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1f420 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1f430 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1f440 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1f450 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
1f460 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b  al_type, &mem1);
1f470 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72  .        if( ser
1f480 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
1f490 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d           if( mem
1f4a0 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20  1.u.r<pRhs->u.r 
1f4b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1f4c0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1f4d0 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31    }else if( mem1
1f4e0 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29  .u.r>pRhs->u.r )
1f4f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1f500 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20   = +1;.         
1f510 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1f520 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1f530 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74   sqlite3IntFloat
1f540 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69  Compare(mem1.u.i
1f550 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20  , pRhs->u.r);.  
1f560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f570 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1f580 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f  S is a string */
1f590 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1f5a0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1f5b0 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74  Str ){.      get
1f5c0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1f5d0 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  idx1], serial_ty
1f5e0 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  pe);.      testc
1f5f0 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1f600 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1f610 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
1f620 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1f630 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1f640 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
1f650 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20  pe & 0x01) ){.  
1f660 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1f670 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f680 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65      mem1.n = (se
1f690 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20  rial_type - 12) 
1f6a0 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73  / 2;.        tes
1f6b0 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e  tcase( (d1+mem1.
1f6c0 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  n)==(unsigned)nK
1f6d0 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ey1 );.        t
1f6e0 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d  estcase( (d1+mem
1f6f0 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65  1.n+1)==(unsigne
1f700 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1f710 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e     if( (d1+mem1.
1f720 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e  n) > (unsigned)n
1f730 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20  Key1 ){.        
1f740 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1f750 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1f760 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1f770 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f790 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
1f7a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1f7b0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  f( pKeyInfo->aCo
1f7c0 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  ll[i] ){.       
1f7d0 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b     mem1.enc = pK
1f7e0 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
1f7f0 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d         mem1.db =
1f800 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
1f810 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c           mem1.fl
1f820 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20  ags = MEM_Str;. 
1f830 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20           mem1.z 
1f840 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b  = (char*)&aKey1[
1f850 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  d1];.          r
1f860 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  c = vdbeCompareM
1f870 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20  emString(.      
1f880 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70          &mem1, p
1f890 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  Rhs, pKeyInfo->a
1f8a0 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32  Coll[i], &pPKey2
1f8b0 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
1f8c0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
1f8d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f8e0 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d  int nCmp = MIN(m
1f8f0 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b  em1.n, pRhs->n);
1f900 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f910 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31  memcmp(&aKey1[d1
1f920 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70  ], pRhs->z, nCmp
1f930 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1f940 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65   rc==0 ) rc = me
1f950 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20  m1.n - pRhs->n; 
1f960 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f970 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1f980 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a   RHS is a blob *
1f990 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1f9a0 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1f9b0 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 61  _Blob ){.      a
1f9c0 73 73 65 72 74 28 20 28 70 52 68 73 2d 3e 66 6c  ssert( (pRhs->fl
1f9d0 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d  ags & MEM_Zero)=
1f9e0 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30  =0 || pRhs->n==0
1f9f0 20 29 3b 0a 20 20 20 20 20 20 67 65 74 56 61 72   );.      getVar
1fa00 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78  int32(&aKey1[idx
1fa10 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
1fa20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fa30 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1fa40 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1fa50 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c  erial_type<12 ||
1fa60 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20   (serial_type & 
1fa70 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20  0x01) ){.       
1fa80 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1fa90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1faa0 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61  nt nStr = (seria
1fab0 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32  l_type - 12) / 2
1fac0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1fad0 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28  se( (d1+nStr)==(
1fae0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1faf0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1fb00 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d  se( (d1+nStr+1)=
1fb10 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1fb20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1fb30 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73  (d1+nStr) > (uns
1fb40 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20  igned)nKey1 ){. 
1fb50 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
1fb60 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1fb70 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1fb80 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  PT;.          re
1fb90 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1fba0 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70         /* Corrup
1fbb0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1fbc0 7d 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e  }else if( pRhs->
1fbd0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1fbe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1fbf0 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63 6f  ( !isAllZero((co
1fc00 6e 73 74 20 63 68 61 72 2a 29 26 61 4b 65 79 31  nst char*)&aKey1
1fc10 5b 64 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20 20  [d1],nStr) ){.  
1fc20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
1fc30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1fc40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
1fc50 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d  c = nStr - pRhs-
1fc60 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20  >u.nZero;.      
1fc70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1fc80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1fc90 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53  nt nCmp = MIN(nS
1fca0 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  tr, pRhs->n);.  
1fcb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
1fcc0 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
1fcd0 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
1fce0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1fcf0 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20  ==0 ) rc = nStr 
1fd00 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20  - pRhs->n;.     
1fd10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1fd20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1fd30 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c  s null */.    el
1fd40 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c  se{.      serial
1fd50 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1fd60 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x1];.      rc = 
1fd70 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29  (serial_type!=0)
1fd80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1fd90 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1fda0 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
1fdb0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
1fdc0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
1fdd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1fde0 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
1fdf0 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1fe00 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1fe10 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20  y2, rc) );.     
1fe20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
1fe30 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
1fe40 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
1fe50 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
1fe60 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
1fe70 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b    i++;.    pRhs+
1fe80 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  +;.    d1 += sql
1fe90 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1fea0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
1feb0 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20  e);.    idx1 += 
1fec0 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e  sqlite3VarintLen
1fed0 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
1fee0 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75   }while( idx1<(u
1fef0 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26  nsigned)szHdr1 &
1ff00 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
1ff10 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67  ld && d1<=(unsig
1ff20 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20  ned)nKey1 );..  
1ff30 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
1ff40 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
1ff50 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
1ff60 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
1ff70 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
1ff80 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
1ff90 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
1ffa0 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
1ffb0 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
1ffc0 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
1ffd0 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
1ffe0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1fff0 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  em1).  */.  asse
20000 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
20010 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
20020 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
20030 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20  hat one or both 
20040 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
20050 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
20060 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
20070 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
20080 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
20090 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  l. Return the de
200a0 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61  fault_rc.  ** va
200b0 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  lue.  */.  asser
200c0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20  t( CORRUPT_DB . 
200d0 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63        || vdbeRec
200e0 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
200f0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
20100 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65  Key2, pPKey2->de
20110 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20  fault_rc) .     
20120 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64    || pKeyInfo->d
20130 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
20140 20 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65    );.  pPKey2->e
20150 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74  qSeen = 1;.  ret
20160 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  urn pPKey2->defa
20170 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  ult_rc;.}.int sq
20180 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20190 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
201a0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
201b0 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66  *pKey1,   /* Lef
201c0 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
201d0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
201e0 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69  2          /* Ri
201f0 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
20200 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
20210 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
20220 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
20230 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29  Key1, pPKey2, 0)
20240 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
20250 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
20260 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
20270 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
20280 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
20290 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65  .** that (a) the
202a0 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20   first field of 
202b0 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74  pPKey2 is an int
202c0 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68  eger, and (b) th
202d0 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65  e .** size-of-he
202e0 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74  ader varint at t
202f0 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65  he start of (pKe
20300 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69  y1/nKey1) fits i
20310 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79  n a single.** by
20320 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73  te (i.e. is less
20330 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a   than 128)..**.*
20340 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65  * To avoid conce
20350 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 72  rns about buffer
20360 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 73   overreads, this
20370 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
20380 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65   used.** on sche
20390 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d 61  mas where the ma
203a0 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64  ximum valid head
203b0 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 79  er size is 63 by
203c0 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a  tes or less..*/.
203d0 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
203e0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
203f0 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
20400 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
20410 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
20420 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
20430 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
20440 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
20450 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  ){.  const u8 *a
20460 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75  Key = &((const u
20470 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73  8*)pKey1)[*(cons
20480 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78  t u8*)pKey1 & 0x
20490 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  3F];.  int seria
204a0 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74  l_type = ((const
204b0 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a   u8*)pKey1)[1];.
204c0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32    int res;.  u32
204d0 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69   y;.  u64 x;.  i
204e0 36 34 20 76 3b 0a 20 20 69 36 34 20 6c 68 73 3b  64 v;.  i64 lhs;
204f0 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ..  vdbeAssertFi
20500 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
20510 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
20520 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
20530 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
20540 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30  (*(u8*)pKey1)<=0
20550 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  x3F || CORRUPT_D
20560 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  B );.  switch( s
20570 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
20580 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31    case 1: { /* 1
20590 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
205a0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
205b0 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  s = ONE_BYTE_INT
205c0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
205d0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
205e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
205f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
20600 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
20610 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
20620 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59      lhs = TWO_BY
20630 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
20640 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
20650 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
20660 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20670 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
20680 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
20690 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
206a0 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61  THREE_BYTE_INT(a
206b0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
206c0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
206d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
206e0 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
206f0 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
20700 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
20710 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    y = FOUR_BYTE_
20720 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
20730 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69    lhs = (i64)*(i
20740 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65  nt*)&y;.      te
20750 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
20760 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20770 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
20780 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
20790 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
207a0 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42      lhs = FOUR_B
207b0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29  YTE_UINT(aKey+2)
207c0 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
207d0 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  )*TWO_BYTE_INT(a
207e0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
207f0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
20800 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20810 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20  }.    case 6: { 
20820 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
20830 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
20840 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    x = FOUR_BYTE_
20850 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
20860 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
20870 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
20880 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68  Key+4);.      lh
20890 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  s = *(i64*)&x;. 
208a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
208b0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
208c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
208d0 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68  ase 8: .      lh
208e0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  s = 0;.      bre
208f0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a  ak;.    case 9:.
20900 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20        lhs = 1;. 
20910 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
20920 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f   /* This case co
20930 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77  uld be removed w
20940 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
20950 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72  the results of r
20960 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  unning.    ** th
20970 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69  is code. Includi
20980 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63  ng it causes gcc
20990 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66   to generate a f
209a0 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20  aster switch .  
209b0 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28    ** statement (
209c0 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20  since the range 
209d0 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74  of switch target
209e0 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20  s now starts at 
209f0 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20  zero and.    ** 
20a00 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62  is contiguous) b
20a10 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  ut does not caus
20a20 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20  e any duplicate 
20a30 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72  code to be gener
20a40 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20  ated.    ** (as 
20a50 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e  gcc is clever en
20a60 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20  ough to combine 
20a70 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73  the two like cas
20a80 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20  es). Other .    
20a90 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67  ** compilers mig
20aa0 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20  ht be similar.  
20ab0 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20  */ .    case 0: 
20ac0 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65  case 7:.      re
20ad0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
20ae0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b  RecordCompare(nK
20af0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
20b00 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  y2);..    defaul
20b10 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
20b20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
20b30 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20  dCompare(nKey1, 
20b40 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a  pKey1, pPKey2);.
20b50 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65 79    }..  v = pPKey
20b60 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a  2->aMem[0].u.i;.
20b70 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20    if( v>lhs ){. 
20b80 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
20b90 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >r1;.  }else if(
20ba0 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65   v<lhs ){.    re
20bb0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a  s = pPKey2->r2;.
20bc0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65    }else if( pPKe
20bd0 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a  y2->nField>1 ){.
20be0 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
20bf0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74   fields of the t
20c00 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  wo keys are equa
20c10 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74  l. Compare the t
20c20 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20  railing .    ** 
20c30 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20  fields.  */.    
20c40 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
20c50 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
20c60 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b  thSkip(nKey1, pK
20c70 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b  ey1, pPKey2, 1);
20c80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
20c90 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   The first field
20ca0 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79  s of the two key
20cb0 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20  s are equal and 
20cc0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61  there are no tra
20cd0 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65  iling.    ** fie
20ce0 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65  lds. Return pPKe
20cf0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69  y2->default_rc i
20d00 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a  n this case. */.
20d10 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
20d20 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20  ->default_rc;.  
20d30 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e    pPKey2->eqSeen
20d40 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73   = 1;.  }..  ass
20d50 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43  ert( vdbeRecordC
20d60 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
20d70 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
20d80 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75  , res) );.  retu
20d90 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
20da0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
20db0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76  s an optimized v
20dc0 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
20dd0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
20de0 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61  re() .** that (a
20df0 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
20e00 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61  d of pPKey2 is a
20e10 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62   string, that (b
20e20 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
20e30 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f  d.** uses the co
20e40 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
20e50 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20   BINARY and (c) 
20e60 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66  that the size-of
20e70 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a  -header varint .
20e80 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ** at the start 
20e90 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  of (pKey1/nKey1)
20ea0 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
20eb0 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  e byte..*/.stati
20ec0 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
20ed0 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20  CompareString(. 
20ee0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
20ef0 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
20f00 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
20f10 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
20f20 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
20f30 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
20f40 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  .  const u8 *aKe
20f50 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29  y1 = (const u8*)
20f60 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72  pKey1;.  int ser
20f70 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20  ial_type;.  int 
20f80 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  res;..  assert( 
20f90 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
20fa0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
20fb0 29 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74 46  );.  vdbeAssertF
20fc0 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
20fd0 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65  imits(nKey1, pKe
20fe0 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  y1, pPKey2->pKey
20ff0 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69  Info);.  getVari
21000 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20  nt32(&aKey1[1], 
21010 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
21020 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
21030 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  12 ){.    res = 
21040 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20  pPKey2->r1;     
21050 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   /* (pKey1/nKey1
21060 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72  ) is a number or
21070 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c   a null */.  }el
21080 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f  se if( !(serial_
21090 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20  type & 0x01) ){ 
210a0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
210b0 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28  2->r2;      /* (
210c0 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20  pKey1/nKey1) is 
210d0 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73  a blob */.  }els
210e0 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b  e{.    int nCmp;
210f0 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20  .    int nStr;. 
21100 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61     int szHdr = a
21110 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53  Key1[0];..    nS
21120 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  tr = (serial_typ
21130 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69  e-12) / 2;.    i
21140 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72  f( (szHdr + nStr
21150 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ) > nKey1 ){.   
21160 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
21170 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
21180 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
21190 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
211a0 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
211b0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70  /.    }.    nCmp
211c0 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e   = MIN( pPKey2->
211d0 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20  aMem[0].n, nStr 
211e0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d  );.    res = mem
211f0 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72  cmp(&aKey1[szHdr
21200 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  ], pPKey2->aMem[
21210 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20  0].z, nCmp);..  
21220 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
21230 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72        res = nStr
21240 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b   - pPKey2->aMem[
21250 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  0].n;.      if( 
21260 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
21270 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46    if( pPKey2->nF
21280 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20  ield>1 ){.      
21290 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
212a0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
212b0 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
212c0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
212d0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   1);.        }el
212e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
212f0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  s = pPKey2->defa
21300 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20  ult_rc;.        
21310 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e    pPKey2->eqSeen
21320 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
21330 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
21340 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  res>0 ){.       
21350 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
21360 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
21370 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
21380 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20  Key2->r1;.      
21390 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
213a0 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  res>0 ){.      r
213b0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
213c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
213d0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
213e0 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r1;.    }.  }.. 
213f0 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
21400 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
21410 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
21420 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20  Key2, res).     
21430 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a    || CORRUPT_DB.
21440 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32         || pPKey2
21450 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e  ->pKeyInfo->db->
21460 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29  mallocFailed.  )
21470 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
21480 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21490 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
214a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
214b0 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61  dCompare() compa
214c0 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  tible function.*
214d0 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63  * suitable for c
214e0 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69  omparing seriali
214f0 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74  zed records to t
21500 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f  he unpacked reco
21510 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  rd passed.** as 
21520 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
21530 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70  t..*/.RecordComp
21540 61 72 65 20 73 71 6c 69 74 65 33 56 64 62 65 46  are sqlite3VdbeF
21550 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63  indCompare(Unpac
21560 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
21570 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64   /* varintRecord
21580 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64  CompareInt() and
21590 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
215a0 70 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74  pareString() bot
215b0 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68  h assume.  ** th
215c0 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68  at the size-of-h
215d0 65 61 64 65 72 20 76 61 72 69 6e 74 20 74 68 61  eader varint tha
215e0 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20  t occurs at the 
215f0 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 72 65  start of each re
21600 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69  cord.  ** fits i
21610 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
21620 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20  (i.e. is 127 or 
21630 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63  less). varintRec
21640 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a  ordCompareInt().
21650 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65    ** also assume
21660 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66  s that it is saf
21670 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20  e to overread a 
21680 62 75 66 66 65 72 20 62 79 20 61 74 20 6c 65 61  buffer by at lea
21690 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78  st the .  ** max
216a0 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65  imum possible le
216b0 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  gal header size 
216c0 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42 65  plus 8 bytes. Be
216d0 63 61 75 73 65 20 74 68 65 72 65 20 69 73 0a 20  cause there is. 
216e0 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
216f0 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 37 34  o be at least 74
21700 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62   (but not 136) b
21710 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
21720 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20  following each. 
21730 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 65   ** buffer passe
21740 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72  d to varintRecor
21750 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68  dCompareInt() th
21760 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76  is makes it conv
21770 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c  enient to.  ** l
21780 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66  imit the size of
21790 20 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 36   the header to 6
217a0 34 20 62 79 74 65 73 20 69 6e 20 63 61 73 65 73  4 bytes in cases
217b0 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74   where the first
217c0 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61   field.  ** is a
217d0 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a  n integer..  **.
217e0 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74    ** The easiest
217f0 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20   way to enforce 
21800 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f  this limit is to
21810 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72   consider only r
21820 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a  ecords with.  **
21830 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65   13 fields or le
21840 73 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74  ss. If the first
21850 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74   field is an int
21860 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75  eger, the maximu
21870 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61  m legal.  ** hea
21880 64 65 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a  der size is (12*
21890 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73  5 + 1 + 1) bytes
218a0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
218b0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
218c0 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e   + p->pKeyInfo->
218d0 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a  nXField)<=13 ){.
218e0 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
218f0 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73  p->aMem[0].flags
21900 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65  ;.    if( p->pKe
21910 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
21920 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d  r[0] ){.      p-
21930 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  >r1 = 1;.      p
21940 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  ->r2 = -1;.    }
21950 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72  else{.      p->r
21960 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d  1 = -1;.      p-
21970 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  >r2 = 1;.    }. 
21980 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
21990 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20  MEM_Int) ){.    
219a0 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63    return vdbeRec
219b0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20  ordCompareInt;. 
219c0 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
219d0 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  e( flags & MEM_R
219e0 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  eal );.    testc
219f0 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
21a00 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73  _Null );.    tes
21a10 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
21a20 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69  EM_Blob );.    i
21a30 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d  f( (flags & (MEM
21a40 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d  _Real|MEM_Null|M
21a50 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20  EM_Blob))==0 && 
21a60 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  p->pKeyInfo->aCo
21a70 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ll[0]==0 ){.    
21a80 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20    assert( flags 
21a90 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20  & MEM_Str );.   
21aa0 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65     return vdbeRe
21ab0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
21ac0 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  g;.    }.  }..  
21ad0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
21ae0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b  beRecordCompare;
21af0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70  .}../*.** pCur p
21b00 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65  oints at an inde
21b10 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20  x entry created 
21b20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
21b30 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
21b40 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69  ** Read the rowi
21b50 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c  d (the last fiel
21b60 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29  d in the record)
21b70 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
21b80 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75   *rowid..** Retu
21b90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
21ba0 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
21bb0 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  , or an error co
21bc0 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  de otherwise..**
21bd0 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62  .** pCur might b
21be0 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65  e pointing to te
21bf0 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  xt obtained from
21c00 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
21c10 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20  ase file..** So 
21c20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e  the content cann
21c30 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20  ot be trusted.  
21c40 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  Do appropriate c
21c50 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e  hecks on the con
21c60 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tent..*/.int sql
21c70 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64  ite3VdbeIdxRowid
21c80 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74  (sqlite3 *db, Bt
21c90 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
21ca0 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
21cb0 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
21cc0 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73   int rc;.  u32 s
21cd0 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
21ce0 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
21cf0 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
21d00 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
21d10 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
21d20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c  rowid */.  u32 l
21d30 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20  enRowid;     /* 
21d40 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69  Size of the rowi
21d50 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b  d */.  Mem m, v;
21d60 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73  ..  /* Get the s
21d70 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ize of the index
21d80 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e   entry.  Only in
21d90 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66  dices entries of
21da0 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20   less.  ** than 
21db0 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74  2GiB are support
21dc0 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67   - anything larg
21dd0 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61  e must be databa
21de0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
21df0 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69   ** Any corrupti
21e00 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69  on is detected i
21e10 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  n sqlite3BtreePa
21e20 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68  rseCellPtr(), th
21e30 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68  ough, so.  ** th
21e40 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65  is code can safe
21e50 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e  ly assume that n
21e60 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69  CellKey is 32-bi
21e70 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ts  .  */.  asse
21e80 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
21e90 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
21ea0 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65  ur) );.  nCellKe
21eb0 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  y = sqlite3Btree
21ec0 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72  PayloadSize(pCur
21ed0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43  );.  assert( (nC
21ee0 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f  ellKey & SQLITE_
21ef0 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e  MAX_U32)==(u64)n
21f00 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a  CellKey );..  /*
21f10 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
21f20 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
21f30 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
21f40 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
21f50 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c  eMemInit(&m, db,
21f60 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
21f70 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
21f80 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33  ree(pCur, 0, (u3
21f90 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b  2)nCellKey, &m);
21fa0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
21fb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
21fc0 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  .  /* The index 
21fd0 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e  entry must begin
21fe0 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73   with a header s
21ff0 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ize */.  (void)g
22000 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
22010 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74  m.z, szHdr);.  t
22020 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
22030 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
22040 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20   szHdr==m.n );. 
22050 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a   if( unlikely(sz
22060 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a  Hdr<3 || (int)sz
22070 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20  Hdr>m.n) ){.    
22080 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
22090 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
220a0 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69    /* The last fi
220b0 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  eld of the index
220c0 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e   should be an in
220d0 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49  teger - the ROWI
220e0 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74  D..  ** Verify t
220f0 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  hat the last ent
22100 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  ry really is an 
22110 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76  integer. */.  (v
22120 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
22130 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d  (u8*)&m.z[szHdr-
22140 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a  1], typeRowid);.
22150 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
22160 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65  Rowid==1 );.  te
22170 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
22180 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61  d==2 );.  testca
22190 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33  se( typeRowid==3
221a0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
221b0 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a  typeRowid==4 );.
221c0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
221d0 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65  Rowid==5 );.  te
221e0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
221f0 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61  d==6 );.  testca
22200 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38  se( typeRowid==8
22210 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
22220 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a  typeRowid==9 );.
22230 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74    if( unlikely(t
22240 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79  ypeRowid<1 || ty
22250 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70  peRowid>9 || typ
22260 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20  eRowid==7) ){.  
22270 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
22280 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
22290 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
222a0 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
222b0 7a 65 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a  zes[typeRowid];.
222c0 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33 32    testcase( (u32
222d0 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52  )m.n==szHdr+lenR
222e0 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e  owid );.  if( un
222f0 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c  likely((u32)m.n<
22300 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20  szHdr+lenRowid) 
22310 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
22320 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
22330 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63  ;.  }..  /* Fetc
22340 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66  h the integer of
22350 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
22360 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
22370 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
22380 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e  rialGet((u8*)&m.
22390 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c  z[m.n-lenRowid],
223a0 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b   typeRowid, &v);
223b0 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e  .  *rowid = v.u.
223c0 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  i;.  sqlite3Vdbe
223d0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
223e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
223f0 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
22400 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ere if database 
22410 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
22420 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20 68  tected after m h
22430 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c  as been.  ** all
22440 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74 68  ocated.  Free th
22450 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  e m object and r
22460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
22470 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77  RUPT. */.idx_row
22480 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20  id_corruption:. 
22490 20 74 65 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d   testcase( m.szM
224a0 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71  alloc!=0 );.  sq
224b0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
224c0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
224d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
224e0 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _BKPT;.}../*.** 
224f0 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
22500 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
22510 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
22520 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  C is pointing to
22530 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
22540 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55  key string in pU
22550 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20  npacked.  Write 
22560 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d  into *pRes a num
22570 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e  ber.** that is n
22580 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
22590 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43  r positive if pC
225a0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
225b0 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67  qual to,.** or g
225c0 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70  reater than pUnp
225d0 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53  acked.  Return S
225e0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
225f0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61  ess..**.** pUnpa
22600 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63  cked is either c
22610 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
22620 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
22630 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
22640 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
22650 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
22660 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
22670 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
22680 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
22690 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
226a0 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f    Hence, this ro
226b0 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61  utine only compa
226c0 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73  res the prefixes
226d0 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73   .** of the keys
226e0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69   prior to the fi
226f0 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74  nal rowid, not t
22700 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a  he entire key..*
22710 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
22720 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a  eIdxKeyCompare(.
22730 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
22740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22750 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
22760 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56  onnection */.  V
22770 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20  dbeCursor *pC,  
22780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22790 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
227a0 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
227b0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
227c0 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c  cord *pUnpacked,
227d0 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b         /* Unpack
227e0 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65  ed version of ke
227f0 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20  y */.  int *res 
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22810 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
22820 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
22830 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29  result here */.)
22840 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
22850 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
22860 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
22870 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73  ;.  Mem m;..  as
22880 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79  sert( pC->eCurTy
22890 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
228a0 45 20 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 43  E );.  pCur = pC
228b0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20  ->uc.pCursor;.  
228c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
228d0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
228e0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65  d(pCur) );.  nCe
228f0 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42  llKey = sqlite3B
22900 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28  treePayloadSize(
22910 70 43 75 72 29 3b 0a 20 20 2f 2a 20 6e 43 65 6c  pCur);.  /* nCel
22920 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73  lKey will always
22930 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
22940 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63  d 0xffffffff bec
22950 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a  ause of the way.
22960 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50    ** that btreeP
22970 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
22980 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  d sqlite3GetVari
22990 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65  nt32() are imple
229a0 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  mented */.  if( 
229b0 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e  nCellKey<=0 || n
229c0 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66  CellKey>0x7fffff
229d0 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  ff ){.    *res =
229e0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
229f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
22a00 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  PT;.  }.  sqlite
22a10 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c  3VdbeMemInit(&m,
22a20 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20   db, 0);.  rc = 
22a30 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
22a40 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c  omBtree(pCur, 0,
22a50 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20   (u32)nCellKey, 
22a60 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
22a70 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
22a80 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c    }.  *res = sql
22a90 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
22aa0 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  mpare(m.n, m.z, 
22ab0 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71  pUnpacked);.  sq
22ac0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
22ad0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
22ae0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
22af0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
22b00 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75  ne sets the valu
22b10 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
22b20 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
22b30 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
22b40 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20  e3_changes() on 
22b50 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
22b60 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f  dle 'db'. .*/.vo
22b70 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
22b80 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  tChanges(sqlite3
22b90 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67   *db, int nChang
22ba0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
22bb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
22bc0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
22bd0 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e   db->nChange = n
22be0 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54  Change;.  db->nT
22bf0 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43  otalChange += nC
22c00 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
22c10 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68  Set a flag in th
22c20 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65  e vdbe to update
22c30 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
22c40 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66  ter when it is f
22c50 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72  inalised.** or r
22c60 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eset..*/.void sq
22c70 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68  lite3VdbeCountCh
22c80 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a  anges(Vdbe *v){.
22c90 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e    v->changeCntOn
22ca0 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
22cb0 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72  ark every prepar
22cc0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73  ed statement ass
22cd0 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
22ce0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
22cf0 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64  on.** as expired
22d00 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72  ..**.** An expir
22d10 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61  ed statement mea
22d20 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c  ns that recompil
22d30 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  ation of the sta
22d40 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63  tement is.** rec
22d50 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65  ommend.  Stateme
22d60 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20  nts expire when 
22d70 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68  things happen th
22d80 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a  at make their.**
22d90 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65   programs obsole
22da0 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73  te.  Removing us
22db0 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
22dc0 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e  ions or collatin
22dd0 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20  g.** sequences, 
22de0 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61  or changing an a
22df0 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e  uthorization fun
22e00 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79  ction are the ty
22e10 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73  pes of.** things
22e20 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61   that make prepa
22e30 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  red statements o
22e40 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64  bsolete..*/.void
22e50 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
22e60 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
22e70 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
22e80 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
22e90 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
22ea0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
22eb0 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
22ec0 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
22ed0 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
22ee0 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
22ef0 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f  ith the Vdbe..*/
22f00 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
22f10 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29  3VdbeDb(Vdbe *v)
22f20 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62  {.  return v->db
22f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22f40 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
22f50 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
22f60 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
22f70 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62  ning the value b
22f80 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
22f90 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20  r iVar of VM v. 
22fa0 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76  Except, if the v
22fb0 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e  alue is an SQL N
22fc0 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ULL, return .** 
22fd0 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73  0 instead. Unles
22fe0 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70  s it is NULL, ap
22ff0 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66  ply affinity aff
23000 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c   (one of the SQL
23010 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e  ITE_AFF_*.** con
23020 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76  stants) to the v
23030 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  alue before retu
23040 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  rning it..**.** 
23050 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
23060 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  ue must be freed
23070 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
23080 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75  sing sqlite3Valu
23090 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69  eFree()..*/.sqli
230a0 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74  te3_value *sqlit
230b0 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61  e3VdbeGetBoundVa
230c0 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  lue(Vdbe *v, int
230d0 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a   iVar, u8 aff){.
230e0 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30    assert( iVar>0
230f0 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20   );.  if( v ){. 
23100 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
23110 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b  v->aVar[iVar-1];
23120 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65  .    if( 0==(pMe
23130 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
23140 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ull) ){.      sq
23150 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65  lite3_value *pRe
23160 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  t = sqlite3Value
23170 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20  New(v->db);.    
23180 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
23190 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
231a0 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29  eMemCopy((Mem *)
231b0 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  pRet, pMem);.   
231c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
231d0 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
231e0 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45  Ret, aff, SQLITE
231f0 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a  _UTF8);.      }.
23200 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65        return pRe
23210 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
23220 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
23230 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20  * Configure SQL 
23240 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f  variable iVar so
23250 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20   that binding a 
23260 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20  new value to it 
23270 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71  signals.** to sq
23280 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65  lite3_reoptimize
23290 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61  () that re-prepa
232a0 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ring the stateme
232b0 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a  nt may result.**
232c0 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65   in a better que
232d0 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64  ry plan..*/.void
232e0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
232f0 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20  armask(Vdbe *v, 
23300 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73  int iVar){.  ass
23310 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
23320 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a   if( iVar>32 ){.
23330 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d      v->expmask =
23340 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d   0xffffffff;.  }
23350 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70  else{.    v->exp
23360 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20  mask |= ((u32)1 
23370 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20  << (iVar-1));.  
23380 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
23390 68 65 20 22 75 73 65 73 2d 61 6c 74 2d 6d 61 70  he "uses-alt-map
233a0 22 20 66 6c 61 67 2e 0a 2a 2f 0a 76 6f 69 64 20  " flag..*/.void 
233b0 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 41  sqlite3VdbeUsesA
233c0 6c 74 4d 61 70 28 56 64 62 65 20 2a 76 29 7b 0a  ltMap(Vdbe *v){.
233d0 20 20 76 2d 3e 75 73 65 73 41 6c 74 4d 61 70 20    v->usesAltMap 
233e0 3d 20 31 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53  = 1;.}.#ifndef S
233f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
23400 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72  ALTABLE./*.** Tr
23410 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73  ansfer error mes
23420 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61  sage text from a
23430 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a  n sqlite3_vtab.z
23440 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f  ErrMsg (text sto
23450 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  red.** in memory
23460 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
23470 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69  qlite3_malloc) i
23480 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d  nto a Vdbe.zErrM
23490 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a  sg (text stored.
234a0 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ** in memory obt
234b0 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
234c0 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a  e3DbMalloc)..*/.
234d0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62  void sqlite3Vtab
234e0 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62  ImportErrmsg(Vdb
234f0 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74  e *p, sqlite3_vt
23500 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 69 66  ab *pVtab){.  if
23510 28 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  ( pVtab->zErrMsg
23520 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
23530 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  *db = p->db;.   
23540 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23550 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
23560 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
23570 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
23580 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  (db, pVtab->zErr
23590 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
235a0 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45  3_free(pVtab->zE
235b0 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 56 74 61  rrMsg);.    pVta
235c0 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
235d0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
235e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
235f0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66  UALTABLE */..#if
23600 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
23610 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
23620 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ../*.** If the s
23630 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
23640 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c 65  s not NULL, rele
23650 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69  ase any allocati
23660 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a  ons associated .
23670 2a 2a 20 77 69 74 68 20 74 68 65 20 6d 65 6d 6f  ** with the memo
23680 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20  ry cells in the 
23690 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 2e  p->aMem[] array.
236a0 20 41 6c 73 6f 20 66 72 65 65 20 74 68 65 20 55   Also free the U
236b0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a  npackedRecord.**
236c0 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c   structure itsel
236d0 66 2c 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  f, using sqlite3
236e0 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  DbFree()..**.** 
236f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
23700 20 75 73 65 64 20 74 6f 20 66 72 65 65 20 55 6e   used to free Un
23710 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
23720 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61 74 65  uctures allocate
23730 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 64 62 65  d by.** the vdbe
23740 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66  UnpackRecord() f
23750 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69 6e  unction found in
23760 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73   vdbeapi.c..*/.s
23770 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
23780 72 65 65 55 6e 70 61 63 6b 65 64 28 73 71 6c 69  reeUnpacked(sqli
23790 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 69  te3 *db, int nFi
237a0 65 6c 64 2c 20 55 6e 70 61 63 6b 65 64 52 65 63  eld, UnpackedRec
237b0 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ord *p){.  if( p
237c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
237d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46     for(i=0; i<nF
237e0 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ield; i++){.    
237f0 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
23800 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20  ->aMem[i];.     
23810 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c   if( pMem->zMall
23820 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  oc ) sqlite3Vdbe
23830 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29  MemRelease(pMem)
23840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23850 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
23860 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
23870 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
23880 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a  PREUPDATE_HOOK *
23890 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
238a0 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
238b0 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76  E_HOOK./*.** Inv
238c0 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64 61  oke the pre-upda
238d0 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69 73  te hook. If this
238e0 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72   is an UPDATE or
238f0 20 44 45 4c 45 54 45 20 70 72 65 2d 75 70 64 61   DELETE pre-upda
23900 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e  te call,.** then
23910 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61   cursor passed a
23920 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
23930 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f 69  ument should poi
23940 6e 74 20 74 6f 20 74 68 65 20 72 6f 77 20 61 62  nt to the row ab
23950 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70 64  out.** to be upd
23960 61 74 65 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ate or deleted. 
23970 49 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  If the applicati
23980 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33  on calls sqlite3
23990 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28 29  _preupdate_old()
239a0 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75 69 72 65  ,.** the require
239b0 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20  d value will be 
239c0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72 6f  read from the ro
239d0 77 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  w the cursor poi
239e0 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20  nts to..*/.void 
239f0 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 55 70  sqlite3VdbePreUp
23a00 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62 65  dateHook(.  Vdbe
23a10 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20   *v,            
23a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
23a30 64 62 65 20 70 72 65 2d 75 70 64 61 74 65 20 68  dbe pre-update h
23a40 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 62  ook is invoked b
23a50 79 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  y */.  VdbeCurso
23a60 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20  r *pCsr,        
23a70 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
23a80 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20 76   to grab old.* v
23a90 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20 20  alues from */.  
23aa0 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ac0 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  /* SQLITE_INSERT
23ad0 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
23ae0 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  TE */.  const ch
23af0 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20  ar *zDb,        
23b00 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
23b10 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 61  ase name */.  Ta
23b20 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23b40 20 4d 6f 64 69 66 69 65 64 20 74 61 62 6c 65 20   Modified table 
23b50 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 31 2c 20  */.  i64 iKey1, 
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b70 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
23b80 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  key value */.  i
23b90 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20  nt iReg         
23ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23bb0 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 6e  * Register for n
23bc0 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a 29  ew.* record */.)
23bd0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
23be0 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20 69  = v->db;.  i64 i
23bf0 4b 65 79 32 3b 0a 20 20 50 72 65 55 70 64 61 74  Key2;.  PreUpdat
23c00 65 20 70 72 65 75 70 64 61 74 65 3b 0a 20 20 63  e preupdate;.  c
23c10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20  onst char *zTbl 
23c20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
23c30 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
23c40 20 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 20 3d   fakeSortOrder =
23c50 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64   0;..  assert( d
23c60 62 2d 3e 70 50 72 65 55 70 64 61 74 65 3d 3d 30  b->pPreUpdate==0
23c70 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 72   );.  memset(&pr
23c80 65 75 70 64 61 74 65 2c 20 30 2c 20 73 69 7a 65  eupdate, 0, size
23c90 6f 66 28 50 72 65 55 70 64 61 74 65 29 29 3b 0a  of(PreUpdate));.
23ca0 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
23cb0 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Tab)==0 ){.    i
23cc0 4b 65 79 31 20 3d 20 69 4b 65 79 32 20 3d 20 30  Key1 = iKey2 = 0
23cd0 3b 0a 20 20 20 20 70 72 65 75 70 64 61 74 65 2e  ;.    preupdate.
23ce0 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
23cf0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
23d00 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
23d10 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
23d20 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UPDATE ){.      
23d30 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b  iKey2 = v->aMem[
23d40 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d  iReg].u.i;.    }
23d50 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4b 65 79  else{.      iKey
23d60 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 20 20 7d  2 = iKey1;.    }
23d70 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
23d80 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54  pCsr->nField==pT
23d90 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20 20  ab->nCol .      
23da0 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65 6c   || (pCsr->nFiel
23db0 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20  d==pTab->nCol+1 
23dc0 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45  && op==SQLITE_DE
23dd0 4c 45 54 45 20 26 26 20 69 52 65 67 3d 3d 2d 31  LETE && iReg==-1
23de0 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75 70 64  ).  );..  preupd
23df0 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72 65  ate.v = v;.  pre
23e00 75 70 64 61 74 65 2e 70 43 73 72 20 3d 20 70 43  update.pCsr = pC
23e10 73 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  sr;.  preupdate.
23e20 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75 70  op = op;.  preup
23e30 64 61 74 65 2e 69 4e 65 77 52 65 67 20 3d 20 69  date.iNewReg = i
23e40 52 65 67 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Reg;.  preupdate
23e50 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64 62  .keyinfo.db = db
23e60 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65  ;.  preupdate.ke
23e70 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43 28  yinfo.enc = ENC(
23e80 64 62 29 3b 0a 20 20 70 72 65 75 70 64 61 74 65  db);.  preupdate
23e90 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69 65 6c 64 20  .keyinfo.nField 
23ea0 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  = pTab->nCol;.  
23eb0 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
23ec0 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  o.aSortOrder = (
23ed0 75 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f 72 64  u8*)&fakeSortOrd
23ee0 65 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  er;.  preupdate.
23ef0 69 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20  iKey1 = iKey1;. 
23f00 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 32   preupdate.iKey2
23f10 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72 65 75   = iKey2;.  preu
23f20 70 64 61 74 65 2e 70 54 61 62 20 3d 20 70 54 61  pdate.pTab = pTa
23f30 62 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65 55 70  b;..  db->pPreUp
23f40 64 61 74 65 20 3d 20 26 70 72 65 75 70 64 61 74  date = &preupdat
23f50 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64  e;.  db->xPreUpd
23f60 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  ateCallback(db->
23f70 70 50 72 65 55 70 64 61 74 65 41 72 67 2c 20 64  pPreUpdateArg, d
23f80 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c  b, op, zDb, zTbl
23f90 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b  , iKey1, iKey2);
23fa0 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  .  db->pPreUpdat
23fb0 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
23fc0 44 62 46 72 65 65 28 64 62 2c 20 70 72 65 75 70  DbFree(db, preup
23fd0 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20  date.aRecord);. 
23fe0 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65   vdbeFreeUnpacke
23ff0 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  d(db, preupdate.
24000 6b 65 79 69 6e 66 6f 2e 6e 46 69 65 6c 64 2b 31  keyinfo.nField+1
24010 2c 20 70 72 65 75 70 64 61 74 65 2e 70 55 6e 70  , preupdate.pUnp
24020 61 63 6b 65 64 29 3b 0a 20 20 76 64 62 65 46 72  acked);.  vdbeFr
24030 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20 70  eeUnpacked(db, p
24040 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
24050 2e 6e 46 69 65 6c 64 2b 31 2c 20 70 72 65 75 70  .nField+1, preup
24060 64 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65  date.pNewUnpacke
24070 64 29 3b 0a 20 20 69 66 28 20 70 72 65 75 70 64  d);.  if( preupd
24080 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20  ate.aNew ){.    
24090 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
240a0 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65  =0; i<pCsr->nFie
240b0 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; i++){.      
240c0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
240d0 6c 65 61 73 65 28 26 70 72 65 75 70 64 61 74 65  lease(&preupdate
240e0 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d  .aNew[i]);.    }
240f0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
24100 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74 65  ee(db, preupdate
24110 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .aNew);.  }.}.#e
24120 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
24130 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
24140 48 4f 4f 4b 20 2a 2f 0a                          HOOK */.