/ Hex Artifact Content
Login

Artifact 2f48204a0f2875b098ee046bba9265907297b0b5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64  3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20  b, sizeof(Vdbe) 
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73  return 0;.  mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73  et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73  izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b  etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20  .  p->db = db;. 
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d  {.    db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a  >pPrev = p;.  }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72  >pVdbe;.  p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56  ev = 0;.  db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61  dbe = p;.  p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72  _INIT;.  p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 61  se = pParse;.  a
03e0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
03f0: 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  Label==0 );.  as
0400: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4c  sert( pParse->nL
0410: 61 62 65 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  abel==0 );.  ass
0420: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4f 70  ert( pParse->nOp
0430: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 61 73  Alloc==0 );.  as
0440: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 73 7a  sert( pParse->sz
0450: 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  OpAlloc==0 );.  
0460: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0470: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 65 72  ** Change the er
0480: 72 6f 72 20 73 74 72 69 6e 67 20 73 74 6f 72 65  ror string store
0490: 64 20 69 6e 20 56 64 62 65 2e 7a 45 72 72 4d 73  d in Vdbe.zErrMs
04a0: 67 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  g.*/.void sqlite
04b0: 33 56 64 62 65 45 72 72 6f 72 28 56 64 62 65 20  3VdbeError(Vdbe 
04c0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
04d0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
04e0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 73   va_list ap;.  s
04f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
0500: 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
0510: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
0520: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a  zFormat);.  p->z
0530: 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
0540: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
0550: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
0560: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f  va_end(ap);.}../
0570: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
0580: 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72  e SQL string for
0590: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
05a0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
05b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c  qlite3VdbeSetSql
05c0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
05d0: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
05e0: 69 6e 74 20 69 73 50 72 65 70 61 72 65 56 32 29  int isPrepareV2)
05f0: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 50 72  {.  assert( isPr
0600: 65 70 61 72 65 56 32 3d 3d 31 20 7c 7c 20 69 73  epareV2==1 || is
0610: 50 72 65 70 61 72 65 56 32 3d 3d 30 20 29 3b 0a  PrepareV2==0 );.
0620: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
0630: 75 72 6e 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  urn;.#if defined
0640: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
0650: 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
0660: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
0670: 4c 4c 4f 47 29 0a 20 20 69 66 28 20 21 69 73 50  LLOG).  if( !isP
0680: 72 65 70 61 72 65 56 32 20 29 20 72 65 74 75 72  repareV2 ) retur
0690: 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  n;.#endif.  asse
06a0: 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29  rt( p->zSql==0 )
06b0: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71  ;.  p->zSql = sq
06c0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
06d0: 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70  ->db, z, n);.  p
06e0: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d 20  ->isPrepareV2 = 
06f0: 28 75 38 29 69 73 50 72 65 70 61 72 65 56 32 3b  (u8)isPrepareV2;
0700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 61  .}../*.** Swap a
0710: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74 77 65  ll content betwe
0720: 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74 72 75  en two VDBE stru
0730: 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ctures..*/.void 
0740: 73 71 6c 69 74 65 33 56 64 62 65 53 77 61 70 28  sqlite3VdbeSwap(
0750: 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65 20 2a  Vdbe *pA, Vdbe *
0760: 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d 70 2c  pB){.  Vdbe tmp,
0770: 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72 20 2a   *pTmp;.  char *
0780: 7a 54 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20  zTmp;.  assert( 
0790: 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e 64 62 20 29  pA->db==pB->db )
07a0: 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20  ;.  tmp = *pA;. 
07b0: 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70   *pA = *pB;.  *p
07c0: 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20  B = tmp;.  pTmp 
07d0: 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pA->pNext;.  p
07e0: 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70  A->pNext = pB->p
07f0: 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78  Next;.  pB->pNex
0800: 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70  t = pTmp;.  pTmp
0810: 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20   = pA->pPrev;.  
0820: 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e  pA->pPrev = pB->
0830: 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72  pPrev;.  pB->pPr
0840: 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d  ev = pTmp;.  zTm
0850: 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20  p = pA->zSql;.  
0860: 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a  pA->zSql = pB->z
0870: 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20  Sql;.  pB->zSql 
0880: 3d 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73  = zTmp;.  pB->is
0890: 50 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e  PrepareV2 = pA->
08a0: 69 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a  isPrepareV2;.}..
08b0: 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65  /*.** Resize the
08c0: 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20   Vdbe.aOp array 
08d0: 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74  so that it is at
08e0: 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65   least nOp eleme
08f0: 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74  nts larger .** t
0900: 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20  han its current 
0910: 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61  size. nOp is gua
0920: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65  ranteed to be le
0930: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
0940: 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65  .** to 1024/size
0950: 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  of(Op)..**.** If
0960: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
0970: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
0980: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
0990: 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a  e array, return.
09a0: 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
09b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64   In this case Vd
09c0: 62 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65  be.aOp and Parse
09d0: 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e  .nOpAlloc remain
09e0: 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28   .** unchanged (
09f0: 74 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20  this is so that 
0a00: 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65  any opcodes alre
0a10: 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61  ady allocated ca
0a20: 6e 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74  n be .** correct
0a30: 6c 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61  ly deallocated a
0a40: 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65  long with the re
0a50: 73 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e  st of the Vdbe).
0a60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
0a70: 72 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20  rowOpArray(Vdbe 
0a80: 2a 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  *v, int nOp){.  
0a90: 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20  VdbeOp *pNew;.  
0aa0: 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50  Parse *p = v->pP
0ab0: 61 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  arse;..  /* The 
0ac0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0ad0: 4c 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69  LOC_STRESS compi
0ae0: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
0af0: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f  s designed to fo
0b00: 72 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72  rce.  ** more fr
0b10: 65 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20  equent reallocs 
0b20: 61 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64  and hence provid
0b30: 65 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  e more opportuni
0b40: 74 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73  ties for .  ** s
0b50: 69 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75  imulated OOM fau
0b60: 6c 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53  lts.  SQLITE_TES
0b70: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
0b80: 20 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73   is generally us
0b90: 65 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74  ed.  ** during t
0ba0: 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69  esting only.  Wi
0bb0: 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  th SQLITE_TEST_R
0bc0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72  EALLOC_STRESS gr
0bd0: 6f 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a  ow the op array.
0be0: 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69    ** by the mini
0bf0: 6d 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75  mum* amount requ
0c00: 69 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73  ired until the s
0c10: 69 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e  ize reaches 512.
0c20: 20 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70    Normal.  ** op
0c30: 65 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74  eration (without
0c40: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0c50: 4c 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20  LLOC_STRESS) is 
0c60: 74 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75  to double the cu
0c70: 72 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20  rrent.  ** size 
0c80: 6f 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20  of the op array 
0c90: 6f 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70  or add 1KB of sp
0ca0: 61 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69  ace, whichever i
0cb0: 73 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69  s smaller. */.#i
0cc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
0cd0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a  _REALLOC_STRESS.
0ce0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0cf0: 3e 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f  >nOpAlloc>=512 ?
0d00: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a   p->nOpAlloc*2 :
0d10: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70   p->nOpAlloc+nOp
0d20: 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e  );.#else.  int n
0d30: 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c  New = (p->nOpAll
0d40: 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  oc ? p->nOpAlloc
0d50: 2a 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f  *2 : (int)(1024/
0d60: 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20  sizeof(Op)));.  
0d70: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
0d80: 28 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  (nOp);.#endif.. 
0d90: 20 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31   assert( nOp<=(1
0da0: 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20  024/sizeof(Op)) 
0db0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
0dc0: 77 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b  w>=(p->nOpAlloc+
0dd0: 6e 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d  nOp) );.  pNew =
0de0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
0df0: 63 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c  c(p->db, v->aOp,
0e00: 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29   nNew*sizeof(Op)
0e10: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  );.  if( pNew ){
0e20: 0a 20 20 20 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f  .    p->szOpAllo
0e30: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
0e40: 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70  locSize(p->db, p
0e50: 4e 65 77 29 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70  New);.    p->nOp
0e60: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 73 7a 4f 70 41  Alloc = p->szOpA
0e70: 6c 6c 6f 63 2f 73 69 7a 65 6f 66 28 4f 70 29 3b  lloc/sizeof(Op);
0e80: 0a 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e  .    v->aOp = pN
0e90: 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ew;.  }.  return
0ea0: 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f   (pNew ? SQLITE_
0eb0: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  OK : SQLITE_NOME
0ec0: 4d 5f 42 4b 50 54 29 3b 0a 7d 0a 0a 23 69 66 64  M_BKPT);.}..#ifd
0ed0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
0ee0: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
0ef0: 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e  is just a conven
0f00: 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65  ient place to se
0f10: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 74  t a breakpoint t
0f20: 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 66 69 72 65  hat will.** fire
0f30: 20 61 66 74 65 72 20 65 61 63 68 20 6f 70 63 6f   after each opco
0f40: 64 65 20 69 73 20 69 6e 73 65 72 74 65 64 20 61  de is inserted a
0f50: 6e 64 20 64 69 73 70 6c 61 79 65 64 20 75 73 69  nd displayed usi
0f60: 6e 67 0a 2a 2a 20 22 50 52 41 47 4d 41 20 76 64  ng.** "PRAGMA vd
0f70: 62 65 5f 61 64 64 6f 70 74 72 61 63 65 3d 6f 6e  be_addoptrace=on
0f80: 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  "..*/.static voi
0f90: 64 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65  d test_addop_bre
0fa0: 61 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20  akpoint(void){. 
0fb0: 20 73 74 61 74 69 63 20 69 6e 74 20 6e 20 3d 20   static int n = 
0fc0: 30 3b 0a 20 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64  0;.  n++;.}.#end
0fd0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  if../*.** Add a 
0fe0: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  new instruction 
0ff0: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
1000: 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72  nstructions curr
1010: 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44  ent in the.** VD
1020: 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  BE.  Return the 
1030: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
1040: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ew instruction..
1050: 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73  **.** Parameters
1060: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20  :.**.**    p    
1070: 20 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74             Point
1080: 65 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a  er to the VDBE.*
1090: 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20  *.**    op      
10a0: 20 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f          The opco
10b0: 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74  de for this inst
10c0: 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  ruction.**.**   
10d0: 20 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20   p1, p2, p3     
10e0: 20 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20   Operands.**.** 
10f0: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56  Use the sqlite3V
1100: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1110: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69  ) function to fi
1120: 78 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64  x an address and
1130: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56  .** the sqlite3V
1140: 64 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75  dbeChangeP4() fu
1150: 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65  nction to change
1160: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1170: 65 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e  e P4.** operand.
1180: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
1190: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 67  E_NOINLINE int g
11a0: 72 6f 77 4f 70 33 28 56 64 62 65 20 2a 70 2c 20  rowOp3(Vdbe *p, 
11b0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20  int op, int p1, 
11c0: 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b  int p2, int p3){
11d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
11e0: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d  arse->nOpAlloc<=
11f0: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20  p->nOp );.  if( 
1200: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31  growOpArray(p, 1
1210: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
1220: 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 72 73  assert( p->pPars
1230: 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 70 2d 3e 6e  e->nOpAlloc>p->n
1240: 4f 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  Op );.  return s
1250: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1260: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1270: 70 33 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  p3);.}.int sqlit
1280: 65 33 56 64 62 65 41 64 64 4f 70 33 28 56 64 62  e3VdbeAddOp3(Vdb
1290: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
12a0: 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e  t p1, int p2, in
12b0: 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  t p3){.  int i;.
12c0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a    VdbeOp *pOp;..
12d0: 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20    i = p->nOp;.  
12e0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
12f0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
1300: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  T );.  assert( o
1310: 70 3e 3d 30 20 26 26 20 6f 70 3c 30 78 66 66 20  p>=0 && op<0xff 
1320: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 61 72  );.  if( p->pPar
1330: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20  se->nOpAlloc<=i 
1340: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 67 72  ){.    return gr
1350: 6f 77 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  owOp3(p, op, p1,
1360: 20 70 32 2c 20 70 33 29 3b 0a 20 20 7d 0a 20 20   p2, p3);.  }.  
1370: 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20  p->nOp++;.  pOp 
1380: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
1390: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75  pOp->opcode = (u
13a0: 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20  8)op;.  pOp->p5 
13b0: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d  = 0;.  pOp->p1 =
13c0: 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d   p1;.  pOp->p2 =
13d0: 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d   p2;.  pOp->p3 =
13e0: 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70   p3;.  pOp->p4.p
13f0: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74   = 0;.  pOp->p4t
1400: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
1410: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1420: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
1430: 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a  OMMENTS.  pOp->z
1440: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e  Comment = 0;.#en
1450: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1460: 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d  E_DEBUG.  if( p-
1470: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1480: 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
1490: 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a  ce ){.    int jj
14a0: 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65 20  , kk;.    Parse 
14b0: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
14c0: 72 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d  rse;.    for(jj=
14d0: 6b 6b 3d 30 3b 20 6a 6a 3c 70 50 61 72 73 65 2d  kk=0; jj<pParse-
14e0: 3e 6e 43 6f 6c 43 61 63 68 65 3b 20 6a 6a 2b 2b  >nColCache; jj++
14f0: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1500: 79 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20 70  yColCache *x = p
1510: 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
1520: 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 70 72 69   + jj;.      pri
1530: 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b 25 64 3a  ntf(" r[%d]={%d:
1540: 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67 2c 20 78  %d}", x->iReg, x
1550: 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e 69 43 6f  ->iTable, x->iCo
1560: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 6b 6b 2b  lumn);.      kk+
1570: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
1580: 20 6b 6b 20 29 20 70 72 69 6e 74 66 28 22 5c 6e   kk ) printf("\n
1590: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ");.    sqlite3V
15a0: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c  dbePrintOp(0, i,
15b0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
15c0: 20 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65    test_addop_bre
15d0: 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a 23  akpoint();.  }.#
15e0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42  endif.#ifdef VDB
15f0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d  E_PROFILE.  pOp-
1600: 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70  >cycles = 0;.  p
1610: 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e  Op->cnt = 0;.#en
1620: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
1630: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
1640: 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65 20    pOp->iSrcLine 
1650: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  = 0;.#endif.  re
1660: 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71  turn i;.}.int sq
1670: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
1680: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29  Vdbe *p, int op)
1690: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
16a0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
16b0: 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a  op, 0, 0, 0);.}.
16c0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
16d0: 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69  ddOp1(Vdbe *p, i
16e0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a  nt op, int p1){.
16f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1700: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
1710: 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69  , p1, 0, 0);.}.i
1720: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1730: 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp2(Vdbe *p, in
1740: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
1750: 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20  t p2){.  return 
1760: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1770: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1780: 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72   0);.}../* Gener
1790: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e 20  ate code for an 
17a0: 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a 75  unconditional ju
17b0: 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69 6f  mp to instructio
17c0: 6e 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73  n iDest.*/.int s
17d0: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 56  qlite3VdbeGoto(V
17e0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73  dbe *p, int iDes
17f0: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  t){.  return sql
1800: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1810: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 44  , OP_Goto, 0, iD
1820: 65 73 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47  est, 0);.}../* G
1830: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1840: 63 61 75 73 65 20 74 68 65 20 73 74 72 69 6e 67  cause the string
1850: 20 7a 53 74 72 20 74 6f 20 62 65 20 6c 6f 61 64   zStr to be load
1860: 65 64 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73  ed into.** regis
1870: 74 65 72 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74  ter iDest.*/.int
1880: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61 64   sqlite3VdbeLoad
1890: 53 74 72 69 6e 67 28 56 64 62 65 20 2a 70 2c 20  String(Vdbe *p, 
18a0: 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74  int iDest, const
18b0: 20 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20 20   char *zStr){.  
18c0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
18d0: 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f 53  beAddOp4(p, OP_S
18e0: 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73 74  tring8, 0, iDest
18f0: 2c 20 30 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 7d  , 0, zStr, 0);.}
1900: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1910: 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74 69   code that initi
1920: 61 6c 69 7a 65 73 20 6d 75 6c 74 69 70 6c 65 20  alizes multiple 
1930: 72 65 67 69 73 74 65 72 73 20 74 6f 20 73 74 72  registers to str
1940: 69 6e 67 20 6f 72 20 69 6e 74 65 67 65 72 0a 2a  ing or integer.*
1950: 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68  * constants.  Th
1960: 65 20 72 65 67 69 73 74 65 72 73 20 62 65 67 69  e registers begi
1970: 6e 20 77 69 74 68 20 69 44 65 73 74 20 61 6e 64  n with iDest and
1980: 20 69 6e 63 72 65 61 73 65 20 63 6f 6e 73 65 63   increase consec
1990: 75 74 69 76 65 6c 79 2e 0a 2a 2a 20 4f 6e 65 20  utively..** One 
19a0: 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74  register is init
19b0: 69 61 6c 69 7a 65 64 20 66 6f 72 20 65 61 63 68  ialized for each
19c0: 20 63 68 61 72 61 63 67 74 65 72 20 69 6e 20 7a   characgter in z
19d0: 54 79 70 65 73 5b 5d 2e 20 20 46 6f 72 20 65 61  Types[].  For ea
19e0: 63 68 0a 2a 2a 20 22 73 22 20 63 68 61 72 61 63  ch.** "s" charac
19f0: 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c  ter in zTypes[],
1a00: 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69 73   the register is
1a10: 20 61 20 73 74 72 69 6e 67 20 69 66 20 74 68 65   a string if the
1a20: 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20   argument is.** 
1a30: 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 72 20 4f 50 5f  not NULL, or OP_
1a40: 4e 75 6c 6c 20 69 66 20 74 68 65 20 76 61 6c 75  Null if the valu
1a50: 65 20 69 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  e is a null poin
1a60: 74 65 72 2e 20 20 46 6f 72 20 65 61 63 68 20 22  ter.  For each "
1a70: 69 22 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  i" character.** 
1a80: 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65  in zTypes[], the
1a90: 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
1aa0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6e 20 69  tialized to an i
1ab0: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20  nteger..*/.void 
1ac0: 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74 69  sqlite3VdbeMulti
1ad0: 4c 6f 61 64 28 56 64 62 65 20 2a 70 2c 20 69 6e  Load(Vdbe *p, in
1ae0: 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63  t iDest, const c
1af0: 68 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e  har *zTypes, ...
1b00: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
1b10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
1b20: 20 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61   c;.  va_start(a
1b30: 70 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20 66 6f  p, zTypes);.  fo
1b40: 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54 79 70  r(i=0; (c = zTyp
1b50: 65 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b  es[i])!=0; i++){
1b60: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 73 27 20  .    if( c=='s' 
1b70: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
1b80: 68 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72 67 28  har *z = va_arg(
1b90: 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  ap, const char*)
1ba0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1bb0: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 7a 3d 3d  dbeAddOp4(p, z==
1bc0: 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50  0 ? OP_Null : OP
1bd0: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65  _String8, 0, iDe
1be0: 73 74 2b 2b 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a  st++, 0, z, 0);.
1bf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c00: 20 61 73 73 65 72 74 28 20 63 3d 3d 27 69 27 20   assert( c=='i' 
1c10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c20: 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50  VdbeAddOp2(p, OP
1c30: 5f 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67  _Integer, va_arg
1c40: 28 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74  (ap, int), iDest
1c50: 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ++);.    }.  }. 
1c60: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a   va_end(ap);.}..
1c70: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63  /*.** Add an opc
1c80: 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65  ode that include
1c90: 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61  s the p4 value a
1ca0: 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  s a pointer..*/.
1cb0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1cc0: 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70  ddOp4(.  Vdbe *p
1cd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1ce0: 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74  Add the opcode t
1cf0: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
1d00: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
1d10: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70     /* The new op
1d20: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31  code */.  int p1
1d30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1d40: 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20   The P1 operand 
1d50: 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20  */.  int p2,    
1d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d70: 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P2 operand */.  
1d80: 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20  int p3,         
1d90: 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70      /* The P3 op
1da0: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
1db0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f   char *zP4,    /
1dc0: 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64  * The P4 operand
1dd0: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65   */.  int p4type
1de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20            /* P4 
1df0: 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a  operand type */.
1e00: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  ){.  int addr = 
1e10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e20: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1e30: 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   p3);.  sqlite3V
1e40: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
1e50: 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65  ddr, zP4, p4type
1e60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1e70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1e80: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
1e90: 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61  cludes the p4 va
1ea0: 6c 75 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e  lue with a P4_IN
1eb0: 54 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45 41  T64 or.** P4_REA
1ec0: 4c 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73  L type..*/.int s
1ed0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1ee0: 44 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c  Dup8(.  Vdbe *p,
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1f00: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
1f10: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
1f20: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
1f30: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
1f40: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f60: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1f70: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1f80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1f90: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1fa0: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1fb0: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1fc0: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1fd0: 75 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a  u8 *zP4,      /*
1fe0: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1ff0: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
2000: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
2010: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
2020: 7b 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79  {.  char *p4copy
2030: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2040: 6f 63 52 61 77 4e 4e 28 73 71 6c 69 74 65 33 56  ocRawNN(sqlite3V
2050: 64 62 65 44 62 28 70 29 2c 20 38 29 3b 0a 20 20  dbeDb(p), 8);.  
2060: 69 66 28 20 70 34 63 6f 70 79 20 29 20 6d 65 6d  if( p4copy ) mem
2070: 63 70 79 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c  cpy(p4copy, zP4,
2080: 20 38 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71   8);.  return sq
2090: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
20a0: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
20b0: 33 2c 20 70 34 63 6f 70 79 2c 20 70 34 74 79 70  3, p4copy, p4typ
20c0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  e);.}../*.** Add
20d0: 20 61 6e 20 4f 50 5f 50 61 72 73 65 53 63 68 65   an OP_ParseSche
20e0: 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  ma opcode.  This
20f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 62 72 6f 6b   routine is brok
2100: 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73  en out from.** s
2110: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2120: 28 29 20 73 69 6e 63 65 20 69 74 20 6e 65 65 64  () since it need
2130: 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20  s to also needs 
2140: 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65  to mark all btre
2150: 65 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67 20  es.** as having 
2160: 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  been used..**.**
2170: 20 54 68 65 20 7a 57 68 65 72 65 20 73 74 72 69   The zWhere stri
2180: 6e 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ng must have bee
2190: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  n obtained from 
21a0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
21b0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
21c0: 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65  e will take owne
21d0: 72 73 68 69 70 20 6f 66 20 74 68 65 20 61 6c 6c  rship of the all
21e0: 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a  ocated memory..*
21f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
2200: 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61  beAddParseSchema
2210: 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Op(Vdbe *p, int 
2220: 69 44 62 2c 20 63 68 61 72 20 2a 7a 57 68 65 72  iDb, char *zWher
2230: 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 73  e){.  int j;.  s
2240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2250: 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (p, OP_ParseSche
2260: 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 7a  ma, iDb, 0, 0, z
2270: 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d 49  Where, P4_DYNAMI
2280: 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  C);.  for(j=0; j
2290: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b  <p->db->nDb; j++
22a0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  ) sqlite3VdbeUse
22b0: 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d 0a  sBtree(p, j);.}.
22c0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
22d0: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
22e0: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
22f0: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  as an integer..*
2300: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2310: 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56 64  eAddOp4Int(.  Vd
2320: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
2330: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63    /* Add the opc
2340: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a  ode to this VM *
2350: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
2360: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
2370: 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  ew opcode */.  i
2380: 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20  nt p1,          
2390: 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65     /* The P1 ope
23a0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32  rand */.  int p2
23b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
23c0: 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   The P2 operand 
23d0: 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20  */.  int p3,    
23e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23f0: 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P3 operand */.  
2400: 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20 20  int p4          
2410: 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70      /* The P4 op
2420: 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74 65  erand as an inte
2430: 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ger */.){.  int 
2440: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2450: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
2460: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 69  p1, p2, p3);.  i
2470: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
2480: 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
2490: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
24a0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
24b0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
24c0: 50 34 5f 49 4e 54 33 32 3b 0a 20 20 20 20 70 4f  P4_INT32;.    pO
24d0: 70 2d 3e 70 34 2e 69 20 3d 20 70 34 3b 0a 20 20  p->p4.i = p4;.  
24e0: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
24f0: 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74 20 74 68  .}../* Insert th
2500: 65 20 65 6e 64 20 6f 66 20 61 20 63 6f 2d 72 6f  e end of a co-ro
2510: 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64 20 73 71  utine.*/.void sq
2520: 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
2530: 75 74 69 6e 65 28 56 64 62 65 20 2a 76 2c 20 69  utine(Vdbe *v, i
2540: 6e 74 20 72 65 67 59 69 65 6c 64 29 7b 0a 20 20  nt regYield){.  
2550: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2560: 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75  1(v, OP_EndCorou
2570: 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b  tine, regYield);
2580: 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65  ..  /* Clear the
2590: 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
25a0: 74 65 72 20 63 61 63 68 65 2c 20 74 68 65 72 65  ter cache, there
25b0: 62 79 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74  by ensuring that
25c0: 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f 2d 72 6f   each.  ** co-ro
25d0: 75 74 69 6e 65 20 68 61 73 20 69 74 73 20 6f 77  utine has its ow
25e0: 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65  n independent se
25f0: 74 20 6f 66 20 72 65 67 69 73 74 65 72 73 2c 20  t of registers, 
2600: 62 65 63 61 75 73 65 20 63 6f 2d 72 6f 75 74 69  because co-routi
2610: 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68 74 20 65  nes.  ** might e
2620: 78 70 65 63 74 20 74 68 65 69 72 20 72 65 67 69  xpect their regi
2630: 73 74 65 72 73 20 74 6f 20 62 65 20 70 72 65 73  sters to be pres
2640: 65 72 76 65 64 20 61 63 72 6f 73 73 20 61 6e 20  erved across an 
2650: 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64 0a 20 20  OP_Yield, and.  
2660: 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64 20 63 61  ** that could ca
2670: 75 73 65 20 70 72 6f 62 6c 65 6d 73 20 69 66 20  use problems if 
2680: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 2d 72  two or more co-r
2690: 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 69 6e  outines are usin
26a0: 67 20 74 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20  g the same.  ** 
26b0: 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74  temporary regist
26c0: 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d 3e 70 50  er..  */.  v->pP
26d0: 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d  arse->nTempReg =
26e0: 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72 73 65 2d   0;.  v->pParse-
26f0: 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a  >nRangeReg = 0;.
2700: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2710: 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c  a new symbolic l
2720: 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74  abel for an inst
2730: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  ruction that has
2740: 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f   yet to be.** co
2750: 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c  ded.  The symbol
2760: 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c  ic label is real
2770: 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69  ly just a negati
2780: 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a  ve number.  The.
2790: 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20  ** label can be 
27a0: 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76  used as the P2 v
27b0: 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61  alue of an opera
27c0: 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68  tion.  Later, wh
27d0: 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  en.** the label 
27e0: 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61  is resolved to a
27f0: 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73   specific addres
2800: 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c  s, the VDBE will
2810: 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68   scan.** through
2820: 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c   its operation l
2830: 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61  ist and change a
2840: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20  ll values of P2 
2850: 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74  which match.** t
2860: 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68  he label into th
2870: 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65  e resolved addre
2880: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  ss..**.** The VD
2890: 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20  BE knows that a 
28a0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
28b0: 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65  bel because labe
28c0: 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73  ls are.** always
28d0: 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32   negative and P2
28e0: 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70   values are supp
28f0: 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65  ose to be non-ne
2900: 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65  gative..** Hence
2910: 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  , a negative P2 
2920: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
2930: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
2940: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a   be resolved..**
2950: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
2960: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2970: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74  () fails..*/.int
2980: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2990: 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29 7b 0a  Label(Vdbe *v){.
29a0: 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e    Parse *p = v->
29b0: 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 20  pParse;.  int i 
29c0: 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20  = p->nLabel++;. 
29d0: 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69   assert( v->magi
29e0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
29f0: 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69 20 26  IT );.  if( (i &
2a00: 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20   (i-1))==0 ){.  
2a10: 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71    p->aLabel = sq
2a20: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
2a30: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Free(p->db, p->a
2a40: 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20  Label, .        
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2a70: 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d  i*2+1)*sizeof(p-
2a80: 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20  >aLabel[0]));.  
2a90: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  }.  if( p->aLabe
2aa0: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
2ab0: 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a  el[i] = -1;.  }.
2ac0: 20 20 72 65 74 75 72 6e 20 41 44 44 52 28 69 29    return ADDR(i)
2ad0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
2ae0: 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20  ve label "x" to 
2af0: 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  be the address o
2b00: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
2b10: 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20  uction to.** be 
2b20: 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70  inserted.  The p
2b30: 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73  arameter "x" mus
2b40: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
2b50: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  ined from.** a p
2b60: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
2b70: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2b80: 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  l()..*/.void sql
2b90: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2ba0: 61 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e  abel(Vdbe *v, in
2bb0: 74 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  t x){.  Parse *p
2bc0: 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = v->pParse;.  
2bd0: 69 6e 74 20 6a 20 3d 20 41 44 44 52 28 78 29 3b  int j = ADDR(x);
2be0: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
2bf0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2c00: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
2c10: 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  ( j<p->nLabel );
2c20: 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20  .  assert( j>=0 
2c30: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62  );.  if( p->aLab
2c40: 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61  el ){.    p->aLa
2c50: 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b  bel[j] = v->nOp;
2c60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
2c70: 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f  rk the VDBE as o
2c80: 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79  ne that can only
2c90: 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65   be run one time
2ca0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2cb0: 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65  3VdbeRunOnlyOnce
2cc0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
2cd0: 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b  runOnlyOnce = 1;
2ce0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74  .}../*.** Mark t
2cf0: 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74  he VDBE as one t
2d00: 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  hat can only be 
2d10: 72 75 6e 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  run multiple tim
2d20: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
2d30: 74 65 33 56 64 62 65 52 65 75 73 61 62 6c 65 28  te3VdbeReusable(
2d40: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
2d50: 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 30 3b 0a  unOnlyOnce = 0;.
2d60: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2d70: 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65  _DEBUG /* sqlite
2d80: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
2d90: 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a  ) logic */../*.*
2da0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2db0: 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f  type and functio
2dc0: 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74  n are used to it
2dd0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
2de0: 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20  l opcodes.** in 
2df0: 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67  a Vdbe main prog
2e00: 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20  ram and each of 
2e10: 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73  the sub-programs
2e20: 20 28 74 72 69 67 67 65 72 73 29 20 69 74 20 6d   (triggers) it m
2e30: 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69  ay .** invoke di
2e40: 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65  rectly or indire
2e50: 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20  ctly. It should 
2e60: 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f  be used as follo
2e70: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a  ws:.**.**   Op *
2e80: 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70  pOp;.**   VdbeOp
2e90: 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a  Iter sIter;.**.*
2ea0: 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65  *   memset(&sIte
2eb0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74  r, 0, sizeof(sIt
2ec0: 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72  er));.**   sIter
2ed0: 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20  .v = v;         
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef0: 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79     // v is of ty
2f00: 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77  pe Vdbe* .**   w
2f10: 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49  hile( (pOp = opI
2f20: 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29  terNext(&sIter))
2f30: 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f   ){.**     // Do
2f40: 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20   something with 
2f50: 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20  pOp.**   }.**   
2f60: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d  sqlite3DbFree(v-
2f70: 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62  >db, sIter.apSub
2f80: 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65  );.** .*/.typede
2f90: 66 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 49  f struct VdbeOpI
2fa0: 74 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a  ter VdbeOpIter;.
2fb0: 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65  struct VdbeOpIte
2fc0: 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20  r {.  Vdbe *v;  
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72   /* Vdbe to iter
2ff0: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
3000: 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20  opcodes of */.  
3010: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53  SubProgram **apS
3020: 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72  ub;        /* Ar
3030: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
3040: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  ms */.  int nSub
3050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3060: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3070: 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 62  entries in apSub
3080: 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b   */.  int iAddr;
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
30b0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
30c0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
30d0: 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 20  nt iSub;        
30e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d            /* 0 =
30f0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31   main program, 1
3100: 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f   = first sub-pro
3110: 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a  gram etc. */.};.
3120: 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65  static Op *opIte
3130: 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 72  rNext(VdbeOpIter
3140: 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20   *p){.  Vdbe *v 
3150: 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52  = p->v;.  Op *pR
3160: 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f  et = 0;.  Op *aO
3170: 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20  p;.  int nOp;.. 
3180: 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d   if( p->iSub<=p-
3190: 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66  >nSub ){..    if
31a0: 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a  ( p->iSub==0 ){.
31b0: 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61        aOp = v->a
31c0: 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20  Op;.      nOp = 
31d0: 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73  v->nOp;.    }els
31e0: 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70  e{.      aOp = p
31f0: 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d  ->apSub[p->iSub-
3200: 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e  1]->aOp;.      n
3210: 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d  Op = p->apSub[p-
3220: 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20  >iSub-1]->nOp;. 
3230: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
3240: 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b   p->iAddr<nOp );
3250: 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f  ..    pRet = &aO
3260: 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20  p[p->iAddr];.   
3270: 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20   p->iAddr++;.   
3280: 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e   if( p->iAddr==n
3290: 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  Op ){.      p->i
32a0: 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e  Sub++;.      p->
32b0: 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d  iAddr = 0;.    }
32c0: 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 74  .  .    if( pRet
32d0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
32e0: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
32f0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d   int nByte = (p-
3300: 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28  >nSub+1)*sizeof(
3310: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
3320: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
3330: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
3340: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
3350: 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b     if( p->apSub[
3360: 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72  j]==pRet->p4.pPr
3370: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
3380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
3390: 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20   j==p->nSub ){. 
33a0: 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20         p->apSub 
33b0: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
33c0: 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20  ocOrFree(v->db, 
33d0: 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29  p->apSub, nByte)
33e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
33f0: 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20  ->apSub ){.     
3400: 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20       pRet = 0;. 
3410: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
3420: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62          p->apSub
3430: 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52  [p->nSub++] = pR
3440: 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b  et->p4.pProgram;
3450: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3460: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
3470: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
3480: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74  /*.** Check if t
3490: 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65  he program store
34a0: 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f  d in the VM asso
34b0: 63 69 61 74 65 64 20 77 69 74 68 20 70 50 61 72  ciated with pPar
34c0: 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20  se may.** throw 
34d0: 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69  an ABORT excepti
34e0: 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 20  on (causing the 
34f0: 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e  statement, but n
3500: 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  ot entire transa
3510: 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72  ction.** to be r
3520: 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69  olled back). Thi
3530: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74  s condition is t
3540: 72 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  rue if the main 
3550: 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a  program or any.*
3560: 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63  * sub-programs c
3570: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74  ontains any of t
3580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
3590: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
35a0: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
35b0: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
35c0: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
35d0: 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c   *  OP_HaltIfNul
35e0: 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45  l with P1=SQLITE
35f0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20  _CONSTRAINT and 
3600: 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20  P2=OE_Abort..** 
3610: 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a    *  OP_Destroy.
3620: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61  **   *  OP_VUpda
3630: 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52  te.**   *  OP_VR
3640: 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  ename.**   *  OP
3650: 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20  _FkCounter with 
3660: 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65  P2==0 (immediate
3670: 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
3680: 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20 2a 20  straint).**   * 
3690: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20   OP_CreateTable 
36a0: 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  and OP_InitCorou
36b0: 74 69 6e 65 20 28 66 6f 72 20 43 52 45 41 54 45  tine (for CREATE
36c0: 20 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43 54   TABLE AS SELECT
36d0: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e   ...).**.** Then
36e0: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
36f0: 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d  value of Parse.m
3700: 61 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20  ayAbort is true 
3710: 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d  if an.** ABORT m
3720: 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72  ay be thrown, or
3730: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
3740: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  . Return true if
3750: 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63   it does.** matc
3760: 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  h, or false othe
3770: 72 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63  rwise. This func
3780: 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64  tion is intended
3790: 20 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a   to be used as.*
37a0: 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  * part of an ass
37b0: 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  ert statement in
37c0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53   the compiler. S
37d0: 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a  imilar to:.**.**
37e0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
37f0: 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41  e3VdbeAssertMayA
3800: 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64  bort(pParse->pVd
3810: 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41  be, pParse->mayA
3820: 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20  bort) );.*/.int 
3830: 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72  sqlite3VdbeAsser
3840: 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a  tMayAbort(Vdbe *
3850: 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29  v, int mayAbort)
3860: 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74  {.  int hasAbort
3870: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 46   = 0;.  int hasF
3880: 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20  kCounter = 0;.  
3890: 69 6e 74 20 68 61 73 43 72 65 61 74 65 54 61 62  int hasCreateTab
38a0: 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61  le = 0;.  int ha
38b0: 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d  sInitCoroutine =
38c0: 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20   0;.  Op *pOp;. 
38d0: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
38e0: 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74  r;.  memset(&sIt
38f0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49  er, 0, sizeof(sI
3900: 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76  ter));.  sIter.v
3910: 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = v;..  while( 
3920: 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78  (pOp = opIterNex
3930: 74 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b  t(&sIter))!=0 ){
3940: 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20  .    int opcode 
3950: 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20  = pOp->opcode;. 
3960: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
3970: 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63  P_Destroy || opc
3980: 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20  ode==OP_VUpdate 
3990: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52  || opcode==OP_VR
39a0: 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20 28  ename .     || (
39b0: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74  (opcode==OP_Halt
39c0: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48   || opcode==OP_H
39d0: 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20  altIfNull) .    
39e0: 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30    && ((pOp->p1&0
39f0: 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
3a00: 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
3a10: 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20  p2==OE_Abort)). 
3a20: 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41     ){.      hasA
3a30: 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  bort = 1;.      
3a40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3a50: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
3a60: 43 72 65 61 74 65 54 61 62 6c 65 20 29 20 68 61  CreateTable ) ha
3a70: 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 31  sCreateTable = 1
3a80: 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  ;.    if( opcode
3a90: 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  ==OP_InitCorouti
3aa0: 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f 72 6f  ne ) hasInitCoro
3ab0: 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66 6e 64  utine = 1;.#ifnd
3ac0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
3ad0: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 69  OREIGN_KEY.    i
3ae0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b  f( opcode==OP_Fk
3af0: 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d 3e  Counter && pOp->
3b00: 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32  p1==0 && pOp->p2
3b10: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68 61 73  ==1 ){.      has
3b20: 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b 0a 20  FkCounter = 1;. 
3b30: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
3b40: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3b50: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
3b60: 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  ub);..  /* Retur
3b70: 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f  n true if hasAbo
3b80: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72  rt==mayAbort. Or
3b90: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
3ba0: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
3bb0: 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61   ** If malloc fa
3bc0: 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77  iled, then the w
3bd0: 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76  hile() loop abov
3be0: 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69  e may not have i
3bf0: 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72  terated.  ** thr
3c00: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
3c10: 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61   and hasAbort ma
3c20: 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65  y be set incorre
3c30: 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a  ctly. Return.  *
3c40: 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20  * true for this 
3c50: 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20  case to prevent 
3c60: 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20  the assert() in 
3c70: 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d  the callers fram
3c80: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c  e.  ** from fail
3c90: 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  ing.  */.  retur
3ca0: 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  n ( v->db->mallo
3cb0: 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62  cFailed || hasAb
3cc0: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 7c 7c  ort==mayAbort ||
3cd0: 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a 20 20   hasFkCounter.  
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
3cf0: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 26  hasCreateTable &
3d00: 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69  & hasInitCorouti
3d10: 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ne) );.}.#endif 
3d20: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
3d30: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73  - the sqlite3Ass
3d40: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75  ertMayAbort() fu
3d50: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  nction */../*.**
3d60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3d70: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c   called after al
3d80: 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62  l opcodes have b
3d90: 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 49  een inserted.  I
3da0: 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72 6f 75  t loops.** throu
3db0: 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63 6f 64  gh all the opcod
3dc0: 65 73 20 61 6e 64 20 66 69 78 65 73 20 75 70 20  es and fixes up 
3dd0: 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  some details..**
3de0: 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61 63 68  .** (1) For each
3df0: 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   jump instructio
3e00: 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74 69 76  n with a negativ
3e10: 65 20 50 32 20 76 61 6c 75 65 20 28 61 20 6c 61  e P2 value (a la
3e20: 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65 73 6f  bel).**     reso
3e30: 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c 75 65  lve the P2 value
3e40: 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20 61 64   to an actual ad
3e50: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29  dress..**.** (2)
3e60: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 78   Compute the max
3e70: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61  imum number of a
3e80: 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20 62 79  rguments used by
3e90: 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74 69 6f   any SQL functio
3ea0: 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73 74 6f  n.**     and sto
3eb0: 72 65 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e  re that value in
3ec0: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2e 0a   *pMaxFuncArgs..
3ed0: 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61 74 65  **.** (3) Update
3ee0: 20 74 68 65 20 56 64 62 65 2e 72 65 61 64 4f 6e   the Vdbe.readOn
3ef0: 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49 73 52  ly and Vdbe.bIsR
3f00: 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f 20 61  eader flags to a
3f10: 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20 20 20  ccurately.**    
3f20: 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74   indicate what t
3f30: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
3f40: 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79 20 64  ement actually d
3f50: 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20 49  oes..**.** (4) I
3f60: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 34  nitialize the p4
3f70: 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65  .xAdvance pointe
3f80: 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74 68 61  r on opcodes tha
3f90: 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  t use it..**.** 
3fa0: 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68 65 20  (5) Reclaim the 
3fb0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64  memory allocated
3fc0: 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c 61 62   for storing lab
3fd0: 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  els..**.** This 
3fe0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
3ff0: 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72 72 65  y function corre
4000: 63 74 6c 79 20 69 66 20 74 68 65 20 6d 6b 6f 70  ctly if the mkop
4010: 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61  codeh.tcl genera
4020: 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20 6e 75  tor.** script nu
4030: 6d 62 65 72 73 20 74 68 65 20 6f 70 63 6f 64 65  mbers the opcode
4040: 73 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 43 68  s correctly.  Ch
4050: 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20 72 6f  anges to this ro
4060: 75 74 69 6e 65 20 6d 75 73 74 20 62 65 0a 2a 2a  utine must be.**
4070: 20 63 6f 6f 72 64 69 6e 61 74 65 64 20 77 69 74   coordinated wit
4080: 68 20 63 68 61 6e 67 65 73 20 74 6f 20 6d 6b 6f  h changes to mko
4090: 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f 0a 73  pcodeh.tcl..*/.s
40a0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c  tatic void resol
40b0: 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20  veP2Values(Vdbe 
40c0: 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e  *p, int *pMaxFun
40d0: 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 6e 4d  cArgs){.  int nM
40e0: 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75  axArgs = *pMaxFu
40f0: 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f  ncArgs;.  Op *pO
4100: 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p;.  Parse *pPar
4110: 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a  se = p->pParse;.
4120: 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20    int *aLabel = 
4130: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a  pParse->aLabel;.
4140: 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20    p->readOnly = 
4150: 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 64 65  1;.  p->bIsReade
4160: 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d 20 26  r = 0;.  pOp = &
4170: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
4180: 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 0a 20  ;.  while(1){.. 
4190: 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d 50 20     /* Only JUMP 
41a0: 6f 70 63 6f 64 65 73 20 61 6e 64 20 74 68 65 20  opcodes and the 
41b0: 73 68 6f 72 74 20 6c 69 73 74 20 6f 66 20 73 70  short list of sp
41c0: 65 63 69 61 6c 20 6f 70 63 6f 64 65 73 20 69 6e  ecial opcodes in
41d0: 20 74 68 65 20 73 77 69 74 63 68 0a 20 20 20 20   the switch.    
41e0: 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20 74 6f  ** below need to
41f0: 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20   be considered. 
4200: 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74   The mkopcodeh.t
4210: 63 6c 20 67 65 6e 65 72 61 74 6f 72 20 73 63 72  cl generator scr
4220: 69 70 74 20 67 72 6f 75 70 73 0a 20 20 20 20 2a  ipt groups.    *
4230: 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f 70 63 6f  * all these opco
4240: 64 65 73 20 74 6f 67 65 74 68 65 72 20 6e 65 61  des together nea
4250: 72 20 74 68 65 20 66 72 6f 6e 74 20 6f 66 20 74  r the front of t
4260: 68 65 20 6f 70 63 6f 64 65 20 6c 69 73 74 2e 20  he opcode list. 
4270: 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61 6e 79   Skip.    ** any
4280: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 6f 65   opcode that doe
4290: 73 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f 63 65  s not need proce
42a0: 73 73 69 6e 67 20 62 79 20 76 69 72 74 75 61 6c  ssing by virtual
42b0: 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61   of the fact tha
42c0: 74 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6c  t.    ** it is l
42d0: 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54  arger than SQLIT
42e0: 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45  E_MX_JUMP_OPCODE
42f0: 2c 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e  , as a performan
4300: 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  ce optimization.
4310: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
4320: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53 51 4c  pOp->opcode<=SQL
4330: 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f  ITE_MX_JUMP_OPCO
4340: 44 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  DE ){.      /* N
4350: 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f 20  OTE: Be sure to 
4360: 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65 68  update mkopcodeh
4370: 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69 6e 67  .tcl when adding
4380: 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20 20   or removing.   
4390: 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d     ** cases from
43a0: 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f   this switch! */
43b0: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70  .      switch( p
43c0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20  Op->opcode ){.  
43d0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72        case OP_Tr
43e0: 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20  ansaction: {.   
43f0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
4400: 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f  p2!=0 ) p->readO
4410: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nly = 0;.       
4420: 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20     /* fall thru 
4430: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
4440: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74       case OP_Aut
4450: 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 20  oCommit:.       
4460: 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69   case OP_Savepoi
4470: 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  nt: {.          
4480: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31  p->bIsReader = 1
4490: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
44a0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66  k;.        }.#if
44b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
44c0: 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 63 61 73  _WAL.        cas
44d0: 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a  e OP_Checkpoint:
44e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
44f0: 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a  case OP_Vacuum:.
4500: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
4510: 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20  JournalMode: {. 
4520: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64           p->read
4530: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
4540: 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72      p->bIsReader
4550: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
4560: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4570: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4580: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
4590: 45 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  E.        case O
45a0: 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20  P_VUpdate: {.   
45b0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
45c0: 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p2>nMaxArgs ) nM
45d0: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32  axArgs = pOp->p2
45e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
45f0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
4600: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69       case OP_VFi
4610: 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20  lter: {.        
4620: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
4630: 20 20 20 61 73 73 65 72 74 28 20 28 70 4f 70 20     assert( (pOp 
4640: 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d 20 33 20 29  - p->aOp) >= 3 )
4650: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
4660: 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f  rt( pOp[-1].opco
4670: 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29  de==OP_Integer )
4680: 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20  ;.          n = 
4690: 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20  pOp[-1].p1;.    
46a0: 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78        if( n>nMax
46b0: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
46c0: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = n;.          b
46d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
46e0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 63  #endif.        c
46f0: 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20  ase OP_Next:.   
4700: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78       case OP_Nex
4710: 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20 20  tIfOpen:.       
4720: 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e   case OP_SorterN
4730: 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ext: {.         
4740: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
4750: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
4760: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
4770: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
4780: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
4790: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
47a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73     }.        cas
47b0: 65 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20  e OP_Prev:.     
47c0: 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49     case OP_PrevI
47d0: 66 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20  fOpen: {.       
47e0: 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61     pOp->p4.xAdva
47f0: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  nce = sqlite3Btr
4800: 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20  eePrevious;.    
4810: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
4820: 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a  e = P4_ADVANCE;.
4830: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
4840: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4850: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 73 71   }.      if( (sq
4860: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
4870: 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d  rty[pOp->opcode]
4880: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d   & OPFLG_JUMP)!=
4890: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29  0 && pOp->p2<0 )
48a0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
48b0: 28 20 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 3c  ( ADDR(pOp->p2)<
48c0: 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29  pParse->nLabel )
48d0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
48e0: 32 20 3d 20 61 4c 61 62 65 6c 5b 41 44 44 52 28  2 = aLabel[ADDR(
48f0: 70 4f 70 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 20  pOp->p2)];.     
4900: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
4910: 20 70 4f 70 3d 3d 70 2d 3e 61 4f 70 20 29 20 62   pOp==p->aOp ) b
4920: 72 65 61 6b 3b 0a 20 20 20 20 70 4f 70 2d 2d 3b  reak;.    pOp--;
4930: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
4940: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72  Free(p->db, pPar
4950: 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70  se->aLabel);.  p
4960: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20  Parse->aLabel = 
4970: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61  0;.  pParse->nLa
4980: 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78  bel = 0;.  *pMax
4990: 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41  FuncArgs = nMaxA
49a0: 72 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rgs;.  assert( p
49b0: 2d 3e 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c  ->bIsReader!=0 |
49c0: 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  | DbMaskAllZero(
49d0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b  p->btreeMask) );
49e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
49f0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
4a00: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
4a10: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72  tion to be inser
4a20: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
4a30: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
4a40: 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61  dr(Vdbe *p){.  a
4a50: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
4a60: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
4a70: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
4a80: 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65  nOp;.}../*.** Ve
4a90: 72 69 66 79 20 74 68 61 74 20 61 74 20 6c 65 61  rify that at lea
4aa0: 73 74 20 4e 20 6f 70 63 6f 64 65 20 73 6c 6f 74  st N opcode slot
4ab0: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
4ac0: 69 6e 20 70 20 77 69 74 68 6f 75 74 0a 2a 2a 20  in p without.** 
4ad0: 68 61 76 69 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63  having to malloc
4ae0: 20 66 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 20   for more space 
4af0: 28 65 78 63 65 70 74 20 77 68 65 6e 20 63 6f 6d  (except when com
4b00: 70 69 6c 65 64 20 75 73 69 6e 67 0a 2a 2a 20 53  piled using.** S
4b10: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
4b20: 4f 43 5f 53 54 52 45 53 53 29 2e 20 20 54 68 69  OC_STRESS).  Thi
4b30: 73 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 75  s interface is u
4b40: 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69  sed during testi
4b50: 6e 67 0a 2a 2a 20 74 6f 20 76 65 72 69 66 79 20  ng.** to verify 
4b60: 74 68 61 74 20 63 65 72 74 61 69 6e 20 63 61 6c  that certain cal
4b70: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
4b80: 65 41 64 64 4f 70 4c 69 73 74 28 29 20 63 61 6e  eAddOpList() can
4b90: 20 6e 65 76 65 72 0a 2a 2a 20 66 61 69 6c 20 64   never.** fail d
4ba0: 75 65 20 74 6f 20 61 20 4f 4f 4d 20 66 61 75 6c  ue to a OOM faul
4bb0: 74 20 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74  t and hence that
4bc0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
4bd0: 65 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  e from.** sqlite
4be0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29  3VdbeAddOpList()
4bf0: 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
4c00: 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66  non-NULL..*/.#if
4c10: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4c20: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
4c30: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ed(SQLITE_TEST_R
4c40: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76  EALLOC_STRESS).v
4c50: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56  oid sqlite3VdbeV
4c60: 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71  erifyNoMallocReq
4c70: 75 69 72 65 64 28 56 64 62 65 20 2a 70 2c 20 69  uired(Vdbe *p, i
4c80: 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt N){.  assert(
4c90: 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70   p->nOp + N <= p
4ca0: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  ->pParse->nOpAll
4cb0: 6f 63 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  oc );.}.#endif..
4cc0: 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  /*.** Verify tha
4cd0: 74 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  t the VM passed 
4ce0: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
4cf0: 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ment does not co
4d00: 6e 74 61 69 6e 0a 2a 2a 20 61 6e 20 4f 50 5f 52  ntain.** an OP_R
4d10: 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 2e  esultRow opcode.
4d20: 20 46 61 69 6c 20 61 6e 20 61 73 73 65 72 74 28   Fail an assert(
4d30: 29 20 69 66 20 69 74 20 64 6f 65 73 2e 20 54 68  ) if it does. Th
4d40: 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 62 79  is is used.** by
4d50: 20 63 6f 64 65 20 69 6e 20 70 72 61 67 6d 61 2e   code in pragma.
4d60: 63 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  c to ensure that
4d70: 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
4d80: 69 6f 6e 20 6f 66 20 63 65 72 74 61 69 6e 0a 2a  ion of certain.*
4d90: 2a 20 70 72 61 67 6d 61 73 20 63 6f 6d 70 6f 72  * pragmas compor
4da0: 74 73 20 77 69 74 68 20 74 68 65 20 66 6c 61 67  ts with the flag
4db0: 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  s specified in t
4dc0: 68 65 20 6d 6b 70 72 61 67 6d 61 74 61 62 2e 74  he mkpragmatab.t
4dd0: 63 6c 0a 2a 2a 20 73 63 72 69 70 74 2e 0a 2a 2f  cl.** script..*/
4de0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4df0: 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 21 64  ITE_DEBUG) && !d
4e00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
4e10: 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  ST_REALLOC_STRES
4e20: 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  S).void sqlite3V
4e30: 64 62 65 56 65 72 69 66 79 4e 6f 52 65 73 75 6c  dbeVerifyNoResul
4e40: 74 52 6f 77 28 56 64 62 65 20 2a 70 29 7b 0a 20  tRow(Vdbe *p){. 
4e50: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
4e60: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
4e70: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4e80: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21  ->aOp[i].opcode!
4e90: 3d 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 29 3b  =OP_ResultRow );
4ea0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
4eb0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4ec0: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
4ed0: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61  nter to the arra
4ee0: 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73  y of opcodes ass
4ef0: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
4f00: 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
4f10: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
4f20: 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65  ument. It is the
4f30: 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
4f40: 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72  ibility.** to ar
4f50: 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65  range for the re
4f60: 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20  turned array to 
4f70: 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
4f80: 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a  eed using the .*
4f90: 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  * vdbeFreeOpArra
4fa0: 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  y() function..**
4fb0: 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
4fc0: 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73  ning, *pnOp is s
4fd0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
4fe0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
4ff0: 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  he returned.** a
5000: 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d  rray. Also, *pnM
5010: 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20  axArg is set to 
5020: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74  the larger of it
5030: 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
5040: 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  and .** the numb
5050: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
5060: 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b   the Vdbe.apArg[
5070: 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64  ] array required
5080: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
5090: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f  .** returned pro
50a0: 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  gram..*/.VdbeOp 
50b0: 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65  *sqlite3VdbeTake
50c0: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c  OpArray(Vdbe *p,
50d0: 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20   int *pnOp, int 
50e0: 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64  *pnMaxArg){.  Vd
50f0: 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61  beOp *aOp = p->a
5100: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f  Op;.  assert( aO
5110: 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c  p && !p->db->mal
5120: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
5130: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71  /* Check that sq
5140: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
5150: 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  ee() was not cal
5160: 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a  led on this VM *
5170: 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61  /.  assert( DbMa
5180: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72  skAllZero(p->btr
5190: 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65  eeMask) );..  re
51a0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
51b0: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
51c0: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
51d0: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
51e0: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
51f0: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
5200: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
5210: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
5220: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
5230: 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  n a.** pointer t
5240: 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  o the first oper
5250: 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a  ation inserted..
5260: 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50  **.** Non-zero P
5270: 32 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 6a  2 arguments to j
5280: 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
5290: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
52a0: 6c 79 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 73  ly adjusted.** s
52b0: 6f 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20  o that the jump 
52c0: 74 61 72 67 65 74 20 69 73 20 72 65 6c 61 74 69  target is relati
52d0: 76 65 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ve to the first 
52e0: 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74  operation insert
52f0: 65 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  ed..*/.VdbeOp *s
5300: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
5310: 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ist(.  Vdbe *p, 
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5330: 20 20 20 20 2f 2a 20 41 64 64 20 6f 70 63 6f 64      /* Add opcod
5340: 65 73 20 74 6f 20 74 68 65 20 70 72 65 70 61 72  es to the prepar
5350: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
5360: 20 20 69 6e 74 20 6e 4f 70 2c 20 20 20 20 20 20    int nOp,      
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5380: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70 63 6f  * Number of opco
5390: 64 65 73 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  des to add */.  
53a0: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
53b0: 20 2a 61 4f 70 2c 20 20 20 20 20 20 20 2f 2a 20   *aOp,       /* 
53c0: 54 68 65 20 6f 70 63 6f 64 65 73 20 74 6f 20 62  The opcodes to b
53d0: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
53e0: 20 69 4c 69 6e 65 6e 6f 20 20 20 20 20 20 20 20   iLineno        
53f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
5400: 72 63 65 2d 66 69 6c 65 20 6c 69 6e 65 20 6e 75  rce-file line nu
5410: 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 6f 70  mber of first op
5420: 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  code */.){.  int
5430: 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f   i;.  VdbeOp *pO
5440: 75 74 2c 20 2a 70 46 69 72 73 74 3b 0a 20 20 61  ut, *pFirst;.  a
5450: 73 73 65 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a  ssert( nOp>0 );.
5460: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
5470: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
5480: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  NIT );.  if( p->
5490: 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70  nOp + nOp > p->p
54a0: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  Parse->nOpAlloc 
54b0: 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  && growOpArray(p
54c0: 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65  , nOp) ){.    re
54d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46  turn 0;.  }.  pF
54e0: 69 72 73 74 20 3d 20 70 4f 75 74 20 3d 20 26 70  irst = pOut = &p
54f0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20  ->aOp[p->nOp];. 
5500: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
5510: 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75   i++, aOp++, pOu
5520: 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  t++){.    pOut->
5530: 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70  opcode = aOp->op
5540: 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  code;.    pOut->
5550: 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20  p1 = aOp->p1;.  
5560: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70    pOut->p2 = aOp
5570: 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73 65 72 74  ->p2;.    assert
5580: 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a  ( aOp->p2>=0 );.
5590: 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 33      if( (sqlite3
55a0: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 61  OpcodeProperty[a
55b0: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  Op->opcode] & OP
55c0: 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20  FLG_JUMP)!=0 && 
55d0: 61 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20  aOp->p2>0 ){.   
55e0: 20 20 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70     pOut->p2 += p
55f0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20  ->nOp;.    }.   
5600: 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d   pOut->p3 = aOp-
5610: 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  >p3;.    pOut->p
5620: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
5630: 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34  ED;.    pOut->p4
5640: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74  .p = 0;.    pOut
5650: 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66  ->p5 = 0;.#ifdef
5660: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
5670: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
5680: 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65      pOut->zComme
5690: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  nt = 0;.#endif.#
56a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
56b0: 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70  E_COVERAGE.    p
56c0: 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  Out->iSrcLine = 
56d0: 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65  iLineno+i;.#else
56e0: 0a 20 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65  .    (void)iLine
56f0: 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  no;.#endif.#ifde
5700: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
5710: 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c     if( p->db->fl
5720: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
5730: 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
5740: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5750: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e  PrintOp(0, i+p->
5760: 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70  nOp, &p->aOp[i+p
5770: 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23  ->nOp]);.    }.#
5780: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e  endif.  }.  p->n
5790: 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74  Op += nOp;.  ret
57a0: 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23  urn pFirst;.}..#
57b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
57c0: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
57d0: 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20  ANSTATUS)./*.** 
57e0: 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  Add an entry to 
57f0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75  the array of cou
5800: 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79  nters managed by
5810: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
5820: 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76  anstatus()..*/.v
5830: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
5840: 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62  canStatus(.  Vdb
5850: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5870: 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74  VM to add scanst
5880: 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69  atus() to */.  i
5890: 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  nt addrExplain, 
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
58b0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
58c0: 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a  Explain (or 0) *
58d0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70  /.  int addrLoop
58e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
58f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
5900: 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  f loop counter *
5910: 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73  / .  int addrVis
5920: 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  it,             
5930: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
5940: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
5950: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67  counter */.  Log
5960: 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20  Est nEst,       
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5980: 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  Estimated number
5990: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
59a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
59b0: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  *zName          
59c0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
59d0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62  table or index b
59e0: 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  eing scanned */.
59f0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
5a00: 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20   (p->nScan+1) * 
5a10: 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74 75  sizeof(ScanStatu
5a20: 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75 73  s);.  ScanStatus
5a30: 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d   *aNew;.  aNew =
5a40: 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73 71   (ScanStatus*)sq
5a50: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
5a60: 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20  ->db, p->aScan, 
5a70: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 4e  nByte);.  if( aN
5a80: 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53 74  ew ){.    ScanSt
5a90: 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e  atus *pNew = &aN
5aa0: 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a  ew[p->nScan++];.
5ab0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45 78      pNew->addrEx
5ac0: 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70 6c  plain = addrExpl
5ad0: 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ain;.    pNew->a
5ae0: 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f  ddrLoop = addrLo
5af0: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  op;.    pNew->ad
5b00: 64 72 56 69 73 69 74 20 3d 20 61 64 64 72 56 69  drVisit = addrVi
5b10: 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  sit;.    pNew->n
5b20: 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20  Est = nEst;.    
5b30: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pNew->zName = sq
5b40: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 2d  lite3DbStrDup(p-
5b50: 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
5b60: 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77   p->aScan = aNew
5b70: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
5b80: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
5b90: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f  e value of the o
5ba0: 70 63 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50 32  pcode, or P1, P2
5bb0: 2c 20 50 33 2c 20 6f 72 20 50 35 20 6f 70 65 72  , P3, or P5 oper
5bc0: 61 6e 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70  ands.** for a sp
5bd0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
5be0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
5bf0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
5c00: 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 33 32  ode(Vdbe *p, u32
5c10: 20 61 64 64 72 2c 20 75 38 20 69 4e 65 77 4f 70   addr, u8 iNewOp
5c20: 63 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  code){.  sqlite3
5c30: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
5c40: 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77  )->opcode = iNew
5c50: 4f 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73  Opcode;.}.void s
5c60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5c70: 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P1(Vdbe *p, u32 
5c80: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
5c90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
5ca0: 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d  Op(p,addr)->p1 =
5cb0: 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c   val;.}.void sql
5cc0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
5cd0: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
5ce0: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
5cf0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
5d00: 28 70 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20 76  (p,addr)->p2 = v
5d10: 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  al;.}.void sqlit
5d20: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
5d30: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
5d40: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71  , int val){.  sq
5d50: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
5d60: 2c 61 64 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c  ,addr)->p3 = val
5d70: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
5d80: 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62  VdbeChangeP5(Vdb
5d90: 65 20 2a 70 2c 20 75 31 36 20 70 35 29 7b 0a 20  e *p, u16 p5){. 
5da0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
5db0: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
5dc0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
5dd0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e  ( p->nOp>0 ) p->
5de0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35  aOp[p->nOp-1].p5
5df0: 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   = p5;.}../*.** 
5e00: 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70  Change the P2 op
5e10: 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63  erand of instruc
5e20: 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61  tion addr so tha
5e30: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
5e40: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
5e50: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
5e60: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65  ction to be code
5e70: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
5e80: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56  e3VdbeJumpHere(V
5e90: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
5ea0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
5eb0: 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72  ChangeP2(p, addr
5ec0: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f  , p->nOp);.}.../
5ed0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75  *.** If the inpu
5ee0: 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  t FuncDef struct
5ef0: 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ure is ephemeral
5f00: 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20  , then free it. 
5f10: 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44   If.** the FuncD
5f20: 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d  ef is not epherm
5f30: 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  al, then do noth
5f40: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
5f50: 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61  oid freeEphemera
5f60: 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65  lFunction(sqlite
5f70: 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a  3 *db, FuncDef *
5f80: 70 44 65 66 29 7b 0a 20 20 69 66 28 20 28 70 44  pDef){.  if( (pD
5f90: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
5fa0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45  SQLITE_FUNC_EPHE
5fb0: 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  M)!=0 ){.    sql
5fc0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5fd0: 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  Def);.  }.}..sta
5fe0: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
5ff0: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
6000: 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a   *, Op *, int);.
6010: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
6020: 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65  P4 value if nece
6030: 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssary..*/.static
6040: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
6050: 20 76 6f 69 64 20 66 72 65 65 50 34 4d 65 6d 28   void freeP4Mem(
6060: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d 65 6d  sqlite3 *db, Mem
6070: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73   *p){.  if( p->s
6080: 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
6090: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
60a0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69 74  Malloc);.  sqlit
60b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
60c0: 0a 7d 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  .}.static SQLITE
60d0: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66  _NOINLINE void f
60e0: 72 65 65 50 34 46 75 6e 63 43 74 78 28 73 71 6c  reeP4FuncCtx(sql
60f0: 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74 65  ite3 *db, sqlite
6100: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20  3_context *p){. 
6110: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
6120: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e 70 46  nction(db, p->pF
6130: 75 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  unc);.  sqlite3D
6140: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
6150: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
6160: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
6170: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
6180: 20 2a 70 34 29 7b 0a 20 20 61 73 73 65 72 74 28   *p4){.  assert(
6190: 20 64 62 20 29 3b 0a 20 20 73 77 69 74 63 68 28   db );.  switch(
61a0: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63   p4type ){.    c
61b0: 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20  ase P4_FUNCCTX: 
61c0: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 46 75  {.      freeP4Fu
61d0: 6e 63 43 74 78 28 64 62 2c 20 28 73 71 6c 69 74  ncCtx(db, (sqlit
61e0: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34 29 3b  e3_context*)p4);
61f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6200: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6210: 52 45 41 4c 3a 0a 20 20 20 20 63 61 73 65 20 50  REAL:.    case P
6220: 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 63 61 73  4_INT64:.    cas
6230: 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20  e P4_DYNAMIC:.  
6240: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
6250: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
6260: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34  te3DbFree(db, p4
6270: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6280: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6290: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
62a0: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
62b0: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
62c0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
62d0: 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a  ((KeyInfo*)p4);.
62e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
62f0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
6300: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
6310: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
6320: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73  _EXPR: {.      s
6330: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6340: 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b  (db, (Expr*)p4);
6350: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6360: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
6370: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
6380: 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65  {.      freeEphe
6390: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
63a0: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b  , (FuncDef*)p4);
63b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
63c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
63d0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  MEM: {.      if(
63e0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
63f0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
6400: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
6410: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
6420: 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  )p4);.      }els
6430: 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50  e{.        freeP
6440: 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70  4Mem(db, (Mem*)p
6450: 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
6460: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6470: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20     case P4_VTAB 
6480: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
6490: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
64a0: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
64b0: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
64c0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
64d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
64e0: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70  *.** Free the sp
64f0: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
6500: 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34  r aOp and any p4
6510: 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65   values allocate
6520: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63  d for the.** opc
6530: 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  odes contained w
6540: 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73  ithin. If aOp is
6550: 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20   not NULL it is 
6560: 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
6570: 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69  in .** nOp entri
6580: 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  es. .*/.static v
6590: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
65a0: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ray(sqlite3 *db,
65b0: 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f   Op *aOp, int nO
65c0: 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b  p){.  if( aOp ){
65d0: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
65e0: 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70    for(pOp=aOp; p
65f0: 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f  Op<&aOp[nOp]; pO
6600: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p++){.      if( 
6610: 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 20 66 72  pOp->p4type ) fr
6620: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
6630: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
6640: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6650: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
6660: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71  OMMENTS.      sq
6670: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
6680: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
6690: 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20  #endif     .    
66a0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
66b0: 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a  bFree(db, aOp);.
66c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68  }../*.** Link th
66d0: 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a  e SubProgram obj
66e0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
66f0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
6700: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  t into the linke
6710: 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62  d.** list at Vdb
6720: 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54  e.pSubProgram. T
6730: 68 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64  his list is used
6740: 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73   to delete all s
6750: 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62  ub-program.** ob
6760: 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56  jects when the V
6770: 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72  M is no longer r
6780: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64  equired..*/.void
6790: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b   sqlite3VdbeLink
67a0: 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20  SubProgram(Vdbe 
67b0: 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72  *pVdbe, SubProgr
67c0: 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65  am *p){.  p->pNe
67d0: 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f  xt = pVdbe->pPro
67e0: 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70  gram;.  pVdbe->p
67f0: 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a  Program = p;.}..
6800: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
6810: 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20   opcode at addr 
6820: 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a  into OP_Noop.*/.
6830: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
6840: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65  hangeToNoop(Vdbe
6850: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
6860: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
6870: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
6880: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
6890: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61  n 0;.  assert( a
68a0: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
68b0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d  ->nOp );.  pOp =
68c0: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
68d0: 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20    freeP4(p->db, 
68e0: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
68f0: 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e  ->p4.p);.  pOp->
6900: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
6910: 53 45 44 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a  SED;.  pOp->p4.z
6920: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63   = 0;.  pOp->opc
6930: 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
6940: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
6950: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20  .** If the last 
6960: 6f 70 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61  opcode is "op" a
6970: 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a  nd it is not a j
6980: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c  ump destination,
6990: 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  .** then remove 
69a0: 69 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  it.  Return true
69b0: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
69c0: 61 6e 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65  an opcode was re
69d0: 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
69e0: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50  lite3VdbeDeleteP
69f0: 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20  riorOpcode(Vdbe 
6a00: 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66  *p, u8 op){.  if
6a10: 28 20 70 2d 3e 6e 4f 70 3e 30 20 26 26 20 70 2d  ( p->nOp>0 && p-
6a20: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f  >aOp[p->nOp-1].o
6a30: 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20  pcode==op ){.   
6a40: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
6a50: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
6a60: 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20  p, p->nOp-1);.  
6a70: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
6a80: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
6a90: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
6aa0: 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65  ue of the P4 ope
6ab0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
6ac0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
6ad0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6ae0: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
6af0: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
6b00: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
6b10: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
6b20: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
6b30: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
6b40: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
6b50: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
6b60: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
6b70: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
6b80: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34  n>=0 then the P4
6b90: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
6ba0: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
6bb0: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
6bc0: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
6bd0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
6be0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
6bf0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
6c00: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30   A value of n==0
6c10: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65   means copy byte
6c20: 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61  s of zP4 up to a
6c30: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  nd including the
6c40: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62  .** first null b
6c50: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65  yte.  If n>0 the
6c60: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73  n copy n+1 bytes
6c70: 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20   of zP4..** .** 
6c80: 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  Other values of 
6c90: 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34  n (P4_STATIC, P4
6ca0: 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69  _COLLSEQ etc.) i
6cb0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34  ndicate that zP4
6cc0: 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20   points.** to a 
6cd0: 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74  string or struct
6ce0: 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72  ure that is guar
6cf0: 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
6d00: 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65  for the lifetime
6d10: 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e   of.** the Vdbe.
6d20: 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20   In these cases 
6d30: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
6d40: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a   the pointer..**
6d50: 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68  .** If addr<0 th
6d60: 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20  en change P4 on 
6d70: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
6d80: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
6d90: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uction..*/.stati
6da0: 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f  c void SQLITE_NO
6db0: 49 4e 4c 49 4e 45 20 76 64 62 65 43 68 61 6e 67  INLINE vdbeChang
6dc0: 65 50 34 46 75 6c 6c 28 0a 20 20 56 64 62 65 20  eP4Full(.  Vdbe 
6dd0: 2a 70 2c 0a 20 20 4f 70 20 2a 70 4f 70 2c 0a 20  *p,.  Op *pOp,. 
6de0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
6df0: 2c 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 69  ,.  int n.){.  i
6e00: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  f( pOp->p4type )
6e10: 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e  {.    freeP4(p->
6e20: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
6e30: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20   pOp->p4.p);.   
6e40: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 30   pOp->p4type = 0
6e50: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  ;.    pOp->p4.p 
6e60: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  = 0;.  }.  if( n
6e70: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
6e80: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c  3VdbeChangeP4(p,
6e90: 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 70 2d 3e   (int)(pOp - p->
6ea0: 61 4f 70 29 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20  aOp), zP4, n);. 
6eb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
6ec0: 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74  n==0 ) n = sqlit
6ed0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b  e3Strlen30(zP4);
6ee0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d  .    pOp->p4.z =
6ef0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
6f00: 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29  p(p->db, zP4, n)
6f10: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
6f20: 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a  e = P4_DYNAMIC;.
6f30: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
6f40: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56  e3VdbeChangeP4(V
6f50: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
6f60: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
6f70: 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20  4, int n){.  Op 
6f80: 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  *pOp;.  sqlite3 
6f90: 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  *db;.  assert( p
6fa0: 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  !=0 );.  db = p-
6fb0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
6fc0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
6fd0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
6fe0: 73 65 72 74 28 20 70 2d 3e 61 4f 70 21 3d 30 20  sert( p->aOp!=0 
6ff0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
7000: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  led );.  if( db-
7010: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
7020: 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56  .    if( n!=P4_V
7030: 54 41 42 20 29 20 66 72 65 65 50 34 28 64 62 2c  TAB ) freeP4(db,
7040: 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61   n, (void*)*(cha
7050: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 72  r**)&zP4);.    r
7060: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
7070: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
7080: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c  .  assert( addr<
7090: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20  p->nOp );.  if( 
70a0: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
70b0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
70c0: 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d  .  }.  pOp = &p-
70d0: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66  >aOp[addr];.  if
70e0: 28 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70  ( n>=0 || pOp->p
70f0: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 76 64 62  4type ){.    vdb
7100: 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 70 2c  eChangeP4Full(p,
7110: 20 70 4f 70 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20   pOp, zP4, n);. 
7120: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
7130: 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32   if( n==P4_INT32
7140: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a   ){.    /* Note:
7150: 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61   this cast is sa
7160: 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  fe, because the 
7170: 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e  origin data poin
7180: 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20  t was an int.   
7190: 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73   ** that was cas
71a0: 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68  t to a (const ch
71b0: 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f  ar *). */.    pO
71c0: 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45  p->p4.i = SQLITE
71d0: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29  _PTR_TO_INT(zP4)
71e0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
71f0: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
7200: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 21 3d 30  }else if( zP4!=0
7210: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7220: 6e 3c 30 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 );.    pOp->
7230: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
7240: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
7250: 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  pe = (signed cha
7260: 72 29 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  r)n;.    if( n==
7270: 50 34 5f 56 54 41 42 20 29 20 73 71 6c 69 74 65  P4_VTAB ) sqlite
7280: 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c  3VtabLock((VTabl
7290: 65 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a 7d 0a 0a  e*)zP4);.  }.}..
72a0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
72b0: 20 50 34 20 6f 70 65 72 61 6e 64 20 6f 66 20 74   P4 operand of t
72c0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
72d0: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
72e0: 6f 6e 20 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61  on .** to the va
72f0: 6c 75 65 20 64 65 66 69 6e 65 64 20 62 79 20 74  lue defined by t
7300: 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  he arguments.  T
7310: 68 69 73 20 69 73 20 61 20 68 69 67 68 2d 73 70  his is a high-sp
7320: 65 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f  eed.** version o
7330: 66 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  f sqlite3VdbeCha
7340: 6e 67 65 50 34 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  ngeP4()..**.** T
7350: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6d 75  he P4 operand mu
7360: 73 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  st not have been
7370: 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 66 69   previously defi
7380: 6e 65 64 2e 20 20 41 6e 64 20 74 68 65 20 6e 65  ned.  And the ne
7390: 77 0a 2a 2a 20 50 34 20 6d 75 73 74 20 6e 6f 74  w.** P4 must not
73a0: 20 62 65 20 50 34 5f 49 4e 54 33 32 2e 20 20 55   be P4_INT32.  U
73b0: 73 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  se sqlite3VdbeCh
73c0: 61 6e 67 65 50 34 28 29 20 69 6e 20 65 69 74 68  angeP4() in eith
73d0: 65 72 20 6f 66 0a 2a 2a 20 74 68 6f 73 65 20 63  er of.** those c
73e0: 61 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ases..*/.void sq
73f0: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
7400: 34 28 56 64 62 65 20 2a 70 2c 20 76 6f 69 64 20  4(Vdbe *p, void 
7410: 2a 70 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  *pP4, int n){.  
7420: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 61  VdbeOp *pOp;.  a
7430: 73 73 65 72 74 28 20 6e 21 3d 50 34 5f 49 4e 54  ssert( n!=P4_INT
7440: 33 32 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42  32 && n!=P4_VTAB
7450: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3c   );.  assert( n<
7460: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  =0 );.  if( p->d
7470: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7480: 29 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d  ){.    freeP4(p-
7490: 3e 64 62 2c 20 6e 2c 20 70 50 34 29 3b 0a 20 20  >db, n, pP4);.  
74a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
74b0: 74 28 20 70 50 34 21 3d 30 20 29 3b 0a 20 20 20  t( pP4!=0 );.   
74c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
74d0: 30 20 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 26  0 );.    pOp = &
74e0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
74f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
7500: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f  p->p4type==P4_NO
7510: 54 55 53 45 44 20 29 3b 0a 20 20 20 20 70 4f 70  TUSED );.    pOp
7520: 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20  ->p4type = n;.  
7530: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 70 50    pOp->p4.p = pP
7540: 34 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  4;.  }.}../*.** 
7550: 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68  Set the P4 on th
7560: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
7570: 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20  added opcode to 
7580: 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20  the KeyInfo for 
7590: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76  the.** index giv
75a0: 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  en..*/.void sqli
75b0: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
75c0: 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
75d0: 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
75e0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
75f0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 4b 65  rse->pVdbe;.  Ke
7600: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
7610: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
7620: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
7630: 78 21 3d 30 20 29 3b 0a 20 20 70 4b 65 79 49 6e  x!=0 );.  pKeyIn
7640: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
7650: 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
7660: 65 2c 20 70 49 64 78 29 3b 0a 20 20 69 66 28 20  e, pIdx);.  if( 
7670: 70 4b 65 79 49 6e 66 6f 20 29 20 73 71 6c 69 74  pKeyInfo ) sqlit
7680: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
7690: 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  , pKeyInfo, P4_K
76a0: 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64  EYINFO);.}..#ifd
76b0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
76c0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
76d0: 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  S./*.** Change t
76e0: 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
76f0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
7700: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
7710: 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74  n.  Or.** insert
7720: 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64   a No-op and add
7730: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20   the comment to 
7740: 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63  that new instruc
7750: 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  tion.  This.** m
7760: 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61  akes the code ea
7770: 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72  sier to read dur
7780: 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20  ing debugging.  
7790: 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70  None of this hap
77a0: 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f  pens.** in a pro
77b0: 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a  duction build..*
77c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
77d0: 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  beVComment(Vdbe 
77e0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
77f0: 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74  zFormat, va_list
7800: 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   ap){.  assert( 
7810: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
7820: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
7830: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
7840: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
7850: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
7860: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
7870: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
7880: 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nOp ){.    asser
7890: 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20  t( p->aOp );.   
78a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
78b0: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ->db, p->aOp[p->
78c0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29  nOp-1].zComment)
78d0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ;.    p->aOp[p->
78e0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20  nOp-1].zComment 
78f0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
7900: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
7910: 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  , ap);.  }.}.voi
7920: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  d sqlite3VdbeCom
7930: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
7940: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
7950: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
7960: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29  st ap;.  if( p )
7970: 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  {.    va_start(a
7980: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
7990: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c   vdbeVComment(p,
79a0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
79b0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
79c0: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
79d0: 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74  3VdbeNoopComment
79e0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
79f0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
7a00: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
7a10: 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  p;.  if( p ){.  
7a20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7a30: 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(p, OP_Noop);
7a40: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
7a50: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
7a60: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
7a70: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
7a80: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
7a90: 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e  }.}.#endif  /* N
7aa0: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
7ab0: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
7ac0: 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ERAGE./*.** Set 
7ad0: 74 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65  the value if the
7ae0: 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20   iSrcLine field 
7af0: 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
7b00: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
7b10: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
7b20: 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65  lite3VdbeSetLine
7b30: 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20  Number(Vdbe *v, 
7b40: 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71  int iLine){.  sq
7b50: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
7b60: 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  ,-1)->iSrcLine =
7b70: 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66   iLine;.}.#endif
7b80: 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f   /* SQLITE_VDBE_
7b90: 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a  COVERAGE */../*.
7ba0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
7bb0: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
7bc0: 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68   address.  If th
7bd0: 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c  e address is -1,
7be0: 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20   then.** return 
7bf0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
7c00: 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64  y inserted opcod
7c10: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  e..**.** If a me
7c20: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
7c30: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
7c40: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
7c50: 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a  calling of this.
7c60: 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  ** routine, then
7c70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
7c80: 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c  dummy VdbeOp wil
7c90: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  l be returned.  
7ca0: 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69  That opcode.** i
7cb0: 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e  s readable but n
7cc0: 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f  ot writable, tho
7cd0: 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74  ugh it is cast t
7ce0: 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c  o a writable val
7cf0: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ue..** The retur
7d00: 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63  n of a dummy opc
7d10: 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ode allows the c
7d20: 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  all to continue 
7d30: 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61  functioning.** a
7d40: 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  fter an OOM faul
7d50: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
7d60: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65   to check to see
7d70: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66   if the return f
7d80: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  rom .** this rou
7d90: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20  tine is a valid 
7da0: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65  pointer.  But be
7db0: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e  cause the dummy.
7dc0: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20  opcode is 0,.** 
7dd0: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72  dummy will never
7de0: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
7df0: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65   This is verifie
7e00: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63  d by code inspec
7e10: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72  tion and.** by r
7e20: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67  unning with Valg
7e30: 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  rind..*/.VdbeOp 
7e40: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
7e50: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
7e60: 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73  ddr){.  /* C89 s
7e70: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68  pecifies that th
7e80: 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d  e constant "dumm
7e90: 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69  y" will be initi
7ea0: 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20  alized to all.  
7eb0: 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20  ** zeros, which 
7ec0: 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56  is correct.  MSV
7ed0: 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61  C generates a wa
7ee0: 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c  rning, neverthel
7ef0: 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ess. */.  static
7f00: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20   VdbeOp dummy;  
7f10: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53  /* Ignore the MS
7f20: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  VC warning about
7f30: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20   no initializer 
7f40: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
7f50: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
7f60: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
7f70: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
7f80: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
7f90: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
7fa0: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
7fb0: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
7fc0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7fd0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
7fe0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
7ff0: 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f     return (VdbeO
8000: 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c  p*)&dummy;.  }el
8010: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
8020: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
8030: 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
8040: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45  (SQLITE_ENABLE_E
8050: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29  XPLAIN_COMMENTS)
8060: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
8070: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
8080: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61  or one of the pa
8090: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20  rameters to the 
80a0: 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65  opcode pOp.** de
80b0: 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72  termined by char
80c0: 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74  acter c..*/.stat
80d0: 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65  ic int translate
80e0: 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20  P(char c, const 
80f0: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20  Op *pOp){.  if( 
8100: 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20  c=='1' ) return 
8110: 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63  pOp->p1;.  if( c
8120: 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70  =='2' ) return p
8130: 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d  Op->p2;.  if( c=
8140: 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='3' ) return pO
8150: 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p3;.  if( c==
8160: 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '4' ) return pOp
8170: 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e  ->p4.i;.  return
8180: 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a   pOp->p5;.}../*.
8190: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
81a0: 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d  ing for the "com
81b0: 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61  ment" field of a
81c0: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73   VDBE opcode lis
81d0: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
81e0: 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20  Synopsis: field 
81f0: 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  in comments in t
8200: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
8210: 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65   file gets conve
8220: 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78  rted.** to an ex
8230: 74 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  tra string that 
8240: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
8250: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
8260: 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a  Name().  In the.
8270: 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74  ** absence of ot
8280: 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68  her comments, th
8290: 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f  is synopsis beco
82a0: 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  mes the comment 
82b0: 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a  on the opcode..*
82c0: 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69  * Some translati
82d0: 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a  on occurs:.**.**
82e0: 20 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20         "PX"     
82f0: 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20   ->  "r[X]".**  
8300: 20 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d       "PX@PY"   -
8310: 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22  >  "r[X..X+Y-1]"
8320: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
8330: 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20   is 0 or 1.**   
8340: 20 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e      "PX@PY+1" ->
8350: 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20    "r[X..X+Y]"   
8360: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
8370: 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50  is 0.**       "P
8380: 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58  Y..PY"  ->  "r[X
8390: 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72  ..Y]"      or "r
83a0: 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a  [x]" if y<=x.*/.
83b0: 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
83c0: 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e  ayComment(.  con
83d0: 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20  st Op *pOp,     
83e0: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f  /* The opcode to
83f0: 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f   be commented */
8400: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8410: 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  P4,   /* Previou
8420: 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c  sly obtained val
8430: 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63  ue for P4 */.  c
8440: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20  har *zTemp,     
8450: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
8460: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
8470: 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f  nTemp          /
8480: 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c  * Space availabl
8490: 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a  e in zTemp[] */.
84a0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
84b0: 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  *zOpName;.  cons
84c0: 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69  t char *zSynopsi
84d0: 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65  s;.  int nOpName
84e0: 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a  ;.  int ii, jj;.
84f0: 20 20 63 68 61 72 20 7a 41 6c 74 5b 35 30 5d 3b    char zAlt[50];
8500: 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c  .  zOpName = sql
8510: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
8520: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e  Op->opcode);.  n
8530: 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  OpName = sqlite3
8540: 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65  Strlen30(zOpName
8550: 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65  );.  if( zOpName
8560: 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20  [nOpName+1] ){. 
8570: 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d     int seenCom =
8580: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a   0;.    char c;.
8590: 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20      zSynopsis = 
85a0: 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61  zOpName += nOpNa
85b0: 6d 65 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20  me + 1;.    if( 
85c0: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
85d0: 73 2c 22 49 46 20 22 2c 33 29 3d 3d 30 20 29 7b  s,"IF ",3)==0 ){
85e0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
85f0: 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52  p5 & SQLITE_STOR
8600: 45 50 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73  EP2 ){.        s
8610: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8620: 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41  sizeof(zAlt), zA
8630: 6c 74 2c 20 22 72 5b 50 32 5d 20 3d 20 28 25 73  lt, "r[P2] = (%s
8640: 29 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29  )", zSynopsis+3)
8650: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8670: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
8680: 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 69 66 20  Alt), zAlt, "if 
8690: 25 73 20 67 6f 74 6f 20 50 32 22 2c 20 7a 53 79  %s goto P2", zSy
86a0: 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20  nopsis+3);.     
86b0: 20 7d 0a 20 20 20 20 20 20 7a 53 79 6e 6f 70 73   }.      zSynops
86c0: 69 73 20 3d 20 7a 41 6c 74 3b 0a 20 20 20 20 7d  is = zAlt;.    }
86d0: 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30  .    for(ii=jj=0
86e0: 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20  ; jj<nTemp-1 && 
86f0: 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69  (c = zSynopsis[i
8700: 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20  i])!=0; ii++){. 
8710: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20       if( c=='P' 
8720: 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  ){.        c = z
8730: 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a  Synopsis[++ii];.
8740: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
8750: 34 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  4' ){.          
8760: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8770: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
8780: 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b  +jj, "%s", zP4);
8790: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
87a0: 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20  f( c=='X' ){.   
87b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
87c0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
87d0: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22  , zTemp+jj, "%s"
87e0: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
87f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e  ;.          seen
8800: 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Com = 1;.       
8810: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8820: 20 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73    int v1 = trans
8830: 6c 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20  lateP(c, pOp);. 
8840: 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b           int v2;
8850: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8860: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8870: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
8880: 22 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20  "%d", v1);.     
8890: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
88a0: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
88b0: 20 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a   "@P", 2)==0 ){.
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
88d0: 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 3;.           
88e0: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
88f0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
8900: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32  ;.            v2
8910: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53   = translateP(zS
8920: 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70  ynopsis[ii], pOp
8930: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
8940: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
8950: 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32  psis+ii+1,"+1",2
8960: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8970: 20 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20        ii += 2;. 
8980: 20 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b               v2+
8990: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
89a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
89b0: 20 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20   v2>1 ){.       
89c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
89d0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
89e0: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25  , zTemp+jj, "..%
89f0: 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20  d", v1+v2-1);.  
8a00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8a10: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8a20: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
8a30: 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20  s+ii+1, "..P3", 
8a40: 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33  4)==0 && pOp->p3
8a50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8a60: 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20     ii += 4;.    
8a70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8a80: 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20  }.        jj += 
8a90: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8aa0: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20  zTemp+jj);.     
8ab0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8ac0: 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b  zTemp[jj++] = c;
8ad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8ae0: 20 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20     if( !seenCom 
8af0: 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26  && jj<nTemp-5 &&
8b00: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29   pOp->zComment )
8b10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8b20: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
8b30: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20  j, zTemp+jj, "; 
8b40: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  %s", pOp->zComme
8b50: 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d  nt);.      jj +=
8b60: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
8b70: 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20  (zTemp+jj);.    
8b80: 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65  }.    if( jj<nTe
8b90: 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d  mp ) zTemp[jj] =
8ba0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
8bb0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
8bc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
8bd0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
8be0: 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  mp, "%s", pOp->z
8bf0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a  Comment);.    jj
8c00: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
8c10: 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c  30(zTemp);.  }el
8c20: 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d  se{.    zTemp[0]
8c30: 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30   = 0;.    jj = 0
8c40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
8c50: 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  j;.}.#endif /* S
8c60: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
8c70: 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59  #if VDBE_DISPLAY
8c80: 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53  _P4 && defined(S
8c90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
8ca0: 53 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a  SOR_HINTS)./*.**
8cb0: 20 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 50   Translate the P
8cc0: 34 2e 70 45 78 70 72 20 76 61 6c 75 65 20 66 6f  4.pExpr value fo
8cd0: 72 20 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69  r an OP_CursorHi
8ce0: 6e 74 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74  nt opcode into t
8cf0: 65 78 74 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20  ext.** that can 
8d00: 62 65 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20  be displayed in 
8d10: 74 68 65 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66  the P4 column of
8d20: 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e   EXPLAIN output.
8d30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8d40: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 53 74  displayP4Expr(St
8d50: 72 41 63 63 75 6d 20 2a 70 2c 20 45 78 70 72 20  rAccum *p, Expr 
8d60: 2a 70 45 78 70 72 29 7b 0a 20 20 63 6f 6e 73 74  *pExpr){.  const
8d70: 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a   char *zOp = 0;.
8d80: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
8d90: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
8da0: 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20  TK_STRING:.     
8db0: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
8dc0: 70 2c 20 22 25 51 22 2c 20 70 45 78 70 72 2d 3e  p, "%Q", pExpr->
8dd0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
8de0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8df0: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
8e00: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
8e10: 66 28 70 2c 20 22 25 64 22 2c 20 70 45 78 70 72  f(p, "%d", pExpr
8e20: 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20  ->u.iValue);.   
8e30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8e40: 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20  se TK_NULL:.    
8e50: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
8e60: 28 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  (p, "NULL");.   
8e70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8e80: 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
8e90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  {.      sqlite3X
8ea0: 50 72 69 6e 74 66 28 70 2c 20 22 72 5b 25 64 5d  Printf(p, "r[%d]
8eb0: 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ", pExpr->iTable
8ec0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8ed0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
8ee0: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
8ef0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
8f00: 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
8f10: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
8f20: 28 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20 20  (p, "rowid");.  
8f30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8f40: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
8f50: 66 28 70 2c 20 22 63 25 64 22 2c 20 28 69 6e 74  f(p, "c%d", (int
8f60: 29 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29  )pExpr->iColumn)
8f70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8f80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8f90: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20   case TK_LT:    
8fa0: 20 20 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20    zOp = "LT";   
8fb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8fc0: 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a  se TK_LE:      z
8fd0: 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 20  Op = "LE";      
8fe0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8ff0: 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70 20  TK_GT:      zOp 
9000: 3d 20 22 47 54 22 3b 20 20 20 20 20 20 62 72 65  = "GT";      bre
9010: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9020: 47 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  GE:      zOp = "
9030: 47 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  GE";      break;
9040: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
9050: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22        zOp = "NE"
9060: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9070: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20    case TK_EQ:   
9080: 20 20 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20     zOp = "EQ";  
9090: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
90a0: 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20  ase TK_IS:      
90b0: 7a 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20  zOp = "IS";     
90c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
90d0: 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70   TK_ISNOT:   zOp
90e0: 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20 20 62 72   = "ISNOT";   br
90f0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9100: 5f 41 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20  _AND:     zOp = 
9110: 22 41 4e 44 22 3b 20 20 20 20 20 62 72 65 61 6b  "AND";     break
9120: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  ;.    case TK_OR
9130: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52  :      zOp = "OR
9140: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
9150: 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
9160: 20 20 20 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b      zOp = "ADD";
9170: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9180: 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20  case TK_STAR:   
9190: 20 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20   zOp = "MUL";   
91a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
91b0: 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f  e TK_MINUS:   zO
91c0: 70 20 3d 20 22 53 55 42 22 3b 20 20 20 20 20 62  p = "SUB";     b
91d0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
91e0: 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d  K_REM:     zOp =
91f0: 20 22 52 45 4d 22 3b 20 20 20 20 20 62 72 65 61   "REM";     brea
9200: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
9210: 49 54 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42  ITAND:  zOp = "B
9220: 49 54 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a  ITAND";  break;.
9230: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
9240: 52 3a 20 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f  R:   zOp = "BITO
9250: 52 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  R";   break;.   
9260: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20   case TK_SLASH: 
9270: 20 20 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20 20    zOp = "DIV";  
9280: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9290: 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a  se TK_LSHIFT:  z
92a0: 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 20  Op = "LSHIFT";  
92b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
92c0: 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70 20  TK_RSHIFT:  zOp 
92d0: 3d 20 22 52 53 48 49 46 54 22 3b 20 20 62 72 65  = "RSHIFT";  bre
92e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
92f0: 43 4f 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22  CONCAT:  zOp = "
9300: 43 4f 4e 43 41 54 22 3b 20 20 62 72 65 61 6b 3b  CONCAT";  break;
9310: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
9320: 4e 55 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e  NUS:  zOp = "MIN
9330: 55 53 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  US";   break;.  
9340: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
9350: 20 20 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b     zOp = "PLUS";
9360: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9370: 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20  ase TK_BITNOT:  
9380: 7a 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20  zOp = "BITNOT"; 
9390: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
93a0: 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70   TK_NOT:     zOp
93b0: 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20 20 62 72   = "NOT";     br
93c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
93d0: 5f 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20  _ISNULL:  zOp = 
93e0: 22 49 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b  "ISNULL";  break
93f0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
9400: 54 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f  TNULL: zOp = "NO
9410: 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a  TNULL"; break;..
9420: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
9430: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9440: 66 28 70 2c 20 22 25 73 22 2c 20 22 65 78 70 72  f(p, "%s", "expr
9450: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
9460: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 4f 70 20  .  }..  if( zOp 
9470: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50  ){.    sqlite3XP
9480: 72 69 6e 74 66 28 70 2c 20 22 25 73 28 22 2c 20  rintf(p, "%s(", 
9490: 7a 4f 70 29 3b 0a 20 20 20 20 64 69 73 70 6c 61  zOp);.    displa
94a0: 79 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72  yP4Expr(p, pExpr
94b0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  ->pLeft);.    if
94c0: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
94d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
94e0: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
94f0: 2c 20 22 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20  , ",", 1);.     
9500: 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 70   displayP4Expr(p
9510: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
9520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
9530: 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
9540: 64 28 70 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  d(p, ")", 1);.  
9550: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44  }.}.#endif /* VD
9560: 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26  BE_DISPLAY_P4 &&
9570: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
9580: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
9590: 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69 66 20 56 44  NTS) */...#if VD
95a0: 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 0a 2f 2a  BE_DISPLAY_P4./*
95b0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  .** Compute a st
95c0: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
95d0: 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d  bes the P4 param
95e0: 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f  eter for an opco
95f0: 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70  de..** Use zTemp
9600: 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65   for any require
9610: 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  d temporary buff
9620: 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  er space..*/.sta
9630: 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61  tic char *displa
9640: 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61  yP4(Op *pOp, cha
9650: 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54  r *zTemp, int nT
9660: 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  emp){.  char *zP
9670: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 53 74 72  4 = zTemp;.  Str
9680: 41 63 63 75 6d 20 78 3b 0a 20 20 61 73 73 65 72  Accum x;.  asser
9690: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
96a0: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
96b0: 6d 49 6e 69 74 28 26 78 2c 20 30 2c 20 7a 54 65  mInit(&x, 0, zTe
96c0: 6d 70 2c 20 6e 54 65 6d 70 2c 20 30 29 3b 0a 20  mp, nTemp, 0);. 
96d0: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34   switch( pOp->p4
96e0: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
96f0: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20   P4_KEYINFO: {. 
9700: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
9710: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
9720: 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
9730: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73  eyInfo;.      as
9740: 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
9750: 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
9760: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
9770: 72 69 6e 74 66 28 26 78 2c 20 22 6b 28 25 64 22  rintf(&x, "k(%d"
9780: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
9790: 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ld);.      for(j
97a0: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
97b0: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
97c0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
97d0: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
97e0: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
97f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9800: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70  Coll = pColl ? p
9810: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22  Coll->zName : ""
9820: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  ;.        if( st
9830: 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e  rcmp(zColl, "BIN
9840: 41 52 59 22 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c  ARY")==0 ) zColl
9850: 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20 20   = "B";.        
9860: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
9870: 78 2c 20 22 2c 25 73 25 73 22 2c 20 70 4b 65 79  x, ",%s%s", pKey
9880: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
9890: 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20  [j] ? "-" : "", 
98a0: 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  zColl);.      }.
98b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
98c0: 41 63 63 75 6d 41 70 70 65 6e 64 28 26 78 2c 20  AccumAppend(&x, 
98d0: 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  ")", 1);.      b
98e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64  reak;.    }.#ifd
98f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
9900: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20  _CURSOR_HINTS.  
9910: 20 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20    case P4_EXPR: 
9920: 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79 50  {.      displayP
9930: 34 45 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e 70  4Expr(&x, pOp->p
9940: 34 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  4.pExpr);.      
9950: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
9960: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
9970: 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20  COLLSEQ: {.     
9980: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
9990: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b  = pOp->p4.pColl;
99a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
99b0: 72 69 6e 74 66 28 26 78 2c 20 22 28 25 2e 32 30  rintf(&x, "(%.20
99c0: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
99d0: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
99e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
99f0: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
9a00: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
9a10: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  f = pOp->p4.pFun
9a20: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
9a30: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 73 28  XPrintf(&x, "%s(
9a40: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
9a50: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
9a60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9a70: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53   }.#if defined(S
9a80: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
9a90: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
9aa0: 46 49 4c 45 29 0a 20 20 20 20 63 61 73 65 20 50  FILE).    case P
9ab0: 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20  4_FUNCCTX: {.   
9ac0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
9ad0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d   = pOp->p4.pCtx-
9ae0: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  >pFunc;.      sq
9af0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9b00: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
9b10: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
9b20: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
9b30: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
9b40: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
9b50: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
9b60: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 6c  3XPrintf(&x, "%l
9b70: 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49  ld", *pOp->p4.pI
9b80: 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  64);.      break
9b90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9ba0: 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20   P4_INT32: {.   
9bb0: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9bc0: 66 28 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d  f(&x, "%d", pOp-
9bd0: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
9be0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
9bf0: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
9c00: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
9c10: 6e 74 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c  ntf(&x, "%.16g",
9c20: 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29   *pOp->p4.pReal)
9c30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9c40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
9c50: 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65  _MEM: {.      Me
9c60: 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70  m *pMem = pOp->p
9c70: 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66  4.pMem;.      if
9c80: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
9c90: 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  MEM_Str ){.     
9ca0: 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a     zP4 = pMem->z
9cb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9cc0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
9cd0: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  MEM_Int ){.     
9ce0: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9cf0: 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 70 4d  f(&x, "%lld", pM
9d00: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20  em->u.i);.      
9d10: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
9d20: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
9d30: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9d40: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
9d50: 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e  %.16g", pMem->u.
9d60: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
9d70: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
9d80: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
9d90: 20 20 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c        zP4 = "NUL
9da0: 4c 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  L";.      }else{
9db0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9dc0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
9dd0: 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20  EM_Blob );.     
9de0: 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29     zP4 = "(blob)
9df0: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
9e00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
9e10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9e20: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
9e30: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a     case P4_VTAB:
9e40: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9e50: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70  _vtab *pVtab = p
9e60: 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56  Op->p4.pVtab->pV
9e70: 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tab;.      sqlit
9e80: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 76  e3XPrintf(&x, "v
9e90: 74 61 62 3a 25 70 22 2c 20 70 56 74 61 62 29 3b  tab:%p", pVtab);
9ea0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9eb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
9ec0: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
9ed0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a   {.      int i;.
9ee0: 20 20 20 20 20 20 69 6e 74 20 2a 61 69 20 3d 20        int *ai = 
9ef0: 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20  pOp->p4.ai;.    
9f00: 20 20 69 6e 74 20 6e 20 3d 20 61 69 5b 30 5d 3b    int n = ai[0];
9f10: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
9f20: 65 6c 65 6d 65 6e 74 20 6f 66 20 61 6e 20 49 4e  element of an IN
9f30: 54 41 52 52 41 59 20 69 73 20 61 6c 77 61 79 73  TARRAY is always
9f40: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
9f50: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
9f60: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
9f70: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 74  er of elements t
9f80: 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  o follow */.    
9f90: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20    for(i=1; i<n; 
9fa0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
9fb0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9fc0: 20 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29 3b 0a   ",%d", ai[i]);.
9fd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
9fe0: 65 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a 20 20  emp[0] = '[';.  
9ff0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
a000: 63 75 6d 41 70 70 65 6e 64 28 26 78 2c 20 22 5d  cumAppend(&x, "]
a010: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  ", 1);.      bre
a020: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a030: 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  se P4_SUBPROGRAM
a040: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
a050: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 70 72  3XPrintf(&x, "pr
a060: 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62  ogram");.      b
a070: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
a080: 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a  case P4_ADVANCE:
a090: 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30   {.      zTemp[0
a0a0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  ] = 0;.      bre
a0b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a0c0: 73 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a 20  se P4_TABLE: {. 
a0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
a0e0: 6e 74 66 28 26 78 2c 20 22 25 73 22 2c 20 70 4f  ntf(&x, "%s", pO
a0f0: 70 2d 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d  p->p4.pTab->zNam
a100: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
a110: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
a120: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20  lt: {.      zP4 
a130: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
a140: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b     if( zP4==0 ){
a150: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
a160: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
a170: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
a180: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
a190: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
a1a0: 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 61 73 73  inish(&x);.  ass
a1b0: 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20  ert( zP4!=0 );. 
a1c0: 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23   return zP4;.}.#
a1d0: 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49  endif /* VDBE_DI
a1e0: 53 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a  SPLAY_P4 */../*.
a1f0: 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68  ** Declare to th
a200: 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20  e Vdbe that the 
a210: 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20  BTree object at 
a220: 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73  db->aDb[i] is us
a230: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
a240: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
a250: 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  s need to know i
a260: 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f  n advance the co
a270: 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a  mplete set of.**
a280: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
a290: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ses that will be
a2a0: 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66   use.  A mask of
a2b0: 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73   these databases
a2c0: 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65  .** is maintaine
a2d0: 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  d in p->btreeMas
a2e0: 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d  k.  The p->lockM
a2f0: 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65  ask value is the
a300: 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d   subset of.** p-
a310: 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61  >btreeMask of da
a320: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
a330: 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b  l require a lock
a340: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a350: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56  3VdbeUsesBtree(V
a360: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
a370: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
a380: 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26  & i<p->db->nDb &
a390: 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  & i<(int)sizeof(
a3a0: 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  yDbMask)*8 );.  
a3b0: 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73  assert( i<(int)s
a3c0: 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61  izeof(p->btreeMa
a3d0: 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73  sk)*8 );.  DbMas
a3e0: 6b 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73  kSet(p->btreeMas
a3f0: 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d  k, i);.  if( i!=
a400: 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  1 && sqlite3Btre
a410: 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d  eSharable(p->db-
a420: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a  >aDb[i].pBt) ){.
a430: 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d      DbMaskSet(p-
a440: 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20  >lockMask, i);. 
a450: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
a460: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
a470: 48 41 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a  HARED_CACHE)./*.
a480: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
a490: 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70  compiled to supp
a4a0: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
a4b0: 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20   mode and to be 
a4c0: 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74  threadsafe,.** t
a4d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61  his routine obta
a4e0: 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73  ins the mutex as
a4f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
a500: 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75  ch BtShared stru
a510: 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61  cture.** that ma
a520: 79 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79  y be accessed by
a530: 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
a540: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
a550: 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c  n doing so it al
a560: 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42  so.** sets the B
a570: 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65  tShared.db membe
a580: 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65  r of each of the
a590: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
a5a0: 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a  ures, ensuring.*
a5b0: 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  * that the corre
a5c0: 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ct busy-handler 
a5d0: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
a5e0: 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e  ked if required.
a5f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  .**.** If SQLite
a600: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
a610: 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70  fe but does supp
a620: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
a630: 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73   mode, then.** s
a640: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
a650: 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  () is invoked to
a660: 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65   set the BtShare
a670: 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a  d.db variables.*
a680: 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68  * of all of BtSh
a690: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20  ared structures 
a6a0: 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74  accessible via t
a6b0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
a6c0: 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  le .** associate
a6d0: 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a  d with the VM..*
a6e0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
a6f0: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
a700: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75   and does not su
a710: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
a720: 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a  he mode, this.**
a730: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
a740: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
a750: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65  p->btreeMask fie
a760: 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  ld is a bitmask 
a770: 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68  of all btrees th
a780: 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20  at the prepared 
a790: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20  .** statement p 
a7a0: 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20  will ever use.  
a7b0: 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d  Let N be the num
a7c0: 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70  ber of bits in p
a7d0: 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63  ->btreeMask.** c
a7e0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
a7f0: 62 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20  btrees that use 
a800: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
a810: 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20  hen the runtime 
a820: 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  of.** this routi
a830: 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20  ne is N*N.  But 
a840: 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d  as N is rarely m
a850: 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73  ore than 1, this
a860: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62   should not.** b
a870: 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  e a problem..*/.
a880: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
a890: 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a  Enter(Vdbe *p){.
a8a0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
a8b0: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
a8c0: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
a8d0: 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  if( DbMaskAllZer
a8e0: 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29  o(p->lockMask) )
a8f0: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
a900: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
a910: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
a920: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20  aDb = db->aDb;. 
a930: 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a   nDb = db->nDb;.
a940: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62    for(i=0; i<nDb
a950: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
a960: 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65  i!=1 && DbMaskTe
a970: 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69  st(p->lockMask,i
a980: 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  ) && ALWAYS(aDb[
a990: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
a9a0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
a9b0: 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74  Enter(aDb[i].pBt
a9c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
a9d0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
a9e0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a9f0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
aa00: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
aa10: 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  FE>0./*.** Unloc
aa20: 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72  k all of the btr
aa30: 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  ees previously l
aa40: 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20  ocked by a call 
aa50: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  to sqlite3VdbeEn
aa60: 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ter()..*/.static
aa70: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
aa80: 20 76 6f 69 64 20 76 64 62 65 4c 65 61 76 65 28   void vdbeLeave(
aa90: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
aaa0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
aab0: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
aac0: 6e 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70  nt nDb;.  db = p
aad0: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
aae0: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
aaf0: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
ab00: 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a  0; i<nDb; i++){.
ab10: 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20      if( i!=1 && 
ab20: 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f  DbMaskTest(p->lo
ab30: 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57  ckMask,i) && ALW
ab40: 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d  AYS(aDb[i].pBt!=
ab50: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
ab60: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44  te3BtreeLeave(aD
ab70: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d  b[i].pBt);.    }
ab80: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
ab90: 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62  te3VdbeLeave(Vdb
aba0: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 44 62 4d  e *p){.  if( DbM
abb0: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f  askAllZero(p->lo
abc0: 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e  ckMask) ) return
abd0: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
abe0: 20 63 61 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c   case */.  vdbeL
abf0: 65 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69  eave(p);.}.#endi
ac00: 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56  f..#if defined(V
ac10: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
ac20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
ac30: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  EBUG)./*.** Prin
ac40: 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  t a single opcod
ac50: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
ac60: 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62   is used for deb
ac70: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
ac80: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
ac90: 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f  PrintOp(FILE *pO
aca0: 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a  ut, int pc, Op *
acb0: 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  pOp){.  char *zP
acc0: 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35  4;.  char zPtr[5
acd0: 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b  0];.  char zCom[
ace0: 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63  100];.  static c
acf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
ad00: 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73  at1 = "%4d %-13s
ad10: 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 31   %4d %4d %4d %-1
ad20: 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20  3s %.2X %s\n";. 
ad30: 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70   if( pOut==0 ) p
ad40: 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  Out = stdout;.  
ad50: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
ad60: 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f  pOp, zPtr, sizeo
ad70: 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65 66  f(zPtr));.#ifdef
ad80: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
ad90: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
ada0: 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74    displayComment
adb0: 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c  (pOp, zP4, zCom,
adc0: 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a   sizeof(zCom));.
add0: 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20  #else.  zCom[0] 
ade0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  = 0;.#endif.  /*
adf0: 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74 65   NB:  The sqlite
ae00: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66 75  3OpcodeName() fu
ae10: 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  nction is implem
ae20: 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63 72  ented by code cr
ae30: 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  eated.  ** by th
ae40: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
ae50: 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77  and mkopcodec.aw
ae60: 6b 20 73 63 72 69 70 74 73 20 77 68 69 63 68 20  k scripts which 
ae70: 65 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a 2a  extract the.  **
ae80: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
ae90: 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75  m the vdbe.c sou
aea0: 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66 70  rce text */.  fp
aeb0: 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72  rintf(pOut, zFor
aec0: 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20  mat1, pc, .     
aed0: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
aee0: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c  me(pOp->opcode),
aef0: 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
af00: 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c  2, pOp->p3, zP4,
af10: 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20   pOp->p5,.      
af20: 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75  zCom.  );.  fflu
af30: 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64  sh(pOut);.}.#end
af40: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  if../*.** Initia
af50: 6c 69 7a 65 20 61 6e 20 61 72 72 61 79 20 6f 66  lize an array of
af60: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e 0a   N Mem element..
af70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
af80: 6e 69 74 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20  nitMemArray(Mem 
af90: 2a 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c 69 74  *p, int N, sqlit
afa0: 65 33 20 2a 64 62 2c 20 75 31 36 20 66 6c 61 67  e3 *db, u16 flag
afb0: 73 29 7b 0a 20 20 77 68 69 6c 65 28 20 28 4e 2d  s){.  while( (N-
afc0: 2d 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 64  -)>0 ){.    p->d
afd0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 66  b = db;.    p->f
afe0: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
aff0: 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20    p->szMalloc = 
b000: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
b010: 5f 44 45 42 55 47 0a 20 20 20 20 70 2d 3e 70 53  _DEBUG.    p->pS
b020: 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23 65  copyFrom = 0;.#e
b030: 6e 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a 20 20  ndif.    p++;.  
b040: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  }.}../*.** Relea
b050: 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e  se an array of N
b060: 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f   Mem elements.*/
b070: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
b080: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d  easeMemArray(Mem
b090: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69   *p, int N){.  i
b0a0: 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20  f( p && N ){.   
b0b0: 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 5b   Mem *pEnd = &p[
b0c0: 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  N];.    sqlite3 
b0d0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  *db = p->db;.   
b0e0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
b0f0: 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64  Freed ){.      d
b100: 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  o{.        if( p
b110: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  ->szMalloc ) sql
b120: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
b130: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
b140: 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c    }while( (++p)<
b150: 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65  pEnd );.      re
b160: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
b170: 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  do{.      assert
b180: 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20  ( (&p[1])==pEnd 
b190: 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d  || p[0].db==p[1]
b1a0: 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73  .db );.      ass
b1b0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
b1c0: 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e  CheckMemInvarian
b1d0: 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20  ts(p) );..      
b1e0: 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73  /* This block is
b1f0: 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e   really an inlin
b200: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
b210: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
b220: 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74  ase().      ** t
b230: 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74  hat takes advant
b240: 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20  age of the fact 
b250: 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  that the memory 
b260: 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20  cell value is . 
b270: 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65       ** being se
b280: 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20  t to NULL after 
b290: 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79  releasing any dy
b2a0: 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e  namic resources.
b2b0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
b2c0: 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61  ** The justifica
b2d0: 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
b2e0: 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61  ting code is tha
b2f0: 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a  t according to .
b300: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69        ** callgri
b310: 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20  nd, this causes 
b320: 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63  a certain test c
b330: 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43  ase to hit the C
b340: 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a  PU 4.7 .      **
b350: 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78   percent less (x
b360: 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65  86 linux, gcc ve
b370: 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36  rsion 4.1.2, -O6
b380: 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20  ) than if .     
b390: 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65   ** sqlite3MemRe
b3a0: 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c  lease() were cal
b3b0: 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57  led from here. W
b3c0: 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75  ith -O2, this ju
b3d0: 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  mps.      ** to 
b3e0: 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65  6.6 percent. The
b3f0: 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e   test case is in
b400: 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77  serting 1000 row
b410: 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a  s into a table .
b420: 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f        ** with no
b430: 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61   indexes using a
b440: 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64   single prepared
b450: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
b460: 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20  t, bind() .     
b470: 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e   ** and reset().
b480: 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f   Inserts are gro
b490: 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e  uped into a tran
b4a0: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
b4b0: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
b4c0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
b4d0: 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65  _Agg );.      te
b4e0: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
b4f0: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20   & MEM_Dyn );.  
b500: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
b510: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61  >flags & MEM_Fra
b520: 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  me );.      test
b530: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
b540: 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20   MEM_RowSet );. 
b550: 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67       if( p->flag
b560: 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44  s&(MEM_Agg|MEM_D
b570: 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d  yn|MEM_Frame|MEM
b580: 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20  _RowSet) ){.    
b590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
b5a0: 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20  emRelease(p);.  
b5b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
b5c0: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  >szMalloc ){.   
b5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
b5e0: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
b5f0: 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  c);.        p->s
b600: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
b610: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66     }..      p->f
b620: 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
b630: 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ined;.    }while
b640: 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a  ( (++p)<pEnd );.
b650: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
b660: 65 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20  ete a VdbeFrame 
b670: 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63  object and its c
b680: 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61  ontents. VdbeFra
b690: 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a  me objects are.*
b6a0: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  * allocated by t
b6b0: 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70  he OP_Program op
b6c0: 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56  code in sqlite3V
b6d0: 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f  dbeExec()..*/.vo
b6e0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
b6f0: 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72  ameDelete(VdbeFr
b700: 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ame *p){.  int i
b710: 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20  ;.  Mem *aMem = 
b720: 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b  VdbeFrameMem(p);
b730: 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  .  VdbeCursor **
b740: 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72  apCsr = (VdbeCur
b750: 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e  sor **)&aMem[p->
b760: 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f  nChildMem];.  fo
b770: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69  r(i=0; i<p->nChi
b780: 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ldCsr; i++){.   
b790: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
b7a0: 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43  Cursor(p->v, apC
b7b0: 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  sr[i]);.  }.  re
b7c0: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d  leaseMemArray(aM
b7d0: 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d  em, p->nChildMem
b7e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
b7f0: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2d  DeleteAuxData(p-
b800: 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78  >v->db, &p->pAux
b810: 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  Data, -1, 0);.  
b820: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
b830: 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23  >v->db, p);.}..#
b840: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b850: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
b860: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
b870: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
b880: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
b890: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
b8a0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
b8b0: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
b8c0: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
b8d0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
b8e0: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
b8f0: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
b900: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
b910: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
b920: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
b930: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
b940: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
b950: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  IN"..**.** When 
b960: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65  p->explain==1, e
b970: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
b980: 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e  is listed.  When
b990: 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  .** p->explain==
b9a0: 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61  2, only OP_Expla
b9b0: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  in instructions 
b9c0: 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74  are listed and t
b9d0: 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77  hese.** are show
b9e0: 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n in a different
b9f0: 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70   format.  p->exp
ba00: 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20  lain==2 is used 
ba10: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
ba20: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
ba30: 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  AN..**.** When p
ba40: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69  ->explain==1, fi
ba50: 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  rst the main pro
ba60: 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20  gram is listed, 
ba70: 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20  then each of.** 
ba80: 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70  the trigger subp
ba90: 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74  rograms are list
baa0: 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a  ed one by one..*
bab0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
bac0: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bae0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
baf0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  /.){.  int nRow;
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bb20: 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75  top when row cou
bb30: 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20  nt reaches this 
bb40: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
bb50: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
bb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
bb70: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
bb80: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
bb90: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
bba0: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
bbb0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
bbc0: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
bbd0: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
bc00: 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79   cell hold array
bc10: 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a   of subprogs */.
bc20: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bc30: 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
bc40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
bc50: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
bc60: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
bc90: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
bca0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
bcb0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
bcc0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
bcd0: 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  code */.  Mem *p
bce0: 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Mem = &p->aMem[1
bcf0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
bd00: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
bd10: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
bd20: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
bd30: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
bd40: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
bd50: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
bd60: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
bd70: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
bd80: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
bd90: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
bda0: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
bdb0: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
bdc0: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
bdd0: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
bde0: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
bdf0: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
be00: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
be10: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
be20: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
be30: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
be40: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
be50: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
be60: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
be70: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
be80: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
be90: 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74  8);.  p->pResult
bea0: 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Set = 0;..  if( 
beb0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
bec0: 4d 45 4d 5f 42 4b 50 54 20 29 7b 0a 20 20 20 20  MEM_BKPT ){.    
bed0: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
bee0: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e  if a malloc() in
bef0: 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73  side a call to s
bf00: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
bf10: 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  xt() or.    ** s
bf20: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
bf30: 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20  xt16() failed.  
bf40: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  */.    sqlite3Oo
bf50: 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
bf60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
bf70: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  ROR;.  }..  /* W
bf80: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
bf90: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65  f output rows re
bfa0: 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74  aches nRow, that
bfb0: 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20   means the.  ** 
bfc0: 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69  listing has fini
bfd0: 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33  shed and sqlite3
bfe0: 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72  _step() should r
bff0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
c000: 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20  E..  ** nRow is 
c010: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
c020: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
c030: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
c040: 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65  m, plus.  ** the
c050: 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62   sum of the numb
c060: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c  er of rows in al
c070: 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  l trigger subpro
c080: 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65  grams encountere
c090: 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20  d.  ** so far.  
c0a0: 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77  The nRow value w
c0b0: 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20  ill increase as 
c0c0: 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62 70  new trigger subp
c0d0: 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a  rograms are.  **
c0e0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75   encountered, bu
c0f0: 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65  t p->pc will eve
c100: 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70  ntually catch up
c110: 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20   to nRow..  */. 
c120: 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a   nRow = p->nOp;.
c130: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
c140: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==1 ){.    /* Th
c150: 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79  e first 8 memory
c160: 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20   cells are used 
c170: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
c180: 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a  et.  So we will.
c190: 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65      ** commandee
c1a0: 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74  r the 9th cell t
c1b0: 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67 65  o use as storage
c1c0: 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66   for an array of
c1d0: 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a   pointers.    **
c1e0: 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62 70   to trigger subp
c1f0: 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44  rograms.  The VD
c200: 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  BE is guaranteed
c210: 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73   to have at leas
c220: 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73  t 9.    ** cells
c230: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
c240: 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20  ( p->nMem>9 );. 
c250: 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d     pSub = &p->aM
c260: 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70  em[9];.    if( p
c270: 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42  Sub->flags&MEM_B
c280: 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lob ){.      /* 
c290: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  On the first cal
c2a0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  l to sqlite3_ste
c2b0: 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68  p(), pSub will h
c2c0: 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20  old a NULL.  It 
c2d0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74  is.      ** init
c2e0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f  ialized to a BLO
c2f0: 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42 50  B by the P4_SUBP
c300: 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e  ROGRAM processin
c310: 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f  g logic below */
c320: 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53  .      nSub = pS
c330: 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62  ub->n/sizeof(Vdb
c340: 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62  e*);.      apSub
c350: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
c360: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d  *)pSub->z;.    }
c370: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
c380: 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSub; i++){.    
c390: 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b    nRow += apSub[
c3a0: 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20  i]->nOp;.    }. 
c3b0: 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20   }..  do{.    i 
c3c0: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
c3d0: 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70  ile( i<nRow && p
c3e0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20  ->explain==2 && 
c3f0: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
c400: 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a  !=OP_Explain );.
c410: 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b    if( i>=nRow ){
c420: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
c430: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
c440: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
c450: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31  }else if( db->u1
c460: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29  .isInterrupted )
c470: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
c480: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
c490: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c4a0: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
c4b0: 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 73  e3VdbeError(p, s
c4c0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
c4d0: 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rc));.  }else{. 
c4e0: 20 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20     char *zP4;.  
c4f0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69    Op *pOp;.    i
c500: 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20  f( i<p->nOp ){. 
c510: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70       /* The outp
c520: 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  ut line number i
c530: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74  s small enough t
c540: 68 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c  hat we are still
c550: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
c560: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a   main program. *
c570: 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70  /.      pOp = &p
c580: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65  ->aOp[i];.    }e
c590: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65  lse{.      /* We
c5a0: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c   are currently l
c5b0: 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61  isting subprogra
c5c0: 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20  ms.  Figure out 
c5d0: 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20  which one and.  
c5e0: 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74      ** pick up t
c5f0: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f  he appropriate o
c600: 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20  pcode. */.      
c610: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d  int j;.      i -
c620: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  = p->nOp;.      
c630: 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75  for(j=0; i>=apSu
c640: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b  b[j]->nOp; j++){
c650: 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70  .        i -= ap
c660: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[j]->nOp;.   
c670: 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d     }.      pOp =
c680: 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b   &apSub[j]->aOp[
c690: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i];.    }.    if
c6a0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
c6b0: 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ){.      pMem->f
c6c0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
c6d0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
c6e0: 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  = i;            
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c700: 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63      /* Program c
c710: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
c720: 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20  pMem++;.  .     
c730: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
c740: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74  EM_Static|MEM_St
c750: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
c760: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
c770: 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  r*)sqlite3Opcode
c780: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
c790: 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a  ); /* Opcode */.
c7a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
c7b0: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
c7c0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
c7d0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
c7e0: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
c7f0: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
c800: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
c810: 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  +;..      /* Whe
c820: 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20  n an OP_Program 
c830: 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e  opcode is encoun
c840: 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70  ter (the only op
c850: 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20  code that has.  
c860: 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50      ** a P4_SUBP
c870: 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29  ROGRAM argument)
c880: 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a  , expand the siz
c890: 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f  e of the array o
c8a0: 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20  f subprograms.  
c8b0: 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70      ** kept in p
c8c0: 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68  ->aMem[9].z to h
c8d0: 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67  old the new prog
c8e0: 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74  ram - assuming t
c8f0: 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20  his subprogram. 
c900: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20       ** has not 
c910: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65  already been see
c920: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
c930: 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
c940: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
c950: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
c960: 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29  nByte = (nSub+1)
c970: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72  *sizeof(SubProgr
c980: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  am*);.        in
c990: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
c9a0: 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b  (j=0; j<nSub; j+
c9b0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
c9c0: 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d  ( apSub[j]==pOp-
c9d0: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
c9e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
c9f0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e          if( j==n
ca00: 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  Sub && SQLITE_OK
ca10: 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ==sqlite3VdbeMem
ca20: 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65  Grow(pSub, nByte
ca30: 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20 20  , nSub!=0) ){.  
ca40: 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20          apSub = 
ca50: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
ca60: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20  Sub->z;.        
ca70: 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20    apSub[nSub++] 
ca80: 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  = pOp->p4.pProgr
ca90: 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  am;.          pS
caa0: 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ub->flags |= MEM
cab0: 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20  _Blob;.         
cac0: 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a   pSub->n = nSub*
cad0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
cae0: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  m*);.        }. 
caf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
cb00: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
cb10: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
cb20: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
cb30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cb40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
cb50: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a   */.    pMem++;.
cb60: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
cb70: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
cb80: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
cb90: 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p2;            
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cbb0: 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b   P2 */.    pMem+
cbc0: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
cbd0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
cbe0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
cbf0: 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20  Op->p3;         
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc10: 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d   /* P3 */.    pM
cc20: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73  em++;..    if( s
cc30: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
cc40: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
cc50: 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34 20  , 100) ){ /* P4 
cc60: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
cc70: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
cc80: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
cc90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
cca0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  R;.    }.    pMe
ccb0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
ccc0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
ccd0: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
cce0: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70  (pOp, pMem->z, p
ccf0: 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a  Mem->szMalloc);.
cd00: 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65      if( zP4!=pMe
cd10: 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 70 4d  m->z ){.      pM
cd20: 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  em->n = 0;.     
cd30: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
cd40: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c  etStr(pMem, zP4,
cd50: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
cd60: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
cd70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cd80: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
cd90: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
cda0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
cdb0: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
cdc0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
cdd0: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
cde0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
cdf0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
ce00: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
ce10: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
ce20: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34  ndResize(pMem, 4
ce30: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
ce40: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
ce50: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
ce60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ce70: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
ce80: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
ce90: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
cea0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
ceb0: 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20  m->n = 2;.      
cec0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
ced0: 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e  (3, pMem->z, "%.
cee0: 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20  2x", pOp->p5);  
cef0: 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20   /* P5 */.      
cf00: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
cf10: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
cf20: 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66  Mem++;.  .#ifdef
cf30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
cf40: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
cf50: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
cf60: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
cf70: 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30  Resize(pMem, 500
cf80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
cf90: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
cfa0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
cfb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
cfc0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
cfd0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
cfe0: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
cff0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
d000: 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f  m->n = displayCo
d010: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
d020: 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20  pMem->z, 500);. 
d030: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
d040: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
d050: 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  lse.      pMem->
d060: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
d070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d080: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65          /* Comme
d090: 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  nt */.#endif.   
d0a0: 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43   }..    p->nResC
d0b0: 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70  olumn = 8 - 4*(p
d0c0: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
d0d0: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
d0e0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20  = &p->aMem[1];. 
d0f0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
d100: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
d110: 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20  QLITE_ROW;.  }. 
d120: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
d130: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
d140: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
d150: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
d160: 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
d170: 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73  the SQL that was
d180: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
d190: 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  e a VDBE program
d1a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d1b0: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64  3VdbePrintSql(Vd
d1c0: 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20  be *p){.  const 
d1d0: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69  char *z = 0;.  i
d1e0: 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20  f( p->zSql ){.  
d1f0: 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20    z = p->zSql;. 
d200: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f   }else if( p->nO
d210: 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73  p>=1 ){.    cons
d220: 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20  t VdbeOp *pOp = 
d230: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20  &p->aOp[0];.    
d240: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
d250: 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d  =OP_Init && pOp-
d260: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
d270: 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b    z = pOp->p4.z;
d280: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71  .      while( sq
d290: 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29  lite3Isspace(*z)
d2a0: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) z++;.    }.  
d2b0: 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e  }.  if( z ) prin
d2c0: 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  tf("SQL: [%s]\n"
d2d0: 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  , z);.}.#endif..
d2e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
d2f0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
d300: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
d310: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
d320: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e  )./*.** Print an
d330: 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65   IOTRACE message
d340: 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e   showing SQL con
d350: 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tent..*/.void sq
d360: 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65  lite3VdbeIOTrace
d370: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
d380: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
d390: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
d3a0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f  .  if( sqlite3Io
d3b0: 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Trace==0 ) retur
d3c0: 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29  n;.  if( nOp<1 )
d3d0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
d3e0: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69   &p->aOp[0];.  i
d3f0: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
d400: 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e  OP_Init && pOp->
d410: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69  p4.z!=0 ){.    i
d420: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61  nt i, j;.    cha
d430: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73  r z[1000];.    s
d440: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
d450: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
d460: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  s", pOp->p4.z);.
d470: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c      for(i=0; sql
d480: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
d490: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f  ); i++){}.    fo
d4a0: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(j=0; z[i]; i++
d4b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
d4c0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
d4d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
d4e0: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
d4f0: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
d500: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
d510: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
d520: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
d530: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
d540: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
d550: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54  ;.    sqlite3IoT
d560: 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c  race("SQL %s\n",
d570: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
d580: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
d590: 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54  T_TRACE && SQLIT
d5a0: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
d5b0: 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61   */../* An insta
d5c0: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
d5d0: 63 74 20 64 65 73 63 72 69 62 65 73 20 62 75 6c  ct describes bul
d5e0: 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62  k memory availab
d5f0: 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20 62 79  le for use.** by
d600: 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f   subcomponents o
d610: 66 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  f a prepared sta
d620: 74 65 6d 65 6e 74 2e 20 20 53 70 61 63 65 20 69  tement.  Space i
d630: 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 75 74 0a  s allocated out.
d640: 2a 2a 20 6f 66 20 61 20 52 65 75 73 61 62 6c 65  ** of a Reusable
d650: 53 70 61 63 65 20 6f 62 6a 65 63 74 20 62 79 20  Space object by 
d660: 74 68 65 20 61 6c 6c 6f 63 53 70 61 63 65 28 29  the allocSpace()
d670: 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77 2e 0a   routine below..
d680: 2a 2f 0a 73 74 72 75 63 74 20 52 65 75 73 61 62  */.struct Reusab
d690: 6c 65 53 70 61 63 65 20 7b 0a 20 20 75 38 20 2a  leSpace {.  u8 *
d6a0: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
d6b0: 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d 65   /* Available me
d6c0: 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  mory */.  int nF
d6d0: 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ree;           /
d6e0: 2a 20 42 79 74 65 73 20 6f 66 20 61 76 61 69 6c  * Bytes of avail
d6f0: 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  able memory */. 
d700: 20 69 6e 74 20 6e 4e 65 65 64 65 64 3b 20 20 20   int nNeeded;   
d710: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 62        /* Total b
d720: 79 74 65 73 20 74 68 61 74 20 63 6f 75 6c 64 20  ytes that could 
d730: 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  not be allocated
d740: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74   */.};../* Try t
d750: 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  o allocate nByte
d760: 20 62 79 74 65 73 20 6f 66 20 38 2d 62 79 74 65   bytes of 8-byte
d770: 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b 20 6d 65   aligned bulk me
d780: 6d 6f 72 79 20 66 6f 72 20 70 42 75 66 0a 2a 2a  mory for pBuf.**
d790: 20 66 72 6f 6d 20 74 68 65 20 52 65 75 73 61 62   from the Reusab
d7a0: 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2e 20  leSpace object. 
d7b0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
d7c0: 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
d7d0: 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20  ed.** memory on 
d7e0: 73 75 63 63 65 73 73 2e 20 20 49 66 20 69 6e 73  success.  If ins
d7f0: 75 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f 72 79  ufficient memory
d800: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
d810: 20 74 68 65 0a 2a 2a 20 52 65 75 73 61 62 6c 65   the.** Reusable
d820: 53 70 61 63 65 20 6f 62 6a 65 63 74 2c 20 69 6e  Space object, in
d830: 63 72 65 61 73 65 20 74 68 65 20 52 65 75 73 61  crease the Reusa
d840: 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65 64 65 64  bleSpace.nNeeded
d850: 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20 74 68 65  .** value by the
d860: 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65 64 20 61   amount needed a
d870: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
d880: 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66 20 69 73  **.** If pBuf is
d890: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20 4e   not initially N
d8a0: 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ULL, that means 
d8b0: 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  that the memory 
d8c0: 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
d8d0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  een allocated by
d8e0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
d8f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 73   this routine, s
d900: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20  o just return a 
d910: 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 75 66 20  copy.** of pBuf 
d920: 61 6e 64 20 6c 65 61 76 65 20 52 65 75 73 61 62  and leave Reusab
d930: 6c 65 53 70 61 63 65 20 75 6e 63 68 61 6e 67 65  leSpace unchange
d940: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c  d..**.** This al
d950: 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d 70 6c 6f  locator is emplo
d960: 79 65 64 20 74 6f 20 72 65 70 75 72 70 6f 73 65  yed to repurpose
d970: 20 75 6e 75 73 65 64 20 73 6c 6f 74 73 20 61 74   unused slots at
d980: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
d990: 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  ** opcode array 
d9a0: 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74  of prepared stat
d9b0: 65 20 66 6f 72 20 6f 74 68 65 72 20 6d 65 6d 6f  e for other memo
d9c0: 72 79 20 6e 65 65 64 73 20 6f 66 20 74 68 65 20  ry needs of the 
d9d0: 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74  prepared.** stat
d9e0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
d9f0: 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63   void *allocSpac
da00: 65 28 0a 20 20 73 74 72 75 63 74 20 52 65 75 73  e(.  struct Reus
da10: 61 62 6c 65 53 70 61 63 65 20 2a 70 2c 20 20 2f  ableSpace *p,  /
da20: 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76  * Bulk memory av
da30: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f  ailable for allo
da40: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  cation */.  void
da50: 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
da60: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
da70: 20 74 6f 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f   to a prior allo
da80: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  cation */.  int 
da90: 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20  nByte           
daa0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
dab0: 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20  f memory needed 
dac0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
dad0: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
dae0: 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63 65 29 20  MENT(p->pSpace) 
daf0: 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30  );.  if( pBuf==0
db00: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
db10: 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20  ROUND8(nByte);. 
db20: 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c 3d 20     if( nByte <= 
db30: 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  p->nFree ){.    
db40: 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42    p->nFree -= nB
db50: 79 74 65 3b 0a 20 20 20 20 20 20 70 42 75 66 20  yte;.      pBuf 
db60: 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b 70 2d 3e  = &p->pSpace[p->
db70: 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d 65 6c 73  nFree];.    }els
db80: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4e 65 65  e{.      p->nNee
db90: 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  ded += nByte;.  
dba0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
dbb0: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
dbc0: 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29 3b 0a  GNMENT(pBuf) );.
dbd0: 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d    return pBuf;.}
dbe0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74  ../*.** Rewind t
dbf0: 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20  he VDBE back to 
dc00: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e  the beginning in
dc10: 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72   preparation for
dc20: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a  .** running it..
dc30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
dc40: 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a  dbeRewind(Vdbe *
dc50: 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  p){.#if defined(
dc60: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
dc70: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
dc80: 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a  OFILE).  int i;.
dc90: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
dca0: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
dcb0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
dcc0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 7c 7c 20  E_MAGIC_INIT || 
dcd0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
dce0: 41 47 49 43 5f 52 45 53 45 54 20 29 3b 0a 0a 20  AGIC_RESET );.. 
dcf0: 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64   /* There should
dd00: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
dd10: 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20   opcode..  */.  
dd20: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
dd30: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
dd40: 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f  e magic to VDBE_
dd50: 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72  MAGIC_RUN sooner
dd60: 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
dd70: 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69  er. */.  p->magi
dd80: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
dd90: 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  UN;..#ifdef SQLI
dda0: 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69  TE_DEBUG.  for(i
ddb0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69  =0; i<p->nMem; i
ddc0: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
ddd0: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d   p->aMem[i].db==
dde0: 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e  p->db );.  }.#en
ddf0: 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31  dif.  p->pc = -1
de00: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
de10: 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f  TE_OK;.  p->erro
de20: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
de30: 72 74 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65  rt;.  p->nChange
de40: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
de50: 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69  Ctr = 1;.  p->mi
de60: 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74  nWriteFileFormat
de70: 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74   = 255;.  p->iSt
de80: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70  atement = 0;.  p
de90: 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20  ->nFkConstraint 
dea0: 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45  = 0;.#ifdef VDBE
deb0: 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69  _PROFILE.  for(i
dec0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
ded0: 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69  +){.    p->aOp[i
dee0: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  ].cnt = 0;.    p
def0: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20  ->aOp[i].cycles 
df00: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
df10: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
df20: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
df30: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
df40: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
df50: 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65  ime after.** cre
df60: 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61  ating the virtua
df70: 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73  l machine.  This
df80: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73   involves things
df90: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f   such.** as allo
dfa0: 63 61 74 69 6e 67 20 72 65 67 69 73 74 65 72 73  cating registers
dfb0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
dfc0: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
dfd0: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
dfe0: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
dff0: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
e000: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
e010: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
e020: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
e030: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
e040: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e050: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78  may be called ex
e060: 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61  actly once on ea
e070: 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ch virtual machi
e080: 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  ne..** After thi
e090: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e0a0: 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  led the VM has b
e0b0: 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61  een "packaged" a
e0c0: 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74  nd is ready.** t
e0d0: 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68  o run.  After th
e0e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e0f0: 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63 61  lled, further ca
e100: 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  lls to .** sqlit
e110: 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75  e3VdbeAddOp() fu
e120: 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68  nctions are proh
e130: 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f  ibited.  This ro
e140: 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74  utine disconnect
e150: 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72  s.** the Vdbe fr
e160: 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  om the Parse obj
e170: 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20  ect that helped 
e180: 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74  generate it so t
e190: 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56  hat the.** the V
e1a0: 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69  dbe becomes an i
e1b0: 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74  ndependent entit
e1c0: 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20  y and the Parse 
e1d0: 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a  object can be.**
e1e0: 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a   destroyed..**.*
e1f0: 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65  * Use the sqlite
e200: 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72  3VdbeRewind() pr
e210: 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f  ocedure to resto
e220: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
e230: 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  hine back.** to 
e240: 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74  its initial stat
e250: 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62  e after it has b
e260: 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64  een run..*/.void
e270: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
e280: 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70  Ready(.  Vdbe *p
e290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e2a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
e2b0: 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  DBE */.  Parse *
e2c0: 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20  pParse          
e2d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e2e0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  ng context */.){
e2f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
e320: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
e330: 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20    int nVar;     
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
e360: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e  rameters */.  in
e370: 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  t nMem;         
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e390: 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d  Number of VM mem
e3a0: 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f  ory registers */
e3b0: 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20  .  int nCursor; 
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
e3e0: 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20  ursors required 
e3f0: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  */.  int nArg;  
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e420: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75   arguments in su
e430: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
e440: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
e450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e460: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
e470: 0a 20 20 73 74 72 75 63 74 20 52 65 75 73 61 62  .  struct Reusab
e480: 6c 65 53 70 61 63 65 20 78 3b 20 20 20 20 20 20  leSpace x;      
e490: 20 20 2f 2a 20 52 65 75 73 61 62 6c 65 20 62 75    /* Reusable bu
e4a0: 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20  lk memory */..  
e4b0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
e4c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
e4d0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
e4e0: 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
e4f0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
e500: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
e510: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
e520: 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20  arse==p->pParse 
e530: 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
e540: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
e550: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
e560: 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73  ;.  nVar = pPars
e570: 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20  e->nVar;.  nMem 
e580: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
e590: 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72    nCursor = pPar
e5a0: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67  se->nTab;.  nArg
e5b0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41   = pParse->nMaxA
e5c0: 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 45 61 63 68  rg;.  .  /* Each
e5d0: 20 63 75 72 73 6f 72 20 75 73 65 73 20 61 20 6d   cursor uses a m
e5e0: 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20 54 68 65  emory cell.  The
e5f0: 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 28 63   first cursor (c
e600: 75 72 73 6f 72 20 30 29 20 63 61 6e 0a 20 20 2a  ursor 0) can.  *
e610: 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d 20 77 68  * use aMem[0] wh
e620: 69 63 68 20 69 73 20 6e 6f 74 20 6f 74 68 65 72  ich is not other
e630: 77 69 73 65 20 75 73 65 64 20 62 79 20 74 68 65  wise used by the
e640: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20   VDBE program.  
e650: 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70  Allocate.  ** sp
e660: 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
e670: 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20 63 75 72  f aMem[] for cur
e680: 73 6f 72 73 20 31 20 61 6e 64 20 67 72 65 61 74  sors 1 and great
e690: 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73  er..  ** See als
e6a0: 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f  o: allocateCurso
e6b0: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d  r()..  */.  nMem
e6c0: 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 69   += nCursor;.  i
e6d0: 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30 20 26 26  f( nCursor==0 &&
e6e0: 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b   nMem>0 ) nMem++
e6f0: 3b 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20  ;  /* Space for 
e700: 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20 69 66 20  aMem[0] even if 
e710: 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f  not used */..  /
e720: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
e730: 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65 20 6d   much reusable m
e740: 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62  emory is availab
e750: 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  le at the end of
e760: 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65   the.  ** opcode
e770: 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 65 78   array.  This ex
e780: 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  tra memory will 
e790: 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 66  be reallocated f
e7a0: 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74  or other element
e7b0: 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72  s.  ** of the pr
e7c0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
e7d0: 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55  ..  */.  n = ROU
e7e0: 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70  ND8(sizeof(Op)*p
e7f0: 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 20 20  ->nOp);         
e800: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
e810: 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75   opcode memory u
e820: 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63  sed */.  x.pSpac
e830: 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f  e = &((u8*)p->aO
e840: 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 20  p)[n];          
e850: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f       /* Unused o
e860: 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  pcode memory */.
e870: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
e880: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78  BYTE_ALIGNMENT(x
e890: 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 78 2e  .pSpace) );.  x.
e8a0: 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57  nFree = ROUNDDOW
e8b0: 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41  N8(pParse->szOpA
e8c0: 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42  lloc - n);  /* B
e8d0: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 6d  ytes of unused m
e8e0: 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72  emory */.  asser
e8f0: 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b  t( x.nFree>=0 );
e900: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
e910: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
e920: 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e 46 72 65  &x.pSpace[x.nFre
e930: 65 5d 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76  e]) );..  resolv
e940: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41  eP2Values(p, &nA
e950: 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74  rg);.  p->usesSt
e960: 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  mtJournal = (u8)
e970: 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69  (pParse->isMulti
e980: 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d  Write && pParse-
e990: 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66  >mayAbort);.  if
e9a0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
e9b0: 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a  n && nMem<10 ){.
e9c0: 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20      nMem = 10;. 
e9d0: 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20   }.  p->expired 
e9e0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72  = 0;..  /* Memor
e9f0: 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c  y for registers,
ea00: 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72   parameters, cur
ea10: 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c  sor, etc, is all
ea20: 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72  ocated in one or
ea30: 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73   two.  ** passes
ea40: 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  .  On the first 
ea50: 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20  pass, we try to 
ea60: 72 65 75 73 65 20 75 6e 75 73 65 64 20 6d 65 6d  reuse unused mem
ea70: 6f 72 79 20 61 74 20 74 68 65 20 0a 20 20 2a 2a  ory at the .  **
ea80: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
ea90: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
eaa0: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
eab0: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
eac0: 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65  y.  ** requireme
ead0: 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74  nts by reusing t
eae0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
eaf0: 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73  tail, then the s
eb00: 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20  econd.  ** pass 
eb10: 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65  will fill in the
eb20: 20 72 65 6d 61 69 6e 64 65 72 20 75 73 69 6e 67   remainder using
eb30: 20 61 20 66 72 65 73 68 20 6d 65 6d 6f 72 79 20   a fresh memory 
eb40: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20  allocation.  .  
eb50: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f  **.  ** This two
eb60: 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74  -pass approach t
eb70: 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75  hat reuses as mu
eb80: 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
eb90: 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20  sible from.  ** 
eba0: 74 68 65 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d  the leftover mem
ebb0: 6f 72 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ory at the end o
ebc0: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
ebd0: 61 79 2e 20 20 54 68 69 73 20 63 61 6e 20 73 69  ay.  This can si
ebe0: 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
ebf0: 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75   reduce the amou
ec00: 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c  nt of memory hel
ec10: 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20  d by a prepared 
ec20: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
ec30: 20 20 64 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e 65    do {.    x.nNe
ec40: 65 64 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 2d  eded = 0;.    p-
ec50: 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61  >aMem = allocSpa
ec60: 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20  ce(&x, p->aMem, 
ec70: 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
ec80: 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d  );.    p->aVar =
ec90: 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
eca0: 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69  p->aVar, nVar*si
ecb0: 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20  zeof(Mem));.    
ecc0: 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63  p->apArg = alloc
ecd0: 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 41  Space(&x, p->apA
ece0: 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28  rg, nArg*sizeof(
ecf0: 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 70 2d 3e 61  Mem*));.    p->a
ed00: 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pCsr = allocSpac
ed10: 65 28 26 78 2c 20 70 2d 3e 61 70 43 73 72 2c 20  e(&x, p->apCsr, 
ed20: 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56  nCursor*sizeof(V
ed30: 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69  dbeCursor*));.#i
ed40: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ed50: 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
ed60: 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65 63  US.    p->anExec
ed70: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
ed80: 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e  , p->anExec, p->
ed90: 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29  nOp*sizeof(i64))
eda0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
edb0: 20 78 2e 6e 4e 65 65 64 65 64 3d 3d 30 20 29 20   x.nNeeded==0 ) 
edc0: 62 72 65 61 6b 3b 0a 20 20 20 20 78 2e 70 53 70  break;.    x.pSp
edd0: 61 63 65 20 3d 20 70 2d 3e 70 46 72 65 65 20 3d  ace = p->pFree =
ede0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
edf0: 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65 65  RawNN(db, x.nNee
ee00: 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72 65  ded);.    x.nFre
ee10: 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a 20  e = x.nNeeded;. 
ee20: 20 7d 77 68 69 6c 65 28 20 21 64 62 2d 3e 6d 61   }while( !db->ma
ee30: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
ee40: 20 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70 50 61   p->pVList = pPa
ee50: 72 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20 20 70  rse->pVList;.  p
ee60: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20  Parse->pVList = 
ee70: 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e   0;.  p->explain
ee80: 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61   = pParse->expla
ee90: 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  in;.  if( db->ma
eea0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
eeb0: 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20    p->nVar = 0;. 
eec0: 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20     p->nCursor = 
eed0: 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  0;.    p->nMem =
eee0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
eef0: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43   p->nCursor = nC
ef00: 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e 56  ursor;.    p->nV
ef10: 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72  ar = (ynVar)nVar
ef20: 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72  ;.    initMemArr
ef30: 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72  ay(p->aVar, nVar
ef40: 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  , db, MEM_Null);
ef50: 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e  .    p->nMem = n
ef60: 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d  Mem;.    initMem
ef70: 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 6e  Array(p->aMem, n
ef80: 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e 64  Mem, db, MEM_Und
ef90: 65 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d 65 6d  efined);.    mem
efa0: 73 65 74 28 70 2d 3e 61 70 43 73 72 2c 20 30 2c  set(p->apCsr, 0,
efb0: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
efc0: 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23  VdbeCursor*));.#
efd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
efe0: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
eff0: 54 55 53 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  TUS.    memset(p
f000: 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70 2d 3e  ->anExec, 0, p->
f010: 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29  nOp*sizeof(i64))
f020: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  ;.#endif.  }.  s
f030: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
f040: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  (p);.}../*.** Cl
f050: 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f  ose a VDBE curso
f060: 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c  r and release al
f070: 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  l the resources 
f080: 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20  that cursor .** 
f090: 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e  happens to hold.
f0a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f0b0: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56  VdbeFreeCursor(V
f0c0: 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73  dbe *p, VdbeCurs
f0d0: 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20  or *pCx){.  if( 
f0e0: 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pCx==0 ){.    re
f0f0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
f100: 72 74 28 20 70 43 78 2d 3e 70 42 74 78 3d 3d 30  rt( pCx->pBtx==0
f110: 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79 70   || pCx->eCurTyp
f120: 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
f130: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 43   );.  switch( pC
f140: 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a 20  x->eCurType ){. 
f150: 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f     case CURTYPE_
f160: 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  SORTER: {.      
f170: 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
f180: 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43  rClose(p->db, pC
f190: 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
f1a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f1b0: 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20 7b  CURTYPE_BTREE: {
f1c0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 78 2d 3e  .      if( pCx->
f1d0: 70 42 74 78 20 29 7b 0a 20 20 20 20 20 20 20 20  pBtx ){.        
f1e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
f1f0: 65 28 70 43 78 2d 3e 70 42 74 78 29 3b 0a 20 20  e(pCx->pBtx);.  
f200: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78        /* The pCx
f210: 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62  ->pCursor will b
f220: 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69  e close automati
f230: 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69  cally, if it exi
f240: 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20 20  sts, by.        
f250: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  ** the call abov
f260: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  e. */.      }els
f270: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
f280: 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73  t( pCx->uc.pCurs
f290: 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  or!=0 );.       
f2a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
f2b0: 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75 63  seCursor(pCx->uc
f2c0: 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .pCursor);.     
f2d0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f2e0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
f2f0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
f300: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
f310: 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a  CURTYPE_VTAB: {.
f320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74        sqlite3_vt
f330: 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72  ab_cursor *pVCur
f340: 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75 72   = pCx->uc.pVCur
f350: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71  ;.      const sq
f360: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
f370: 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70  odule = pVCur->p
f380: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
f390: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 56 43       assert( pVC
f3a0: 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e  ur->pVtab->nRef>
f3b0: 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75 72  0 );.      pVCur
f3c0: 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b  ->pVtab->nRef--;
f3d0: 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e  .      pModule->
f3e0: 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20  xClose(pVCur);. 
f3f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f400: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
f410: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
f420: 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63  cursors in the c
f430: 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f  urrent frame..*/
f440: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
f450: 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65  seCursorsInFrame
f460: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
f470: 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20   p->apCsr ){.   
f480: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
f490: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
f4a0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56  r; i++){.      V
f4b0: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20  dbeCursor *pC = 
f4c0: 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20  p->apCsr[i];.   
f4d0: 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20     if( pC ){.   
f4e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f4f0: 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43  FreeCursor(p, pC
f500: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
f510: 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Csr[i] = 0;.    
f520: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
f530: 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
f540: 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
f550: 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73   the VdbeFrame s
f560: 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
f570: 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73  Vdbe. This.** is
f580: 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70   used, for examp
f590: 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67  le, when a trigg
f5a0: 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69  er sub-program i
f5b0: 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74  s halted to rest
f5c0: 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74  ore.** control t
f5d0: 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  o the main progr
f5e0: 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  am..*/.int sqlit
f5f0: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
f600: 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46  re(VdbeFrame *pF
f610: 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  rame){.  Vdbe *v
f620: 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20   = pFrame->v;.  
f630: 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72  closeCursorsInFr
f640: 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53  ame(v);.#ifdef S
f650: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
f660: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76  T_SCANSTATUS.  v
f670: 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d  ->anExec = pFram
f680: 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69  e->anExec;.#endi
f690: 66 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72  f.  v->aOp = pFr
f6a0: 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e  ame->aOp;.  v->n
f6b0: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70  Op = pFrame->nOp
f6c0: 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46  ;.  v->aMem = pF
f6d0: 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d  rame->aMem;.  v-
f6e0: 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >nMem = pFrame->
f6f0: 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72  nMem;.  v->apCsr
f700: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72   = pFrame->apCsr
f710: 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d  ;.  v->nCursor =
f720: 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72   pFrame->nCursor
f730: 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52  ;.  v->db->lastR
f740: 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c  owid = pFrame->l
f750: 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e  astRowid;.  v->n
f760: 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
f770: 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64  >nChange;.  v->d
f780: 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  b->nChange = pFr
f790: 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a  ame->nDbChange;.
f7a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
f7b0: 65 74 65 41 75 78 44 61 74 61 28 76 2d 3e 64 62  eteAuxData(v->db
f7c0: 2c 20 26 76 2d 3e 70 41 75 78 44 61 74 61 2c 20  , &v->pAuxData, 
f7d0: 2d 31 2c 20 30 29 3b 0a 20 20 76 2d 3e 70 41 75  -1, 0);.  v->pAu
f7e0: 78 44 61 74 61 20 3d 20 70 46 72 61 6d 65 2d 3e  xData = pFrame->
f7f0: 70 41 75 78 44 61 74 61 3b 0a 20 20 70 46 72 61  pAuxData;.  pFra
f800: 6d 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 30  me->pAuxData = 0
f810: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
f820: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
f830: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
f840: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
f850: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
f860: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
f870: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
f880: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
f890: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
f8a0: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
f8b0: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
f8c0: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
f8d0: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
f8e0: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
f8f0: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
f900: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
f910: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
f920: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
f930: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
f940: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
f950: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
f960: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
f970: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
f980: 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  e;.    for(pFram
f990: 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
f9a0: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46  ame->pParent; pF
f9b0: 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
f9c0: 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rent);.    sqlit
f9d0: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
f9e0: 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20  re(pFrame);.    
f9f0: 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20  p->pFrame = 0;. 
fa00: 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30     p->nFrame = 0
fa10: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
fa20: 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a  p->nFrame==0 );.
fa30: 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e    closeCursorsIn
fa40: 46 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20  Frame(p);.  if( 
fa50: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72  p->aMem ){.    r
fa60: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
fa70: 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29  ->aMem, p->nMem)
fa80: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
fa90: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20  ->pDelFrame ){. 
faa0: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44     VdbeFrame *pD
fab0: 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d  el = p->pDelFram
fac0: 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72  e;.    p->pDelFr
fad0: 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72  ame = pDel->pPar
fae0: 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
faf0: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
fb00: 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pDel);.  }..  /*
fb10: 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64   Delete any auxd
fb20: 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ata allocations 
fb30: 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a  made by the VM *
fb40: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44  /.  if( p->pAuxD
fb50: 61 74 61 20 29 20 73 71 6c 69 74 65 33 56 64 62  ata ) sqlite3Vdb
fb60: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70  eDeleteAuxData(p
fb70: 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61  ->db, &p->pAuxDa
fb80: 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73  ta, -1, 0);.  as
fb90: 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74  sert( p->pAuxDat
fba0: 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  a==0 );.}../*.**
fbb0: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
fbc0: 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20   after a single 
fbd0: 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  run..*/.static v
fbe0: 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65  oid Cleanup(Vdbe
fbf0: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
fc00: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69  *db = p->db;..#i
fc10: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
fc20: 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61  G.  /* Execute a
fc30: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
fc40: 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
fc50: 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72  t the Vdbe.apCsr
fc60: 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62  [] and .  ** Vdb
fc70: 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20  e.aMem[] arrays 
fc80: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
fc90: 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a  n cleaned up.  *
fca0: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  /.  int i;.  if(
fcb0: 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28   p->apCsr ) for(
fcc0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
fcd0: 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  r; i++) assert( 
fce0: 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29  p->apCsr[i]==0 )
fcf0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
fd00: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
fd10: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20  i<p->nMem; i++) 
fd20: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
fd30: 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e  i].flags==MEM_Un
fd40: 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23  defined );.  }.#
fd50: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
fd60: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
fd70: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
fd80: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rMsg = 0;.  p->p
fd90: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d  ResultSet = 0;.}
fda0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
fdb0: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
fdc0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
fdd0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
fde0: 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74  y this SQL.** st
fdf0: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
fe00: 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70   now set at comp
fe10: 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72  ile time, rather
fe20: 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20   than during.** 
fe30: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
fe40: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f   vdbe program so
fe50: 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f   that sqlite3_co
fe60: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e  lumn_count() can
fe70: 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  .** be called on
fe80: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
fe90: 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  t before sqlite3
fea0: 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64  _step()..*/.void
feb0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
fec0: 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20  umCols(Vdbe *p, 
fed0: 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b  int nResColumn){
fee0: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
fef0: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  ;.  int n;.  sql
ff00: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
ff10: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
ff20: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
ff30: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
ff40: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
ff50: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
ff60: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
ff70: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
ff80: 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
ff90: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
ffa0: 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
ffb0: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
ffc0: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
ffd0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
ffe0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65  NN(db, sizeof(Me
fff0: 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  m)*n );.  if( p-
10000 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72  >aColName==0 ) r
10010 65 74 75 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d  eturn;.  initMem
10020 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
10030 65 2c 20 6e 2c 20 70 2d 3e 64 62 2c 20 4d 45 4d  e, n, p->db, MEM
10040 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _Null);.}../*.**
10050 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
10060 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
10070 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
10080 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
10090 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
100a0 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
100b0 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
100c0 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
100d0 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
100e0 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
100f0 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
10100 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
10110 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  s()..**.** The f
10120 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20  inal parameter, 
10130 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e  xDel, must be on
10140 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41  e of SQLITE_DYNA
10150 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  MIC, SQLITE_STAT
10160 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  IC.** or SQLITE_
10170 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74  TRANSIENT. If it
10180 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   is SQLITE_DYNAM
10190 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  IC, then the buf
101a0 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  fer pointed.** t
101b0 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20  o by zName will 
101c0 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69  be freed by sqli
101d0 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e  te3DbFree() when
101e0 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73   the vdbe is des
101f0 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  troyed..*/.int s
10200 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
10210 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c  Name(.  Vdbe *p,
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10230 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
10240 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65   being configure
10250 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20  d */.  int idx, 
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
10280 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65   of column zName
10290 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20   applies to */. 
102a0 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20   int var,       
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
102d0 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61  COLNAME_* consta
102e0 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
102f0 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
10300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
10310 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
10320 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a  ontaining name *
10330 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
10340 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20  (void*)         
10350 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
10360 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65  anagement strate
10370 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a  gy for zName */.
10380 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
10390 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
103a0 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
103b0 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
103c0 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
103d0 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
103e0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
103f0 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
10400 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21   !zName || xDel!
10410 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20  =SQLITE_DYNAMIC 
10420 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
10430 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
10440 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
10450 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b  ->aColName!=0 );
10460 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28  .  pColName = &(
10470 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b  p->aColName[idx+
10480 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  var*p->nResColum
10490 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n]);.  rc = sqli
104a0 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
104b0 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
104c0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
104d0 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65  8, xDel);.  asse
104e0 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e  rt( rc!=0 || !zN
104f0 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65  ame || (pColName
10500 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d  ->flags&MEM_Term
10510 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )!=0 );.  return
10520 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
10530 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
10540 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
10550 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
10560 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
10570 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
10580 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
10590 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
105a0 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
105b0 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
105c0 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
105d0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
105e0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
105f0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
10600 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
10610 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
10620 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
10630 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
10640 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
10650 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
10660 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20  .  int nTrans = 
10670 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
10680 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
10690 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d  an active write-
106a0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
106b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
106c0 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e 64 69  * that are candi
106d0 64 61 74 65 73 20 66 6f 72 20 61 20 74 77 6f 2d  dates for a two-
106e0 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75 73 69  phase commit usi
106f0 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20 20 20  ng a.           
10700 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65          ** maste
10710 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  r-journal */.  i
10720 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10730 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f  K;.  int needXco
10740 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65  mmit = 0;..#ifde
10750 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10760 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
10770 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e  With this option
10780 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  , sqlite3VtabSyn
10790 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74  c() is defined t
107a0 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a  o be simply .  *
107b0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70  * SQLITE_OK so p
107c0 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20   is not used. . 
107d0 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
107e0 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69  AMETER(p);.#endi
107f0 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  f..  /* Before d
10800 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
10810 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79  se, call the xSy
10820 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f  nc() callback fo
10830 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75  r any.  ** virtu
10840 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73  al module tables
10850 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73   written in this
10860 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
10870 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62  is has to.  ** b
10880 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65  e done before de
10890 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65  termining whethe
108a0 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  r a master journ
108b0 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  al file is .  **
108c0 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e   required, as an
108d0 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
108e0 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74  k may add an att
108f0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20  ached database. 
10900 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73   ** to the trans
10910 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
10920 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
10930 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f  ync(db, p);..  /
10940 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65  * This loop dete
10950 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68  rmines (a) if th
10960 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68  e commit hook sh
10970 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
10980 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77  and.  ** (b) how
10990 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66   many database f
109a0 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77  iles have open w
109b0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
109c0 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63  s, not .  ** inc
109d0 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20  luding the temp 
109e0 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73  database. (b) is
109f0 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75   important becau
10a00 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20  se if more than 
10a10 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61  .  ** one databa
10a20 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f  se file has an o
10a30 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
10a40 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20  ction, a master 
10a50 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
10a60 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
10a70 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d  r an atomic comm
10a80 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  it..  */ .  for(
10a90 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
10aa0 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
10ab0 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65   i++){ .    Btre
10ac0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
10ad0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
10ae0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
10af0 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
10b00 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
10b10 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73  or not a databas
10b20 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 6d  e might need a m
10b30 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65  aster journal de
10b40 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20 20 20  pends upon.     
10b50 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20   ** its journal 
10b60 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74 68 65  mode (among othe
10b70 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68 69 73  r things).  This
10b80 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d 69 6e   matrix determin
10b90 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a  es which.      *
10ba0 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20  * journal modes 
10bb0 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  use a master jou
10bc0 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68 20 64  rnal and which d
10bd0 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 73  o not */.      s
10be0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
10bf0 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b 0a 20  MJNeeded[] = {. 
10c00 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54 45         /* DELETE
10c10 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20 20 20     */  1,.      
10c20 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20 20 2a    /* PERSIST   *
10c30 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  / 1,.        /* 
10c40 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a  OFF       */ 0,.
10c50 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 4e 43          /* TRUNC
10c60 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20  ATE  */ 1,.     
10c70 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20 20 20     /* MEMORY    
10c80 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a  */ 0,.        /*
10c90 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20 30 0a   WAL       */ 0.
10ca0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 50        };.      P
10cb0 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
10cc0 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69 61  /* Pager associa
10cd0 74 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f 0a  ted with pBt */.
10ce0 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69        needXcommi
10cf0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  t = 1;.      sql
10d00 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
10d10 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Bt);.      pPage
10d20 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
10d30 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Pager(pBt);.    
10d40 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
10d50 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d 50  .safety_level!=P
10d60 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
10d70 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26 20 61  _OFF.       && a
10d80 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74 65 33  MJNeeded[sqlite3
10d90 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d  PagerGetJournalM
10da0 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20 20 20  ode(pPager)].   
10db0 20 20 20 29 7b 20 0a 20 20 20 20 20 20 20 20 61     ){ .        a
10dc0 73 73 65 72 74 28 20 69 21 3d 31 20 29 3b 0a 20  ssert( i!=1 );. 
10dd0 20 20 20 20 20 20 20 6e 54 72 61 6e 73 2b 2b 3b         nTrans++;
10de0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
10df0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10e00 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
10e10 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
10e20 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
10e30 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Bt);.    }.  }. 
10e40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10e50 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
10e60 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
10e70 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
10e80 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
10e90 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b  ns at all, invok
10ea0 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  e the commit hoo
10eb0 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58  k */.  if( needX
10ec0 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43  commit && db->xC
10ed0 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b  ommitCallback ){
10ee0 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43  .    rc = db->xC
10ef0 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62  ommitCallback(db
10f00 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20  ->pCommitArg);. 
10f10 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10f20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10f30 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
10f40 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITHOOK;.    }.  
10f50 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
10f60 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
10f70 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
10f80 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
10f90 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
10fa0 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
10fb0 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
10fc0 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
10fd0 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
10fe0 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
10ff0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
11000 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
11010 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
11020 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
11030 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
11040 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
11050 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
11060 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
11070 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
11080 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
11090 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
110a0 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
110b0 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
110c0 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
110d0 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
110e0 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
110f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
11100 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
11110 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
11120 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
11130 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54  ].pBt)).   || nT
11140 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20  rans<=1.  ){.   
11150 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
11160 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
11170 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
11180 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
11190 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
111a0 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
111b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
111c0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
111d0 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
111e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
111f0 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
11200 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
11210 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
11220 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
11230 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
11240 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
11250 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
11260 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
11270 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
11280 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
11290 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
112a0 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
112b0 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
112c0 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
112d0 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
112e0 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
112f0 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
11300 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
11310 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
11320 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
11330 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
11340 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
11350 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
11360 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
11370 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
11380 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
11390 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
113a0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
113b0 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  wo(pBt, 0);.    
113c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
113d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
113e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
113f0 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
11400 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11410 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
11420 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
11430 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
11440 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
11450 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
11460 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
11470 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
11480 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
11490 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
114a0 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c  mmitted atomical
114b0 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
114c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
114d0 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
114e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
114f0 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
11500 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
11510 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
11520 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
11530 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
11540 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
11550 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
11560 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
11570 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
11580 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
11590 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30  ile *pMaster = 0
115a0 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
115b0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
115c0 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79  s;.    int retry
115d0 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  Count = 0;.    i
115e0 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20  nt nMainFile;.. 
115f0 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d     /* Select a m
11600 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11610 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  le name */.    n
11620 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
11630 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e  e3Strlen30(zMain
11640 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74  File);.    zMast
11650 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  er = sqlite3MPri
11660 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58  ntf(db, "%s-mjXX
11670 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e  XXXX9XXz", zMain
11680 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  File);.    if( z
11690 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75  Master==0 ) retu
116a0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
116b0 42 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a 20  BKPT;.    do {. 
116c0 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d       u32 iRandom
116d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 72  ;.      if( retr
116e0 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  yCount ){.      
116f0 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
11700 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >100 ){.        
11710 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
11720 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64  LITE_FULL, "MJ d
11730 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73  elete: %s", zMas
11740 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
11750 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
11760 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
11770 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
11780 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
11790 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74  e if( retryCount
117a0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==1 ){.         
117b0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
117c0 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f  ITE_FULL, "MJ co
117d0 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73  llide: %s", zMas
117e0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ter);.        }.
117f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
11800 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20  tryCount++;.    
11810 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
11820 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e  ness(sizeof(iRan
11830 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b  dom), &iRandom);
11840 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
11850 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61  nprintf(13, &zMa
11860 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c  ster[nMainFile],
11870 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c   "-mj%06X9%02X",
11880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66  (iRandom>>8)&0xf
118b0 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30  fffff, iRandom&0
118c0 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  xff);.      /* T
118d0 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61  he antipenultima
118e0 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  te character of 
118f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11900 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20  al name must.   
11910 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20     ** be "9" to 
11920 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69  avoid name colli
11930 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67  sions when using
11940 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20   8+3 filenames. 
11950 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
11960 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33   zMaster[sqlite3
11970 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72  Strlen30(zMaster
11980 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20  )-3]=='9' );.   
11990 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
119a0 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c  ffix3(zMainFile,
119b0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
119c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
119d0 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
119e0 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
119f0 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
11a00 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
11a10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
11a20 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  es );.    if( rc
11a30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11a40 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
11a50 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
11a60 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
11a70 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c  qlite3OsOpenMall
11a80 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  oc(pVfs, zMaster
11a90 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20  , &pMaster, .   
11aa0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
11ab0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
11ac0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
11ad0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
11ae0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
11af0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
11b00 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20  TER_JOURNAL, 0. 
11b10 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
11b20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11b30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
11b40 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
11b50 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
11b60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
11b70 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
11b80 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20  he name of each 
11b90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
11ba0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
11bb0 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20   into the new.  
11bc0 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
11bd0 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20  nal file. If an 
11be0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20  error occurs at 
11bf0 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65  this point close
11c00 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65  .    ** and dele
11c10 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
11c20 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20  urnal file. All 
11c30 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  the individual j
11c40 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20  ournal files.   
11c50 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27   ** still have '
11c60 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73  null' as the mas
11c70 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
11c80 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c  ter, so they wil
11c90 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61  l roll.    ** ba
11ca0 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
11cb0 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
11cc0 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  curs..    */.   
11cd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
11ce0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
11cf0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
11d00 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
11d10 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
11d20 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
11d30 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  t) ){.        ch
11d40 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20  ar const *zFile 
11d50 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
11d60 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74  tJournalname(pBt
11d70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
11d80 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
11d90 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
11da0 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61  /* Ignore TEMP a
11db0 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  nd :memory: data
11dc0 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
11dd0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
11de0 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29  t( zFile[0]!=0 )
11df0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
11e00 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d  qlite3OsWrite(pM
11e10 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71  aster, zFile, sq
11e20 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
11e30 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
11e40 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
11e50 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
11e60 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  30(zFile)+1;.   
11e70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11e80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11e90 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11ea0 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
11eb0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11ec0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
11ed0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
11ee0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
11ef0 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
11f00 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
11f10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
11f20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
11f30 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
11f40 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11f50 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
11f60 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
11f70 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
11f80 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
11f90 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
11fa0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d     */.    if( 0=
11fb0 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  =(sqlite3OsDevic
11fc0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
11fd0 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45  (pMaster)&SQLITE
11fe0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
11ff0 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54  L).     && SQLIT
12000 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
12010 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65  te3OsSync(pMaste
12020 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  r, SQLITE_SYNC_N
12030 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20  ORMAL)).    ){. 
12040 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
12050 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
12060 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
12070 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
12080 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
12090 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
120a0 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
120b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
120c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
120d0 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
120e0 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
120f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
12100 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
12110 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
12120 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
12130 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
12140 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
12150 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
12160 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
12170 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
12180 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
12190 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
121a0 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
121b0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
121c0 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
121d0 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
121e0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
121f0 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72  One(), then ther
12200 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
12210 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61  at the.    ** ma
12220 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12230 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e  e will be orphan
12240 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
12250 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20  t delete it,.   
12260 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
12270 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
12280 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
12290 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
122a0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
122b0 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
122c0 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
122d0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
122e0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
122f0 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
12300 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
12310 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
12320 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
12330 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
12340 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
12350 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
12360 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b  e(pBt, zMaster);
12370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12380 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
12390 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
123a0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
123b0 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20  SQLITE_BUSY );. 
123c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
123d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
123e0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
123f0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
12400 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
12410 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
12420 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
12430 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
12440 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
12450 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
12460 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
12470 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
12480 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
12490 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
124a0 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
124b0 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
124c0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
124d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
124e0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
124f0 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  Master, 1);.    
12500 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12510 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
12520 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
12530 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
12540 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12550 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69  }..    /* All fi
12560 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
12570 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ies have already
12580 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f   been synced, so
12590 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
125a0 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
125b0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
125c0 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20  tPhaseTwo() are 
125d0 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c  only closing fil
125e0 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  es and.    ** de
125f0 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
12600 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49  ting journals. I
12610 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
12620 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20   wrong while.   
12630 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
12640 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72  ening we don't r
12650 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20  eally care. The 
12660 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
12670 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
12680 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67  ion is already g
12690 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73  uaranteed, but s
126a0 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27  ome stray 'cold'
126b0 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a   journals.    **
126c0 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72   may be lying ar
126d0 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20  ound. Returning 
126e0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f  an error code wo
126f0 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73  n't help matters
12700 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73  ..    */.    dis
12710 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
12720 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20  o_errors();.    
12730 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
12740 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
12750 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
12760 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
12770 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
12780 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
12790 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
127a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
127b0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
127c0 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20  o(pBt, 1);.     
127d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
127e0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
127f0 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c  loc();.    enabl
12800 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
12810 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
12820 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
12830 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
12840 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12850 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
12860 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
12870 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64   the sqlite3.nVd
12880 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76  beActive count v
12890 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68  ariable.** match
128a0 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
128b0 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c   vdbe's in the l
128c0 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62  ist sqlite3.pVdb
128d0 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75  e that are.** cu
128e0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20  rrently active. 
128f0 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69  An assertion fai
12900 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f  ls if the two co
12910 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  unts do not matc
12920 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  h..** This is an
12930 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63   internal self-c
12940 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69  heck only - it i
12950 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69  s not an essenti
12960 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a  al processing.**
12970 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   step..**.** Thi
12980 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
12990 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  NDEBUG is define
129a0 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  d..*/.#ifndef ND
129b0 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64  EBUG.static void
129c0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
129d0 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  Cnt(sqlite3 *db)
129e0 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69  {.  Vdbe *p;.  i
129f0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
12a00 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20  t nWrite = 0;.  
12a10 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20  int nRead = 0;. 
12a20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
12a30 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
12a40 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
12a50 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33  mt_busy((sqlite3
12a60 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20  _stmt*)p) ){.   
12a70 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
12a80 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  if( p->readOnly=
12a90 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20  =0 ) nWrite++;. 
12aa0 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52       if( p->bIsR
12ab0 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b  eader ) nRead++;
12ac0 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
12ad0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
12ae0 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
12af0 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20  nVdbeActive );. 
12b00 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d   assert( nWrite=
12b10 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20  =db->nVdbeWrite 
12b20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  );.  assert( nRe
12b30 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61  ad==db->nVdbeRea
12b40 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  d );.}.#else.#de
12b50 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65  fine checkActive
12b60 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69  VdbeCnt(x).#endi
12b70 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
12b80 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
12b90 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
12ba0 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65  t opened a state
12bb0 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
12bc0 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f  ,.** close it no
12bd0 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20  w. Argument eOp 
12be0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
12bf0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12c00 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  K or.** SAVEPOIN
12c10 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74  T_RELEASE. If it
12c20 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
12c30 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65  LLBACK, then the
12c40 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
12c50 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
12c60 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70  led back. If eOp
12c70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   is SAVEPOINT_RE
12c80 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20  LEASE, then the 
12c90 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72  .** statement tr
12ca0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
12cb0 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mitted..**.** If
12cc0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
12cd0 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  urs, an SQLITE_I
12ce0 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
12cf0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
12d00 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53   .** Otherwise S
12d10 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
12d20 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
12d30 49 4e 45 20 69 6e 74 20 76 64 62 65 43 6c 6f 73  INE int vdbeClos
12d40 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20  eStatement(Vdbe 
12d50 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20  *p, int eOp){.  
12d60 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64  sqlite3 *const d
12d70 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
12d80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12d90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
12da0 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  t int iSavepoint
12db0 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74   = p->iStatement
12dc0 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  -1;..  assert( e
12dd0 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
12de0 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53  LLBACK || eOp==S
12df0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
12e00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
12e10 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b  >nStatement>0 );
12e20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53  .  assert( p->iS
12e30 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e  tatement==(db->n
12e40 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53  Statement+db->nS
12e50 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20  avepoint) );..  
12e60 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
12e70 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69  Db; i++){ .    i
12e80 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
12e90 4f 4b 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  OK;.    Btree *p
12ea0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
12eb0 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
12ec0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f   ){.      if( eO
12ed0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
12ee0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
12ef0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
12f00 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
12f10 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
12f20 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
12f30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12f40 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
12f50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
12f60 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
12f70 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
12f80 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
12f90 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
12fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12fb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12fc0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
12fd0 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc2;.      }.   
12fe0 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 74   }.  }.  db->nSt
12ff0 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 70 2d 3e  atement--;.  p->
13000 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
13010 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13020 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
13030 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
13040 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
13050 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
13060 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
13070 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
13080 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
13090 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
130a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
130b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
130c0 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
130d0 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  b, SAVEPOINT_REL
130e0 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
130f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
13100 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
13110 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
13120 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
13130 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f  back, also resto
13140 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74  re the .  ** dat
13150 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65  abase handles de
13160 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
13170 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65  t counter to the
13180 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68   value it had wh
13190 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  en .  ** the sta
131a0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
131b0 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20  on was opened.  
131c0 2a 2f 0a 20 20 69 66 28 20 65 4f 70 3d 3d 53 41  */.  if( eOp==SA
131d0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
131e0 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 66   ){.    db->nDef
131f0 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e  erredCons = p->n
13200 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20  StmtDefCons;.   
13210 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
13220 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  mCons = p->nStmt
13230 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 7d 0a  DefImmCons;.  }.
13240 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
13250 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  nt sqlite3VdbeCl
13260 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62  oseStatement(Vdb
13270 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a  e *p, int eOp){.
13280 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6e 53 74    if( p->db->nSt
13290 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53  atement && p->iS
132a0 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
132b0 72 65 74 75 72 6e 20 76 64 62 65 43 6c 6f 73 65  return vdbeClose
132c0 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 4f 70  Statement(p, eOp
132d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
132e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
132f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
13300 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
13310 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
13320 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61  opened by the da
13330 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c  tabase .** handl
13340 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
13350 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  h the VM passed 
13360 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69  as an argument i
13370 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a  s about to be .*
13380 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20  * committed. If 
13390 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
133a0 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66  nding deferred f
133b0 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
133c0 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69  raint.** violati
133d0 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ons, return SQLI
133e0 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77  TE_ERROR. Otherw
133f0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
13400 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
13410 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46  re outstanding F
13420 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64  K violations and
13430 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
13440 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
13450 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65  E_ERROR, set the
13460 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56   result of the V
13470 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53  M to SQLITE_CONS
13480 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
13490 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61  Y.** and write a
134a0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
134b0 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75  to it. Then retu
134c0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
134d0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
134e0 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
134f0 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  KEY.int sqlite3V
13500 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20  dbeCheckFk(Vdbe 
13510 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64  *p, int deferred
13520 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
13530 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
13540 28 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62  (deferred && (db
13550 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b  ->nDeferredCons+
13560 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
13570 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20  Cons)>0) .   || 
13580 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d  (!deferred && p-
13590 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30  >nFkConstraint>0
135a0 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72  ) .  ){.    p->r
135b0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
135c0 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
135d0 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63  ;.    p->errorAc
135e0 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
135f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13600 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49 47  Error(p, "FOREIG
13610 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
13620 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
13630 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
13640 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
13650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
13660 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
13670 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
13680 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
13690 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
136a0 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
136b0 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
136c0 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
136d0 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
136e0 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
136f0 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
13700 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
13710 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
13720 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
13730 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
13740 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
13750 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
13760 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
13770 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
13780 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
13790 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
137a0 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
137b0 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
137c0 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
137d0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
137e0 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
137f0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
13800 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
13810 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
13820 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
13830 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
13840 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
13850 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
13860 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
13870 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
13880 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
13890 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
138a0 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
138b0 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
138c0 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
138d0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138f0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
13900 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
13910 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
13920 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
13930 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
13940 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
13950 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
13960 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
13970 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
13980 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
13990 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
139a0 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
139b0 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
139c0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
139d0 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
139e0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
139f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
13a00 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
13a10 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
13a20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
13a30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
13a40 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
13a50 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
13a60 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
13a70 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
13a80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
13a90 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
13aa0 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
13ab0 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
13ac0 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
13ad0 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
13ae0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
13af0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
13b00 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
13b10 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
13b20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
13b30 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
13b40 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
13b50 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
13b60 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61   */..  if( p->ma
13b70 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
13b80 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  RUN ){.    retur
13b90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13ba0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
13bb0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
13bc0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
13bd0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
13be0 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
13bf0 70 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  p);.  checkActiv
13c00 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
13c10 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
13c20 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
13c30 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
13c40 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72  never started or
13c50 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c   if the.  ** SQL
13c60 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20   statement does 
13c70 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74  not read or writ
13c80 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  e a database fil
13c90 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  e.  */.  if( p->
13ca0 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52  pc>=0 && p->bIsR
13cb0 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  eader ){.    int
13cc0 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
13cd0 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
13ce0 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20  om p->rc */.    
13cf0 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  int eStatementOp
13d00 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73   = 0;.    int is
13d10 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
13d20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
13d30 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70  to true if a 'sp
13d40 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a  ecial' error */.
13d50 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c  .    /* Lock all
13d60 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20   btrees used by 
13d70 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
13d80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13d90 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f  Enter(p);..    /
13da0 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20  * Check for one 
13db0 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
13dc0 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63  rrors */.    mrc
13dd0 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b   = p->rc & 0xff;
13de0 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72  .    isSpecialEr
13df0 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54  ror = mrc==SQLIT
13e00 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
13e10 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20  SQLITE_IOERR.   
13e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e30 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45    || mrc==SQLITE
13e40 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72  _INTERRUPT || mr
13e50 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  c==SQLITE_FULL;.
13e60 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61      if( isSpecia
13e70 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  lError ){.      
13e80 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
13e90 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e  was read-only an
13ea0 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
13eb0 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   is SQLITE_INTER
13ec0 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20  RUPT, .      ** 
13ed0 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e  no rollback is n
13ee0 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77  ecessary. Otherw
13ef0 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20  ise, at least a 
13f00 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
13f10 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
13f20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  must be rolled b
13f30 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ack to restore t
13f40 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61  he database to a
13f50 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69   .      ** consi
13f60 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
13f70 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
13f80 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65  ven if the state
13f90 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ment is read-onl
13fa0 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  y, it is importa
13fb0 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20  nt to perform.  
13fc0 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65      ** a stateme
13fd0 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
13fe0 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61  n rollback opera
13ff0 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72  tion. If the err
14000 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63  or .      ** occ
14010 75 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74  urred while writ
14020 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
14030 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  al, sub-journal 
14040 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  or database.    
14050 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72    ** file as par
14060 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74  t of an effort t
14070 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20  o free up cache 
14080 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74  space (see funct
14090 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ion.      ** pag
140a0 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61  erStress() in pa
140b0 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c  ger.c), the roll
140c0 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  back is required
140d0 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20   to restore .   
140e0 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20     ** the pager 
140f0 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20  to a consistent 
14100 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
14110 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65        if( !p->re
14120 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
14130 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
14140 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
14150 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
14160 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
14170 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65  _FULL) && p->use
14180 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
14190 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
141a0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
141b0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
141c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
141d0 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
141e0 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
141f0 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
14200 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
14210 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
14220 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
14230 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
14240 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
14250 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
14260 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
14270 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
14280 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
14290 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
142a0 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
142b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
142c0 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
142d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
142e0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
142f0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
14300 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
14310 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14320 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
14330 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66   for immediate f
14340 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61  oreign key viola
14350 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66  tions. */.    if
14360 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14370 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
14380 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
14390 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
143a0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
143b0 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
143c0 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
143d0 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
143e0 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20   writer .    ** 
143f0 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65  VM, then we do e
14400 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f  ither a commit o
14410 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68  r rollback of th
14420 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
14430 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20  ction. .    **. 
14440 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73     ** Note: This
14450 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73   block also runs
14460 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   if one of the s
14470 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61  pecial errors ha
14480 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62  ndled .    ** ab
14490 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  ove has occurred
144a0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
144b0 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e  ( !sqlite3VtabIn
144c0 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26  Sync(db) .     &
144d0 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  & db->autoCommit
144e0 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56   .     && db->nV
144f0 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65  dbeWrite==(p->re
14500 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20  adOnly==0) .    
14510 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
14520 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
14530 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
14540 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
14550 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
14560 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
14570 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
14580 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  (p, 1);.        
14590 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
145a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
145b0 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64  f( NEVER(p->read
145c0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
145d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
145e0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
145f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14600 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
14610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14620 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
14630 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
14640 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  EY;.        }els
14650 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  e{ .          /*
14660 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   The auto-commit
14670 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
14680 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
14690 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a  was successful .
146a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
146b0 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27  hit an 'OR FAIL'
146c0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
146d0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66  there are no def
146e0 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20  erred foreign.  
146f0 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63          ** key c
14700 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f  onstraints to ho
14710 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  ld up the transa
14720 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e  ction. This mean
14730 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20  s a commit .    
14740 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
14750 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ired. */.       
14760 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d     rc = vdbeComm
14770 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  it(db, p);.     
14780 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
14790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
147a0 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20   && p->readOnly 
147b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
147c0 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
147d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
147e0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
147f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
14800 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14810 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
14820 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
14830 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
14840 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
14850 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  _OK);.          
14860 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
14870 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14880 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65           db->nDe
14890 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a  ferredCons = 0;.
148a0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
148b0 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
148c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
148d0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
148e0 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20  TE_DeferFKs;.   
148f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
14900 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
14910 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ges(db);.       
14920 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
14930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
14940 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
14950 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
14960 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
14970 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
14980 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
14990 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
149a0 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d  f( eStatementOp=
149b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
149c0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
149d0 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
149e0 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
149f0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
14a00 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
14a10 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d  RELEASE;.      }
14a20 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
14a30 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
14a40 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  t ){.        eSt
14a50 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
14a60 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
14a70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14a80 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
14a90 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
14aa0 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
14ab0 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
14ac0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
14ad0 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
14ae0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
14af0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
14b00 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
14b10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
14b20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e   /* If eStatemen
14b30 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  tOp is non-zero,
14b40 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   then a statemen
14b50 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  t transaction ne
14b60 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
14b70 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
14b80 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20  lled back. Call 
14b90 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
14ba0 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20  Statement() to. 
14bb0 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20     ** do so. If 
14bc0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72  this operation r
14bd0 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c  eturns an error,
14be0 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
14bf0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a   statement.    *
14c00 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
14c10 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c  SQLITE_OK or SQL
14c20 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
14c30 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65  then promote the
14c40 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
14c50 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20  statement error 
14c60 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  code..    */.   
14c70 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
14c80 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  p ){.      rc = 
14c90 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
14ca0 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74  Statement(p, eSt
14cb0 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20  atementOp);.    
14cc0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
14cd0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
14ce0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
14cf0 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
14d00 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20  _CONSTRAINT ){. 
14d10 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
14d20 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
14d30 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14d40 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
14d50 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
14d60 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
14d70 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
14d80 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
14d90 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
14da0 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
14db0 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
14dc0 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
14dd0 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
14de0 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
14df0 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
14e00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14e10 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
14e20 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
14e30 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
14e40 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e   and no statemen
14e50 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  t transaction.  
14e60 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f    ** has been ro
14e70 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74  lled back, updat
14e80 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  e the database c
14e90 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65  onnection change
14ea0 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a  -counter. .    *
14eb0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61  /.    if( p->cha
14ec0 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20  ngeCntOn ){.    
14ed0 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
14ee0 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op!=SAVEPOINT_RO
14ef0 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
14f00 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
14f10 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
14f20 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  Change);.      }
14f30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
14f40 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
14f50 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ges(db, 0);.    
14f60 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68    }.      p->nCh
14f70 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ange = 0;.    }.
14f80 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
14f90 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  the locks */.   
14fa0 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
14fb0 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(p);.  }..  /* 
14fc0 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
14fd0 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
14fe0 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
14ff0 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
15000 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
15010 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  >=0 ){.    db->n
15020 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20  VdbeActive--;.  
15030 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
15040 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72  ly ) db->nVdbeWr
15050 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  ite--;.    if( p
15060 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62  ->bIsReader ) db
15070 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20  ->nVdbeRead--;. 
15080 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
15090 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e  VdbeActive>=db->
150a0 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20  nVdbeRead );.   
150b0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
150c0 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62  beRead>=db->nVdb
150d0 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73  eWrite );.    as
150e0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57  sert( db->nVdbeW
150f0 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20  rite>=0 );.  }. 
15100 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
15110 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
15120 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
15130 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d  t(db);.  if( db-
15140 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
15150 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
15160 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
15170 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
15180 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
15190 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
151a0 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
151b0 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
151c0 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
151d0 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
151e0 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
151f0 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
15200 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
15210 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
15220 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
15230 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
15240 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
15250 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
15260 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
15270 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
15280 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
15290 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
152a0 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  ive>0 || db->aut
152b0 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
152c0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
152d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
152e0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
152f0 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
15300 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a  SQLITE_OK);.}...
15310 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
15320 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
15330 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
15340 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
15350 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
15360 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
15370 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
15380 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
15390 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
153a0 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
153b0 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
153c0 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
153d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
153e0 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72  * Copy the error
153f0 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
15400 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e  message belongin
15410 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61  g to the VDBE pa
15420 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
15430 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
15440 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61   its database ha
15450 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68  ndle (so that th
15460 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72  ey will be .** r
15470 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73  eturned by calls
15480 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63   to sqlite3_errc
15490 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ode() and sqlite
154a0 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a  3_errmsg())..**.
154b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
154c0 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20   does not clear 
154d0 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63  the VDBE error c
154e0 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20  ode or message, 
154f0 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  just.** copies t
15500 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62  hem to the datab
15510 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
15520 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  nt sqlite3VdbeTr
15530 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65  ansferError(Vdbe
15540 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
15550 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
15560 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
15570 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
15580 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69  ){.    db->bBeni
15590 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20  gnMalloc++;.    
155a0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
155b0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
155c0 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20  if( db->pErr==0 
155d0 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c  ) db->pErr = sql
155e0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29  ite3ValueNew(db)
155f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
15600 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
15610 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
15620 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
15630 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
15640 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
15650 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
15660 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e  .    db->bBenign
15670 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 20 20 64 62  Malloc--;.    db
15680 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
15690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
156a0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
156b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
156c0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
156d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
156e0 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53  OG./*.** If an S
156f0 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c  QLITE_CONFIG_SQL
15700 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69  LOG hook is regi
15710 73 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56  stered and the V
15720 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20  M has been run, 
15730 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a  .** invoke it..*
15740 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
15750 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56  beInvokeSqllog(V
15760 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73  dbe *v){.  if( s
15770 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
15780 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d  ig.xSqllog && v-
15790 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
157a0 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e  & v->zSql && v->
157b0 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  pc>=0 ){.    cha
157c0 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73  r *zExpanded = s
157d0 71 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64  qlite3VdbeExpand
157e0 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b  Sql(v, v->zSql);
157f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e  .    assert( v->
15800 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
15810 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70   );.    if( zExp
15820 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73  anded ){.      s
15830 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
15840 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20  ig.xSqllog(.    
15850 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
15860 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
15870 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78  gArg, v->db, zEx
15880 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20  panded, 1.      
15890 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
158a0 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45  DbFree(v->db, zE
158b0 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a  xpanded);.    }.
158c0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
158d0 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53  fine vdbeInvokeS
158e0 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a  qllog(x).#endif.
158f0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
15900 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
15910 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f  cution but do no
15920 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42  t delete the VDB
15930 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57  E just yet..** W
15940 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
15950 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a  essages into *pz
15960 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20  ErrMsg.  Return 
15970 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
15980 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  .**.** After thi
15990 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e  s routine is run
159a0 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c  , the VDBE shoul
159b0 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65  d be ready to be
159c0 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61   executed.** aga
159d0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f  in..**.** To loo
159e0 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20  k at it another 
159f0 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  way, this routin
15a00 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61  e resets the sta
15a10 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72  te of the.** vir
15a20 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f  tual machine fro
15a30 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  m VDBE_MAGIC_RUN
15a40 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48   or VDBE_MAGIC_H
15a50 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56  ALT back to.** V
15a60 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a  DBE_MAGIC_INIT..
15a70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
15a80 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29  beReset(Vdbe *p)
15a90 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
15aa0 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  .  db = p->db;..
15ab0 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64    /* If the VM d
15ac0 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f  id not run to co
15ad0 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69  mpletion or if i
15ae0 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e  t encountered an
15af0 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65  .  ** error, the
15b00 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68  n it might not h
15b10 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20  ave been halted 
15b20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61  properly.  So ha
15b30 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a  lt.  ** it now..
15b40 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
15b50 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a  beHalt(p);..  /*
15b60 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73   If the VDBE has
15b70 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72   be run even par
15b80 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61  tially, then tra
15b90 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20  nsfer the error 
15ba0 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72  code.  ** and er
15bb0 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d  ror message from
15bc0 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74   the VDBE into t
15bd0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
15be0 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74   structure.  But
15bf0 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42  .  ** if the VDB
15c00 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  E has just been 
15c10 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68  set to run but h
15c20 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  as not actually 
15c30 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a  executed any.  *
15c40 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79  * instructions y
15c50 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61  et, leave the ma
15c60 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  in database erro
15c70 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e  r information un
15c80 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20  changed..  */.  
15c90 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
15ca0 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71      vdbeInvokeSq
15cb0 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c  llog(p);.    sql
15cc0 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
15cd0 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71  Error(p);.    sq
15ce0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15cf0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
15d00 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
15d10 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f  .    if( p->runO
15d20 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70  nlyOnce ) p->exp
15d30 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ired = 1;.  }els
15d40 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70  e if( p->rc && p
15d50 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20  ->expired ){.   
15d60 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20   /* The expired 
15d70 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
15d80 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20  the VDBE before 
15d90 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20  the first call. 
15da0 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
15db0 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e  _step(). For con
15dc0 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20  sistency (since 
15dd0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77  sqlite3_step() w
15de0 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  as.    ** called
15df0 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  ), set the datab
15e00 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69  ase error in thi
15e10 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a  s case as well..
15e20 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
15e30 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
15e40 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72  b, p->rc, p->zEr
15e50 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c  rMsg ? "%s" : 0,
15e60 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
15e70 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15e80 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
15e90 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
15ea0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
15eb0 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72  eclaim all memor
15ec0 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44  y used by the VD
15ed0 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75  BE.  */.  Cleanu
15ee0 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65  p(p);..  /* Save
15ef0 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72   profiling infor
15f00 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73  mation from this
15f10 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a   VDBE run..  */.
15f20 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
15f30 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45  ILE.  {.    FILE
15f40 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76   *out = fopen("v
15f50 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22  dbe_profile.out"
15f60 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20  , "a");.    if( 
15f70 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  out ){.      int
15f80 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   i;.      fprint
15f90 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b  f(out, "---- ");
15fa0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
15fb0 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
15fc0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
15fd0 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e  out, "%02x", p->
15fe0 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a  aOp[i].opcode);.
15ff0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
16000 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
16010 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a  ;.      if( p->z
16020 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Sql ){.        c
16030 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20  har c, pc = 0;. 
16040 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
16050 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20  ut, "-- ");.    
16060 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20      for(i=0; (c 
16070 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30  = p->zSql[i])!=0
16080 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
16090 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29    if( pc=='\n' )
160a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
160b0 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  - ");.          
160c0 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20  putc(c, out);.  
160d0 20 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a          pc = c;.
160e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
160f0 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29    if( pc!='\n' )
16100 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
16110 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n");.      }.   
16120 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
16130 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
16140 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30      char zHdr[10
16150 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0];.        sqli
16160 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
16170 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c  eof(zHdr), zHdr,
16180 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c   "%6u %12llu %8l
16190 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  lu ",.          
161a0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
161b0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
161c0 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
161d0 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
161e0 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
161f0 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
16200 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
16210 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
16220 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  fprintf(out, "%s
16230 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20  ", zHdr);.      
16240 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
16250 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d  ntOp(out, i, &p-
16260 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >aOp[i]);.      
16270 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f  }.      fclose(o
16280 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ut);.    }.  }.#
16290 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75 72 72  endif.  p->iCurr
162a0 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70  entTime = 0;.  p
162b0 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
162c0 41 47 49 43 5f 52 45 53 45 54 3b 0a 20 20 72 65  AGIC_RESET;.  re
162d0 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d  turn p->rc & db-
162e0 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a  >errMask;.}. ./*
162f0 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64  .** Clean up and
16300 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61   delete a VDBE a
16310 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20  fter execution. 
16320 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
16330 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74  er which is.** t
16340 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20  he result code. 
16350 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
16360 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e   message text in
16370 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f  to *pzErrMsg..*/
16380 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
16390 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70  Finalize(Vdbe *p
163a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
163b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
163c0 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
163d0 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61  GIC_RUN || p->ma
163e0 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
163f0 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  HALT ){.    rc =
16400 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
16410 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74  t(p);.    assert
16420 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65  ( (rc & p->db->e
16430 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20  rrMask)==rc );. 
16440 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
16450 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74  Delete(p);.  ret
16460 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16470 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f   If parameter iO
16480 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  p is less than z
16490 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ero, then invoke
164a0 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
164b0 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c  for.** all auxil
164c0 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65  iary data pointe
164d0 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63  rs currently cac
164e0 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  hed by the VM pa
164f0 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66  ssed as.** the f
16500 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
16510 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20  *.** Or, if iOp 
16520 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
16530 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
16540 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74 72  , then the destr
16550 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79  uctor is.** only
16560 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f   invoked for tho
16570 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  se auxiliary dat
16580 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74  a pointers creat
16590 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20 0a  ed by the user .
165a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f  ** function invo
165b0 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75  ked by the OP_Fu
165c0 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74  nction opcode at
165d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70   instruction iOp
165e0 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65   of .** VM pVdbe
165f0 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20  , and only then 
16600 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74  if:.**.**    * t
16610 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 75  he associated fu
16620 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
16630 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20   is the 32nd or 
16640 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a  later (counting.
16650 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66  **      from lef
16660 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a  t to right), or.
16670 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63  **.**    * the c
16680 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
16690 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73   in argument mas
166a0 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 65 72  k is clear (wher
166b0 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20  e the first.**  
166c0 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72      function par
166d0 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e  ameter correspon
166e0 64 73 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e  ds to bit 0 etc.
166f0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
16700 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
16710 61 74 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ata(sqlite3 *db,
16720 20 41 75 78 44 61 74 61 20 2a 2a 70 70 2c 20 69   AuxData **pp, i
16730 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b  nt iOp, int mask
16740 29 7b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20  ){.  while( *pp 
16750 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a  ){.    AuxData *
16760 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20  pAux = *pp;.    
16770 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20  if( (iOp<0).    
16780 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d   || (pAux->iOp==
16790 69 4f 70 20 26 26 20 28 70 41 75 78 2d 3e 69 41  iOp && (pAux->iA
167a0 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20  rg>31 || !(mask 
167b0 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78  & MASKBIT32(pAux
167c0 2d 3e 69 41 72 67 29 29 29 29 0a 20 20 20 20 29  ->iArg)))).    )
167d0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
167e0 28 20 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31  ( pAux->iArg==31
167f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41   );.      if( pA
16800 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20  ux->xDelete ){. 
16810 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65         pAux->xDe
16820 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29  lete(pAux->pAux)
16830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16840 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78  *pp = pAux->pNex
16850 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
16860 44 62 46 72 65 65 28 64 62 2c 20 70 41 75 78 29  DbFree(db, pAux)
16870 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16880 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e     pp= &pAux->pN
16890 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ext;.    }.  }.}
168a0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
168b0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
168c0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
168d0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
168e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
168f0 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62  ** except for ob
16900 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69  ject itself, whi
16910 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e  ch is preserved.
16920 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
16930 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
16940 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
16950 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
16960 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56  e() is that.** V
16970 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f  dbeDelete() also
16980 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62   unlinks the Vdb
16990 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
169a0 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65  of VMs associate
169b0 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61  d with.** the da
169c0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
169d0 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20  n and frees the 
169e0 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a  object itself..*
169f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
16a00 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71  beClearObject(sq
16a10 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
16a20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61  *p){.  SubProgra
16a30 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b  m *pSub, *pNext;
16a40 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
16a50 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62  ==0 || p->db==db
16a60 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   );.  releaseMem
16a70 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
16a80 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
16a90 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66  *COLNAME_N);.  f
16aa0 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67  or(pSub=p->pProg
16ab0 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ram; pSub; pSub=
16ac0 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
16ad0 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b  t = pSub->pNext;
16ae0 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41  .    vdbeFreeOpA
16af0 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61  rray(db, pSub->a
16b00 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a  Op, pSub->nOp);.
16b10 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
16b20 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d  e(db, pSub);.  }
16b30 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
16b40 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
16b50 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
16b60 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
16b70 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 73   p->nVar);.    s
16b80 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16b90 20 70 2d 3e 70 56 4c 69 73 74 29 3b 0a 20 20 20   p->pVList);.   
16ba0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16bb0 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20  b, p->pFree);.  
16bc0 7d 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72  }.  vdbeFreeOpAr
16bd0 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20  ray(db, p->aOp, 
16be0 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74  p->nOp);.  sqlit
16bf0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16c00 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  aColName);.  sql
16c10 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16c20 2d 3e 7a 53 71 6c 29 3b 0a 23 69 66 64 65 66 20  ->zSql);.#ifdef 
16c30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
16c40 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
16c50 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
16c60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
16c70 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Scan; i++){.    
16c80 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16c90 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e  db, p->aScan[i].
16ca0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
16cb0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16cc0 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 20  db, p->aScan);. 
16cd0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
16ce0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
16cf0 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
16d00 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
16d10 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
16d20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
16d30 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
16d40 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
16d50 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
16d60 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16d70 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
16d80 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16d90 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20  ClearObject(db, 
16da0 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p);.  if( p->pPr
16db0 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
16dc0 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
16dd0 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
16de0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
16df0 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
16e00 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
16e10 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
16e20 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
16e30 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
16e40 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
16e50 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
16e60 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70  _MAGIC_DEAD;.  p
16e70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->db = 0;.  sqli
16e80 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
16e90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  ;.}../*.** The c
16ea0 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20  ursor "p" has a 
16eb0 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65  pending seek ope
16ec0 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  ration that has 
16ed0 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20  not yet been.** 
16ee0 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65  carried out.  Se
16ef0 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f  ek the cursor no
16f00 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  w.  If an error 
16f10 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a  occurs, return.*
16f20 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
16f30 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
16f40 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
16f50 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
16f60 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
16f70 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
16f80 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a  .  int res, rc;.
16f90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
16fa0 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ST.  extern int 
16fb0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
16fc0 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ount;.#endif.  a
16fd0 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72  ssert( p->deferr
16fe0 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73  edMoveto );.  as
16ff0 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
17000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
17010 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
17020 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63  PE_BTREE );.  rc
17030 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
17040 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d  ovetoUnpacked(p-
17050 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20  >uc.pCursor, 0, 
17060 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
17070 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28   0, &res);.  if(
17080 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
17090 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20  .  if( res!=0 ) 
170a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
170b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64  RRUPT_BKPT;.#ifd
170c0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
170d0 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
170e0 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
170f0 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
17100 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  eto = 0;.  p->ca
17110 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
17120 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72  E_STALE;.  retur
17130 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17140 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20  /*.** Something 
17150 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72  has moved cursor
17160 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63   "p" out of plac
17170 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f  e.  Maybe the ro
17180 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e  w it was.** poin
17190 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74  ted to was delet
171a0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
171b0 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20  r it.  Or maybe 
171c0 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a  the btree was.**
171d0 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68   rebalanced.  Wh
171e0 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65  atever the cause
171f0 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65  , try to restore
17200 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63   "p" to the plac
17210 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f  e it.** is suppo
17220 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69  sed to be pointi
17230 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20  ng.  If the row 
17240 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
17250 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a  from under the.*
17260 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68  * cursor, set th
17270 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
17280 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  t to a NULL row.
17290 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
172a0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68  QLITE_NOINLINE h
172b0 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
172c0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
172d0 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65  .  int isDiffere
172e0 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73  ntRow, rc;.  ass
172f0 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65  ert( p->eCurType
17300 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
17310 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
17320 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
17330 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17340 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
17350 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  Moved(p->uc.pCur
17360 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  sor) );.  rc = s
17370 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
17380 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70  rRestore(p->uc.p
17390 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65  Cursor, &isDiffe
173a0 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63  rentRow);.  p->c
173b0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
173c0 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20  HE_STALE;.  if( 
173d0 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29  isDifferentRow )
173e0 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b   p->nullRow = 1;
173f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17400 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
17410 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
17420 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  cursor is valid.
17430 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75    Restore the cu
17440 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20  rsor.** if need 
17450 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20  be.  Return any 
17460 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74  I/O error from t
17470 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61  he restore opera
17480 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
17490 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65  ite3VdbeCursorRe
174a0 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72  store(VdbeCursor
174b0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
174c0 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
174d0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
174e0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
174f0 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
17500 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b  ->uc.pCursor) ){
17510 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
17520 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
17530 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
17540 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17550 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
17560 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61   cursor p is rea
17570 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  dy to read or wr
17580 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77  ite the row to w
17590 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c  hich it.** was l
175a0 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20  ast positioned. 
175b0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
175c0 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20   code if an OOM 
175d0 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72  fault or I/O err
175e0 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75  or.** prevents u
175f0 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69  s from positioni
17600 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
17610 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73   its correct pos
17620 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
17630 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
17640 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
17650 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
17660 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
17670 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
17680 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65  If no move is pe
17690 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20  nding, check to 
176a0 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68  see if the row h
176b0 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74  as been.** delet
176c0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
176d0 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  r the cursor and
176e0 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b   if it has, mark
176f0 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61   the row as.** a
17700 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a   NULL row..**.**
17710 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
17720 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
17730 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  ng to the correc
17740 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72  t row and that r
17750 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65  ow has.** not be
17760 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
17770 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
17780 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20  rsor, then this 
17790 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
177a0 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
177b0 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
177c0 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  to(VdbeCursor **
177d0 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b  pp, int *piCol){
177e0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
177f0 20 3d 20 2a 70 70 3b 0a 20 20 69 66 28 20 70 2d   = *pp;.  if( p-
17800 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
17810 50 45 5f 42 54 52 45 45 20 29 7b 0a 20 20 20 20  PE_BTREE ){.    
17820 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  if( p->deferredM
17830 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 20 20 69  oveto ){.      i
17840 6e 74 20 69 4d 61 70 3b 0a 20 20 20 20 20 20 69  nt iMap;.      i
17850 66 28 20 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26  f( p->aAltMap &&
17860 20 28 69 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74   (iMap = p->aAlt
17870 4d 61 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30  Map[1+*piCol])>0
17880 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
17890 3d 20 70 2d 3e 70 41 6c 74 43 75 72 73 6f 72 3b  = p->pAltCursor;
178a0 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20  .        *piCol 
178b0 3d 20 69 4d 61 70 20 2d 20 31 3b 0a 20 20 20 20  = iMap - 1;.    
178c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
178d0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
178e0 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
178f0 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28  eDeferredMoveto(
17900 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
17910 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
17920 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
17930 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  uc.pCursor) ){. 
17940 20 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64       return hand
17950 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
17960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17970 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17980 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
17990 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
179a0 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
179b0 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
179c0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
179d0 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
179e0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
179f0 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
17a00 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
17a10 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
17a20 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
17a30 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
17a40 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
17a50 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
17a60 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
17a70 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
17a80 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
17a90 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
17aa0 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
17ab0 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
17ac0 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
17ad0 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
17ae0 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
17af0 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
17b00 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
17b10 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
17b20 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
17b30 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
17b40 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
17b50 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
17b60 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
17b70 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
17b80 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
17b90 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
17ba0 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
17bb0 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
17bc0 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
17bd0 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
17be0 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
17bf0 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
17c00 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
17c10 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
17c20 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
17c30 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
17c40 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
17c50 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61  data blob separa
17c60 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
17c70 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
17c80 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
17c90 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
17ca0 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
17cb0 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
17cc0 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
17cd0 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
17ce0 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
17cf0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
17d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
17d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
17d20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
17d30 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
17d40 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
17d50 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
17d60 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
17d70 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
17d80 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
17d90 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
17da0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
17db0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
17dc0 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
17df0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17e00 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
17e10 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
17e20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17e30 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e50 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
17e60 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
17e70 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
17e90 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
17ea0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
17eb0 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
17ec0 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
17ed0 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
17ee0 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
17f00 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
17f10 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
17f20 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
17f30 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
17f40 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
17f50 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
17f60 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f80 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
17f90 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
17fa0 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
17fb0 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
17fc0 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
17fd0 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
17fe0 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
17ff0 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
18000 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
18010 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
18020 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
18030 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
18040 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
18050 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
18060 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
18070 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
18080 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
18090 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
180a0 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
180b0 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
180c0 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
180d0 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
180e0 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
180f0 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e  ormat, u32 *pLen
18100 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
18110 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
18120 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74  u32 n;..  assert
18130 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69  ( pLen!=0 );.  i
18140 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
18150 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  l ){.    *pLen =
18160 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   0;.    return 0
18170 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
18180 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  s&MEM_Int ){.   
18190 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
181a0 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c  hether to use 1,
181b0 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79   2, 4, 6 or 8 by
181c0 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69  tes. */.#   defi
181d0 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28  ne MAX_6BYTE (((
181e0 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29  (i64)0x00008000)
181f0 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34  <<32)-1).    i64
18200 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   i = pMem->u.i;.
18210 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69      u64 u;.    i
18220 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
18230 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73  u = ~i;.    }els
18240 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a  e{.      u = i;.
18250 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c      }.    if( u<
18260 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20 69 66  =127 ){.      if
18270 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69  ( (i&1)==i && fi
18280 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
18290 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20          *pLen = 
182a0 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
182b0 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20 20 20  n 8+(u32)u;.    
182c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
182d0 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20 20 20   *pLen = 1;.    
182e0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
182f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
18300 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 7b 20  if( u<=32767 ){ 
18310 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74 75 72  *pLen = 2; retur
18320 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 2; }.    if( u
18330 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a 70 4c  <=8388607 ){ *pL
18340 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e 20 33  en = 3; return 3
18350 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 32  ; }.    if( u<=2
18360 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a 70 4c  147483647 ){ *pL
18370 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e 20 34  en = 4; return 4
18380 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d  ; }.    if( u<=M
18390 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70 4c 65  AX_6BYTE ){ *pLe
183a0 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20 35 3b  n = 6; return 5;
183b0 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38   }.    *pLen = 8
183c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
183d0 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
183e0 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
183f0 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72  *pLen = 8;.    r
18400 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
18410 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
18420 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
18430 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
18440 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61  MEM_Blob) );.  a
18450 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d  ssert( pMem->n>=
18460 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29  0 );.  n = (u32)
18470 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66  pMem->n;.  if( f
18480 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
18490 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d  ){.    n += pMem
184a0 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20  ->u.nZero;.  }. 
184b0 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72 65   *pLen = n;.  re
184c0 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32  turn ((n*2) + 12
184d0 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53   + ((flags&MEM_S
184e0 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a  tr)!=0));.}../*.
184f0 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66 6f 72  ** The sizes for
18500 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 6c 65   serial types le
18510 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73  ss than 128.*/.s
18520 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 73  tatic const u8 s
18530 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
18540 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  izes[] = {.     
18550 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20 20 32     /*  0   1   2
18560 20 20 20 33 20 20 20 34 20 20 20 35 20 20 20 36     3   4   5   6
18570 20 20 20 37 20 20 20 38 20 20 20 39 20 2a 2f 20     7   8   9 */ 
18580 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30    ./*   0 */   0
18590 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34  ,  1,  2,  3,  4
185a0 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20 20 30  ,  6,  8,  8,  0
185b0 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20  ,  0,./*  10 */ 
185c0 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
185d0 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c    1,  1,  2,  2,
185e0 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20    3,  3,./*  20 
185f0 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35 2c 20  */   4,  4,  5, 
18600 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37 2c 20   5,  6,  6,  7, 
18610 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20   7,  8,  8,./*  
18620 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31  30 */   9,  9, 1
18630 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c 20 31  0, 10, 11, 11, 1
18640 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f  2, 12, 13, 13,./
18650 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20 31 34  *  40 */  14, 14
18660 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20 31 36  , 15, 15, 16, 16
18670 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20 31 38  , 17, 17, 18, 18
18680 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c  ,./*  50 */  19,
18690 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c   19, 20, 20, 21,
186a0 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c   21, 22, 22, 23,
186b0 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20   23,./*  60 */  
186c0 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35 2c 20  24, 24, 25, 25, 
186d0 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37 2c 20  26, 26, 27, 27, 
186e0 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a  28, 28,./*  70 *
186f0 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c 20 33  /  29, 29, 30, 3
18700 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c 20 33  0, 31, 31, 32, 3
18710 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38  2, 33, 33,./*  8
18720 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20 33 35  0 */  34, 34, 35
18730 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20 33 37  , 35, 36, 36, 37
18740 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a  , 37, 38, 38,./*
18750 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c    90 */  39, 39,
18760 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c   40, 40, 41, 41,
18770 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c   42, 42, 43, 43,
18780 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34 2c 20  ./* 100 */  44, 
18790 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36 2c 20  44, 45, 45, 46, 
187a0 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38 2c 20  46, 47, 47, 48, 
187b0 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34  48,./* 110 */  4
187c0 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c 20 35  9, 49, 50, 50, 5
187d0 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c 20 35  1, 51, 52, 52, 5
187e0 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f  3, 53,./* 120 */
187f0 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20 35 35    54, 54, 55, 55
18800 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20 35 37  , 56, 56, 57, 57
18810 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .};../*.** Retur
18820 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
18830 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
18840 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
18850 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
18860 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
18870 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
18880 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
18890 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
188a0 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a  al_type>=128 ){.
188b0 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
188c0 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
188d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
188e0 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
188f0 31 32 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  12 .            
18900 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  || sqlite3SmallT
18910 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
18920 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74  type]==(serial_t
18930 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20  ype - 12)/2 );. 
18940 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
18950 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
18960 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
18970 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33 56 64  }.}.u8 sqlite3Vd
18980 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54  beOneByteSerialT
18990 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69 61 6c  ypeLen(u8 serial
189a0 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  _type){.  assert
189b0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
189c0 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  8 );.  return sq
189d0 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
189e0 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
189f0 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ;  .}../*.** If 
18a00 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63  we are on an arc
18a10 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d  hitecture with m
18a20 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61  ixed-endian floa
18a30 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20  ting .** points 
18a40 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20  (ex: ARM7) then 
18a50 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34  swap the lower 4
18a60 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20   bytes with the 
18a70 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65  .** upper 4 byte
18a80 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  s.  Return the r
18a90 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  esult..**.** For
18aa0 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75   most architectu
18ab0 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e  res, this is a n
18ac0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74  o-op..**.** (lat
18ad0 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f  er):  It is repo
18ae0 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20  rted to me that 
18af0 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  the mixed-endian
18b00 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41   problem.** on A
18b10 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20  RM7 is an issue 
18b20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69  with GCC, not wi
18b30 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70  th the ARM7 chip
18b40 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74  .  It seems.** t
18b50 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f  hat early versio
18b60 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64  ns of GCC stored
18b70 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f   the two words o
18b80 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c  f a 64-bit.** fl
18b90 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67  oat in the wrong
18ba0 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61   order.  And tha
18bb0 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  t error has been
18bc0 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65   propagated.** e
18bd0 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20  ver since.  The 
18be0 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63  blame is not nec
18bf0 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43  essarily with GC
18c00 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43  C, though..** GC
18c10 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73  C might have jus
18c20 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72  t copying the pr
18c30 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69  oblem from a pri
18c40 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20  or compiler..** 
18c50 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74  I am also told t
18c60 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f  hat newer versio
18c70 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66  ns of GCC that f
18c80 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e  ollow a differen
18c90 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65  t.** ABI get the
18ca0 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68   byte order righ
18cb0 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70  t..**.** Develop
18cc0 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65  ers using SQLite
18cd0 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75   on an ARM7 shou
18ce0 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72  ld compile and r
18cf0 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c  un their.** appl
18d00 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44  ication using -D
18d10 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61  SQLITE_DEBUG=1 a
18d20 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57  t least once.  W
18d30 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61  ith DEBUG.** ena
18d40 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72  bled, some asser
18d50 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e  ts below will en
18d60 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79  sure that the by
18d70 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66  te order of.** f
18d80 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
18d90 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e  lues is correct.
18da0 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d  .**.** (2007-08-
18db0 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56  30)  Frank van V
18dc0 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20  ugt has studied 
18dd0 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f  this problem clo
18de0 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20  sely.** and has 
18df0 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67  send his finding
18e00 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20  s to the SQLite 
18e10 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61  developers.  Fra
18e20 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61  nk.** writes tha
18e30 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72  t some Linux ker
18e40 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74  nels offer float
18e50 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61  ing point hardwa
18e60 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20  re.** emulation 
18e70 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33  that uses only 3
18e80 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20  2-bit mantissas 
18e90 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c  instead of a ful
18ea0 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73  l .** 48-bits as
18eb0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
18ec0 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20   IEEE standard. 
18ed0 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a   (This is the.**
18ee0 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54   CONFIG_FPE_FAST
18ef0 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e  FPE option.)  On
18f00 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66   such systems, f
18f10 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
18f20 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62   byte swapping b
18f30 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70  ecomes very comp
18f40 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f  licated.  To avo
18f50 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20  id problems,.** 
18f60 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79  the necessary by
18f70 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63  te swapping is c
18f80 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67  arried out using
18f90 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
18fa0 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  r.** rather than
18fb0 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e   a 64-bit float.
18fc0 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20    Frank assures 
18fd0 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  us that the code
18fe0 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66   here.** works f
18ff0 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65  or him.  We, the
19000 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76   developers, hav
19010 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65  e no way to inde
19020 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72  pendently.** ver
19030 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72  ify this, but Fr
19040 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f  ank seems to kno
19050 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c  w what he is tal
19060 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f  king about.** so
19070 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a   we trust him..*
19080 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19090 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
190a0 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20  IT_FLOAT.static 
190b0 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36  u64 floatSwap(u6
190c0 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b  4 in){.  union {
190d0 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
190e0 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b  u32 i[2];.  } u;
190f0 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72  .  u32 t;..  u.r
19100 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69   = in;.  t = u.i
19110 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20  [0];.  u.i[0] = 
19120 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d  u.i[1];.  u.i[1]
19130 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75   = t;.  return u
19140 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73  .r;.}.# define s
19150 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
19160 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61  oat(X)  X = floa
19170 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23  tSwap(X).#else.#
19180 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
19190 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a  dEndianFloat(X).
191a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
191b0 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a  ite the serializ
191c0 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72  ed data blob for
191d0 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
191e0 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a  d in pMem into .
191f0 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73  ** buf. It is as
19200 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
19210 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61  aller has alloca
19220 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73  ted sufficient s
19230 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pace..** Return 
19240 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
19250 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a  tes written..**.
19260 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61  ** nBuf is the a
19270 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c  mount of space l
19280 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54  eft in buf[].  T
19290 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
192a0 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20  ponsible.** for 
192b0 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67  allocating enoug
192c0 68 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d  h space to buf[]
192d0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74   to hold the ent
192e0 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75  ire field, exclu
192f0 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  sive.** of the p
19300 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74  Mem->u.nZero byt
19310 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72  es for a MEM_Zer
19320 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52  o value..**.** R
19330 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
19340 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
19350 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
19360 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
19370 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
19380 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
19390 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
193a0 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
193b0 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
193c0 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
193d0 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
193e0 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69  []..*/ .u32 sqli
193f0 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
19400 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70  (u8 *buf, Mem *p
19410 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f  Mem, u32 serial_
19420 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e  type){.  u32 len
19430 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  ;..  /* Integer 
19440 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66  and Real */.  if
19450 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37  ( serial_type<=7
19460 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e   && serial_type>
19470 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a  0 ){.    u64 v;.
19480 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69      u32 i;.    i
19490 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
194a0 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  7 ){.      asser
194b0 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69  t( sizeof(v)==si
194c0 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20  zeof(pMem->u.r) 
194d0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
194e0 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20  &v, &pMem->u.r, 
194f0 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
19500 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
19510 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
19520 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
19530 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
19540 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
19550 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
19560 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
19570 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ];.    assert( i
19580 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  >0 );.    do{.  
19590 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28      buf[--i] = (
195a0 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
195b0 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
195c0 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20 20  }while( i );.   
195d0 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
195e0 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
195f0 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
19600 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
19610 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
19620 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
19630 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
19640 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a  )?pMem->u.nZero:
19650 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
19660 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56  == (int)sqlite3V
19670 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
19680 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
19690 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d  .    len = pMem-
196a0 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e  >n;.    if( len>
196b0 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66 2c 20  0 ) memcpy(buf, 
196c0 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
196d0 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
196e0 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
196f0 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
19700 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
19710 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22  .}../* Input "x"
19720 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   is a sequence o
19730 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61  f unsigned chara
19740 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65  cters that repre
19750 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e  sent a.** big-en
19760 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52  dian integer.  R
19770 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61  eturn the equiva
19780 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65  lent native inte
19790 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f  ger.*/.#define O
197a0 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  NE_BYTE_INT(x)  
197b0 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23    ((i8)(x)[0]).#
197c0 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f  define TWO_BYTE_
197d0 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28  INT(x)    (256*(
197e0 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b  i8)((x)[0])|(x)[
197f0 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45  1]).#define THRE
19800 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28  E_BYTE_INT(x)  (
19810 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30  65536*(i8)((x)[0
19820 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28  ])|((x)[1]<<8)|(
19830 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[2]).#define F
19840 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29  OUR_BYTE_UINT(x)
19850 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c    (((u32)(x)[0]<
19860 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  <24)|((x)[1]<<16
19870 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
19880 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[3]).#define FO
19890 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28  UR_BYTE_INT(x) (
198a0 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78  16777216*(i8)((x
198b0 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  )[0])|((x)[1]<<1
198c0 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
198d0 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  x)[3])../*.** De
198e0 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
198f0 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
19900 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
19910 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
19920 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
19930 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
19940 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
19950 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
19960 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
19970 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
19980 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77  mplemented as tw
19990 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  o separate routi
199a0 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61  nes for performa
199b0 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20  nce..** The few 
199c0 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69  cases that requi
199d0 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  re local variabl
199e0 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75  es are broken ou
199f0 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74  t into a separat
19a00 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20  e.** routine so 
19a10 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73  that in most cas
19a20 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  es the overhead 
19a30 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74  of moving the st
19a40 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69  ack pointer.** i
19a50 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73  s avoided..*/ .s
19a60 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54 45  tatic u32 SQLITE
19a70 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c  _NOINLINE serial
19a80 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
19a90 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
19aa0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
19ab0 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
19ac0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
19ad0 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
19ae0 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
19af0 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
19b00 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
19b10 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
19b20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
19b30 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
19b40 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
19b50 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
19b60 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20  YTE_UINT(buf);. 
19b70 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59   u32 y = FOUR_BY
19b80 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a  TE_UINT(buf+4);.
19b90 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20    x = (x<<32) + 
19ba0 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  y;.  if( serial_
19bb0 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f  type==6 ){.    /
19bc0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19bd0 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c  -29851-52272 Val
19be0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
19bf0 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  an 64-bit.    **
19c00 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
19c10 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
19c20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
19c30 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d  64*)&x;.    pMem
19c40 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
19c50 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  t;.    testcase(
19c60 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
19c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
19c80 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
19c90 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65  7343-49114 Value
19ca0 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
19cb0 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20 36   IEEE 754-2008 6
19cc0 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f  4-bit.    ** flo
19cd0 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62  ating point numb
19ce0 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  er. */.#if !defi
19cf0 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
19d00 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
19d10 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
19d20 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  NT).    /* Verif
19d30 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
19d40 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
19d50 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
19d60 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79  e same.    ** by
19d70 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
19d80 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
19d90 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
19da0 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a  _FLOAT is.    **
19db0 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
19dc0 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
19dd0 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
19de0 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
19df0 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a  ** endian..    *
19e00 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
19e10 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
19e20 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
19e30 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  2;.    static co
19e40 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
19e50 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20  1.0;.    u64 t2 
19e60 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69  = t1;.    swapMi
19e70 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
19e80 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2);.    assert( 
19e90 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
19ea0 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
19eb0 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
19ec0 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
19ed0 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
19ee0 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
19ef0 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
19f00 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70  )==8 );.    swap
19f10 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
19f20 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (x);.    memcpy(
19f30 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20  &pMem->u.r, &x, 
19f40 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
19f50 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71  pMem->flags = sq
19f60 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d  lite3IsNaN(pMem-
19f70 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  >u.r) ? MEM_Null
19f80 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d   : MEM_Real;.  }
19f90 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75  .  return 8;.}.u
19fa0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
19fb0 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
19fc0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19fd0 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
19fe0 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
19ff0 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
1a000 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
1a010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
1a020 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
1a030 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
1a040 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
1a050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
1a060 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
1a070 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
1a080 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
1a090 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
1a0a0 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
1a0b0 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
1a0c0 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
1a0d0 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
1a0e0 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
1a0f0 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
1a100 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f  0: {  /* Null */
1a110 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1a120 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30  CE-OF: R-24078-0
1a130 39 33 37 35 20 56 61 6c 75 65 20 69 73 20 61 20  9375 Value is a 
1a140 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70  NULL. */.      p
1a150 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1a160 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
1a170 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1a180 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  se 1: {.      /*
1a190 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a1a0 34 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75  44885-25196 Valu
1a1b0 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77  e is an 8-bit tw
1a1c0 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20  os-complement.  
1a1d0 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
1a1e0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1a1f0 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  .i = ONE_BYTE_IN
1a200 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
1a210 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1a220 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1a230 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1a240 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1a250 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
1a260 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
1a270 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1a280 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1a290 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39  DENCE-OF: R-4979
1a2a0 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69 73  4-35026 Value is
1a2b0 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36   a big-endian 16
1a2c0 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
1a2d0 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
1a2e0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1a2f0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f  pMem->u.i = TWO_
1a300 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
1a310 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1a320 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1a330 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1a340 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1a350 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
1a360 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
1a370 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
1a380 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1a390 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1a3a0 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56   R-37839-54301 V
1a3b0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1a3c0 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20  dian 24-bit.    
1a3d0 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1a3e0 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1a3f0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1a400 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
1a410 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
1a420 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1a430 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1a440 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1a450 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1a460 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
1a470 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
1a480 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1a490 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1a4a0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34  DENCE-OF: R-0184
1a4b0 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69 73  9-26079 Value is
1a4c0 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32   a big-endian 32
1a4d0 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
1a4e0 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
1a4f0 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1a500 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
1a510 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1a520 23 69 66 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a  #ifdef __HP_cc .
1a530 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72        /* Work ar
1a540 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65 78 74 65  ound a sign-exte
1a550 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20 74 68 65  nsion bug in the
1a560 20 48 50 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72   HP compiler for
1a570 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20   HP/UX */.      
1a580 69 66 28 20 62 75 66 5b 30 5d 26 30 78 38 30 20  if( buf[0]&0x80 
1a590 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30  ) pMem->u.i |= 0
1a5a0 78 66 66 66 66 66 66 66 66 38 30 30 30 30 30 30  xffffffff8000000
1a5b0 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  0LL;.#endif.    
1a5c0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1a5d0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
1a5e0 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1a5f0 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1a600 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20  turn 4;.    }.  
1a610 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
1a620 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1a630 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
1a640 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a650 35 30 33 38 35 2d 30 39 36 37 34 20 56 61 6c 75  50385-09674 Valu
1a660 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1a670 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 48-bit.      *
1a680 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1a690 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1a6a0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1a6b0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
1a6c0 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  uf+2) + (((i64)1
1a6d0 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
1a6e0 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
1a6f0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1a700 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
1a710 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
1a720 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
1a730 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
1a740 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
1a750 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1a760 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
1a770 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
1a780 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
1a790 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65      /* These use
1a7a0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
1a7b0 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20  , so do them in 
1a7c0 61 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  a separate routi
1a7d0 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ne.      ** to a
1a7e0 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d  void having to m
1a7f0 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f  ove the frame po
1a800 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d  inter in the com
1a810 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  mon case */.    
1a820 20 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47    return serialG
1a830 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79  et(buf,serial_ty
1a840 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  pe,pMem);.    }.
1a850 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
1a860 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
1a870 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
1a880 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
1a890 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1a8a0 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32 38 39  OF: R-12976-2289
1a8b0 33 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69  3 Value is the i
1a8c0 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20  nteger 0. */.   
1a8d0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a8e0 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31 32 31  F: R-18143-12121
1a8f0 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e   Value is the in
1a900 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20  teger 1. */.    
1a910 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65    pMem->u.i = se
1a920 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20  rial_type-8;.   
1a930 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1a940 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1a950 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1a960 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
1a970 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1a980 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33 31 35  -OF: R-14606-315
1a990 36 34 20 56 61 6c 75 65 20 69 73 20 61 20 42 4c  64 Value is a BL
1a9a0 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d 31 32  OB that is (N-12
1a9b0 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20 20 20  )/2 bytes in.   
1a9c0 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20     ** length..  
1a9d0 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
1a9e0 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30 31 34  OF: R-28401-0014
1a9f0 30 20 56 61 6c 75 65 20 69 73 20 61 20 73 74 72  0 Value is a str
1aa00 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78 74 20  ing in the text 
1aa10 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20  encoding and.   
1aa20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62     ** (N-13)/2 b
1aa30 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
1aa40 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
1aa50 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b  const u16 aFlag[
1aa60 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d  ] = { MEM_Blob|M
1aa70 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74  EM_Ephem, MEM_St
1aa80 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20  r|MEM_Ephem };. 
1aa90 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
1aaa0 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20  char *)buf;.    
1aab0 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72    pMem->n = (ser
1aac0 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
1aad0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1aae0 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c  s = aFlag[serial
1aaf0 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20  _type&1];.      
1ab00 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a  return pMem->n;.
1ab10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1ab20 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68  rn 0;.}./*.** Th
1ab30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1ab40 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
1ab50 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
1ab60 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52  for an UnpackedR
1ab70 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
1ab80 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  re large enough 
1ab90 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20  to be used with 
1aba0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1abb0 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20  dUnpack() if.** 
1abc0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1abd0 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
1abe0 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  to KeyInfo struc
1abf0 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a  ture pKeyInfo..*
1ac00 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69  *.** The space i
1ac10 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74  s either allocat
1ac20 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
1ac30 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72  DbMallocRaw() or
1ac40 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20   from within.** 
1ac50 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75  the unaligned bu
1ac60 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20  ffer passed via 
1ac70 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74  the second and t
1ac80 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28  hird arguments (
1ac90 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74  presumably.** st
1aca0 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74  ack space). If t
1acb0 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20  he former, then 
1acc0 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
1acd0 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74  o a pointer that
1ace0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76   should.** be ev
1acf0 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62  entually freed b
1ad00 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
1ad10 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
1ad20 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a  (). Or, if the .
1ad30 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f  ** allocation co
1ad40 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70  mes from the pSp
1ad50 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66  ace/szSpace buff
1ad60 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73  er, *ppFree is s
1ad70 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65  et to NULL.** be
1ad80 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1ad90 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
1ada0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
1adb0 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
1adc0 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  */.UnpackedRecor
1add0 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c  d *sqlite3VdbeAl
1ade0 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
1adf0 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  d(.  KeyInfo *pK
1ae00 65 79 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20  eyInfo          
1ae10 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
1ae20 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72  ion of the recor
1ae30 64 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b  d */.){.  Unpack
1ae40 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20  edRecord *p;    
1ae50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70            /* Unp
1ae60 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20  acked record to 
1ae70 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
1ae80 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1aea0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
1aeb0 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a  equired for *p *
1aec0 2f 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  /.  nByte = ROUN
1aed0 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
1aee0 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a  edRecord)) + siz
1aef0 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e  eof(Mem)*(pKeyIn
1af00 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20  fo->nField+1);. 
1af10 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
1af20 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62  cord *)sqlite3Db
1af30 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
1af40 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
1af50 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1af60 6e 20 30 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d  n 0;.  p->aMem =
1af70 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29   (Mem*)&((char*)
1af80 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)[ROUND8(sizeof
1af90 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
1afa0 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  )];.  assert( pK
1afb0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1afc0 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b  er!=0 );.  p->pK
1afd0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
1afe0 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
1aff0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1b000 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d + 1;.  return 
1b010 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
1b020 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20  n the nKey-byte 
1b030 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65  encoding of a re
1b040 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20  cord in pKey[], 
1b050 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a  populate the .**
1b060 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1b070 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61  structure indica
1b080 74 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74  ted by the fourt
1b090 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  h argument with 
1b0a0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1b0b0 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72  of the decoded r
1b0c0 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20  ecord..*/ .void 
1b0d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1b0e0 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
1b0f0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1b100 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1b110 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
1b120 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
1b130 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
1b140 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1b150 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
1b160 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
1b170 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
1b180 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
1b190 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  rd */.  Unpacked
1b1a0 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f  Record *p      /
1b1b0 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20  * Populate this 
1b1c0 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65  structure before
1b1d0 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29   returning. */.)
1b1e0 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
1b1f0 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
1b200 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1b210 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69  char *)pKey;.  i
1b220 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78  nt d; .  u32 idx
1b230 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b240 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1b250 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20  et in aKey[] to 
1b260 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1b270 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  16 u;           
1b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b290 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
1b2a0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
1b2b0 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
1b2c0 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a  Mem = p->aMem;..
1b2d0 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20    p->default_rc 
1b2e0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45  = 0;.  assert( E
1b2f0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
1b300 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
1b310 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1b320 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1b330 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
1b340 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
1b350 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b  x<szHdr && d<=nK
1b360 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ey ){.    u32 se
1b370 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
1b380 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
1b390 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73  32(&aKey[idx], s
1b3a0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1b3b0 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
1b3c0 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
1b3d0 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
1b3e0 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20  nfo->db;.    /* 
1b3f0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  pMem->flags = 0;
1b400 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53   // sqlite3VdbeS
1b410 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20  erialGet() will 
1b420 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20  set this for us 
1b430 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d  */.    pMem->szM
1b440 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70  alloc = 0;.    p
1b450 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20  Mem->z = 0;.    
1b460 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d += sqlite3Vdbe
1b470 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b  SerialGet(&aKey[
1b480 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  d], serial_type,
1b490 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d   pMem);.    pMem
1b4a0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75  ++;.    if( (++u
1b4b0 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62  )>=p->nField ) b
1b4c0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  reak;.  }.  asse
1b4d0 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d  rt( u<=pKeyInfo-
1b4e0 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  >nField + 1 );. 
1b4f0 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
1b500 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1b510 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69  _DEBUG./*.** Thi
1b520 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
1b530 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72  res two index or
1b540 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65   table record ke
1b550 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ys in the same w
1b560 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c  ay.** as the sql
1b570 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1b580 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e  mpare() routine.
1b590 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f   Unlike VdbeReco
1b5a0 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20  rdCompare(),.** 
1b5b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  this function de
1b5c0 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63  serializes and c
1b5d0 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20 75  ompares values u
1b5e0 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69  sing the.** sqli
1b5f0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1b600 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65  () and sqlite3Me
1b610 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74  mCompare() funct
1b620 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64  ions. It is used
1b630 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
1b640 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
1b650 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6f 70  sure that the op
1b660 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a  timized code in.
1b670 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  ** sqlite3VdbeRe
1b680 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65  cordCompare() re
1b690 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69  turns results wi
1b6a0 74 68 20 74 68 65 73 65 20 74 77 6f 20 70 72 69  th these two pri
1b6b0 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52  mitives..**.** R
1b6c0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1b6d0 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  e result of comp
1b6e0 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61  arison is equiva
1b6f0 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52  lent to desiredR
1b700 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e  esult..** Return
1b710 20 66 61 6c 73 65 20 69 66 20 74 68 65 72 65 20   false if there 
1b720 69 73 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e  is a disagreemen
1b730 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1b740 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1b750 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e  reDebug(.  int n
1b760 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1b770 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1b780 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
1b790 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1b7a0 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74  pPKey2, /* Right
1b7b0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65   key */.  int de
1b7c0 73 69 72 65 64 52 65 73 75 6c 74 20 20 20 20 20  siredResult     
1b7d0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65          /* Corre
1b7e0 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a  ct answer */.){.
1b7f0 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20    u32 d1;       
1b800 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1b810 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1b820 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
1b830 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
1b840 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1b850 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1b860 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65   next header ele
1b870 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ment */.  u32 sz
1b880 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  Hdr1;        /* 
1b890 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1b8a0 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
1b8b0 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
1b8c0 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
1b8d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1b8e0 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
1b8f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
1b900 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ey1;.  KeyInfo *
1b910 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20  pKeyInfo;.  Mem 
1b920 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66  mem1;..  pKeyInf
1b930 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
1b940 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79  Info;.  if( pKey
1b950 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65  Info->db==0 ) re
1b960 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65  turn 1;.  mem1.e
1b970 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
1b980 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20  nc;.  mem1.db = 
1b990 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1b9a0 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20  /* mem1.flags = 
1b9b0 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69  0;  // Will be i
1b9c0 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71  nitialized by sq
1b9d0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1b9e0 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e  et() */.  VVA_ON
1b9f0 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  LY( mem1.szMallo
1ba00 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
1ba10 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
1ba20 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1ba30 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72  /..  /* Compiler
1ba40 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74  s may complain t
1ba50 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20  hat mem1.u.i is 
1ba60 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e  potentially unin
1ba70 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
1ba80 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c  We could initial
1ba90 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e  ize it, as shown
1baa0 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63   here, to silenc
1bab0 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e  e those complain
1bac0 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20  ts..  ** But in 
1bad0 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77  fact, mem1.u.i w
1bae0 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c  ill never actual
1baf0 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69  ly be used unini
1bb00 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f  tialized, and do
1bb10 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e  ing .  ** the un
1bb20 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61  necessary initia
1bb30 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d  lization has a m
1bb40 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69  easurable negati
1bb50 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20  ve performance. 
1bb60 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63   ** impact, sinc
1bb70 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
1bb80 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75  s a very high ru
1bb90 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77  nner.  And so, w
1bba0 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f  e choose.  ** to
1bbb0 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70   ignore the comp
1bbc0 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e  iler warnings an
1bbd0 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72  d leave this var
1bbe0 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69  iable uninitiali
1bbf0 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20  zed..  */.  /*  
1bc00 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f  mem1.u.i = 0;  /
1bc10 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65  / not needed, he
1bc20 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f  re to silence co
1bc30 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a  mpiler warning *
1bc40 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65  /.  .  idx1 = ge
1bc50 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
1bc60 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28 20   szHdr1);.  if( 
1bc70 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20 72  szHdr1>98307 ) r
1bc80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1bc90 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48  RUPT;.  d1 = szH
1bca0 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dr1;.  assert( p
1bcb0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1bcc0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1bcd0 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
1bce0 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  d || CORRUPT_DB 
1bcf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
1bd00 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1bd10 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1bd20 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ( pKeyInfo->nFie
1bd30 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
1bd40 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c  ( idx1<=szHdr1 |
1bd50 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1bd60 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65    do{.    u32 se
1bd70 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20  rial_type1;..   
1bd80 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72   /* Read the ser
1bd90 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68  ial types for th
1bda0 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69  e next element i
1bdb0 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20  n each key. */. 
1bdc0 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61     idx1 += getVa
1bdd0 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64  rint32( aKey1+id
1bde0 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  x1, serial_type1
1bdf0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69   );..    /* Veri
1be00 66 79 20 74 68 61 74 20 74 68 65 72 65 20 69 73  fy that there is
1be10 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63   enough key spac
1be20 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61  e remaining to a
1be30 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75  void.    ** a bu
1be40 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20  ffer overread.  
1be50 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74  The "d1+serial_t
1be60 79 70 65 31 2b 32 22 20 73 75 62 65 78 70 72 65  ype1+2" subexpre
1be70 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a  ssion will.    *
1be80 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72 65 61  * always be grea
1be90 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
1bea0 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20  l to the amount 
1beb0 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65 79 20  of required key 
1bec0 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73  space..    ** Us
1bed0 65 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61  e that approxima
1bee0 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68  tion to avoid th
1bef0 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65  e more expensive
1bf00 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
1bf10 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1bf20 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68  lTypeLen() in th
1bf30 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20  e common case.. 
1bf40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31     */.    if( d1
1bf50 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e  +serial_type1+2>
1bf60 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20  (u32)nKey1.     
1bf70 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62  && d1+sqlite3Vdb
1bf80 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
1bf90 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33  erial_type1)>(u3
1bfa0 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a  2)nKey1 .    ){.
1bfb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bfc0 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61   }..    /* Extra
1bfd0 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f  ct the values to
1bfe0 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20   be compared..  
1bff0 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73    */.    d1 += s
1c000 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1c010 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
1c020 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d  serial_type1, &m
1c030 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  em1);..    /* Do
1c040 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
1c050 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1c060 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
1c070 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32  e(&mem1, &pPKey2
1c080 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49  ->aMem[i], pKeyI
1c090 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a  nfo->aColl[i]);.
1c0a0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
1c0b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
1c0c0 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
1c0d0 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65  );  /* See comme
1c0e0 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  nt below */.    
1c0f0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
1c100 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
1c110 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72  .        rc = -r
1c120 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68  c;  /* Invert th
1c130 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53  e result for DES
1c140 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f  C sort order. */
1c150 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
1c160 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65  oto debugCompare
1c170 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  End;.    }.    i
1c180 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64  ++;.  }while( id
1c190 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70  x1<szHdr1 && i<p
1c1a0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b  PKey2->nField );
1c1b0 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
1c1c0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
1c1d0 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
1c1e0 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
1c1f0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
1c200 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
1c210 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
1c220 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
1c230 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
1c240 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
1c250 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
1c260 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1c270 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20  e(&mem1)..  */. 
1c280 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
1c290 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20  Malloc==0 );..  
1c2a0 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65  /* rc==0 here me
1c2b0 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  ans that one of 
1c2c0 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74  the keys ran out
1c2d0 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20   of fields and. 
1c2e0 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c   ** all the fiel
1c2f0 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f  ds up to that po
1c300 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20  int were equal. 
1c310 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75  Return the defau
1c320 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65  lt_rc.  ** value
1c330 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b  .  */.  rc = pPK
1c340 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
1c350 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e  ..debugCompareEn
1c360 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72 65 64  d:.  if( desired
1c370 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d  Result==0 && rc=
1c380 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
1c390 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75   if( desiredResu
1c3a0 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72  lt<0 && rc<0 ) r
1c3b0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64  eturn 1;.  if( d
1c3c0 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26  esiredResult>0 &
1c3d0 26 20 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20  & rc>0 ) return 
1c3e0 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54  1;.  if( CORRUPT
1c3f0 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  _DB ) return 1;.
1c400 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
1c410 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c420 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
1c430 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1c440 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1c450 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75  _DEBUG./*.** Cou
1c460 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
1c470 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20   fields (a.k.a. 
1c480 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20  columns) in the 
1c490 72 65 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a  record given by.
1c4a0 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54  ** pKey,nKey.  T
1c4b0 68 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74  he verify that t
1c4c0 68 69 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73  his count is les
1c4d0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
1c4e0 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20  to the.** limit 
1c4f0 67 69 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66  given by pKeyInf
1c500 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 4b 65 79  o->nField + pKey
1c510 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a  Info->nXField..*
1c520 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e  *.** If this con
1c530 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73  straint is not s
1c540 61 74 69 73 66 69 65 64 2c 20 69 74 20 6d 65 61  atisfied, it mea
1c550 6e 73 20 74 68 61 74 20 74 68 65 20 68 69 67 68  ns that the high
1c560 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62 65 52 65  -speed.** vdbeRe
1c570 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
1c580 20 61 6e 64 20 76 64 62 65 52 65 63 6f 72 64 43   and vdbeRecordC
1c590 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 72  ompareString() r
1c5a0 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20  outines will.** 
1c5b0 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
1c5c0 6c 79 2e 20 20 49 66 20 74 68 69 73 20 61 73 73  ly.  If this ass
1c5d0 65 72 74 28 29 20 65 76 65 72 20 66 69 72 65 73  ert() ever fires
1c5e0 2c 20 69 74 20 70 72 6f 62 61 62 6c 79 20 6d 65  , it probably me
1c5f0 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ans.** that the 
1c600 4b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f  KeyInfo.nField o
1c610 72 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c  r KeyInfo.nXFiel
1c620 64 20 76 61 6c 75 65 73 20 77 65 72 65 20 63 6f  d values were co
1c630 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72  mputed.** incorr
1c640 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ectly..*/.static
1c650 20 76 6f 69 64 20 76 64 62 65 41 73 73 65 72 74   void vdbeAssert
1c660 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
1c670 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b  Limits(.  int nK
1c680 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ey, const void *
1c690 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 72  pKey,   /* The r
1c6a0 65 63 6f 72 64 20 74 6f 20 76 65 72 69 66 79 20  ecord to verify 
1c6b0 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49  */ .  const KeyI
1c6c0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20  nfo *pKeyInfo   
1c6d0 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73      /* Compare s
1c6e0 69 7a 65 20 77 69 74 68 20 74 68 69 73 20 4b 65  ize with this Ke
1c6f0 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e  yInfo */.){.  in
1c700 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20  t nField = 0;.  
1c710 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 75 33 32  u32 szHdr;.  u32
1c720 20 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55   idx;.  u32 notU
1c730 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  sed;.  const uns
1c740 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1c750 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1c760 65 64 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a  ed char*)pKey;..
1c770 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42    if( CORRUPT_DB
1c780 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 64 78   ) return;.  idx
1c790 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1c7a0 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61  Key, szHdr);.  a
1c7b0 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29  ssert( nKey>=0 )
1c7c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 48 64  ;.  assert( szHd
1c7d0 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a  r<=(u32)nKey );.
1c7e0 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48    while( idx<szH
1c7f0 64 72 20 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d  dr ){.    idx +=
1c800 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
1c810 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b  y+idx, notUsed);
1c820 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20  .    nField++;. 
1c830 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69   }.  assert( nFi
1c840 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d  eld <= pKeyInfo-
1c850 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f  >nField+pKeyInfo
1c860 2d 3e 6e 58 46 69 65 6c 64 20 29 3b 0a 7d 0a 23  ->nXField );.}.#
1c870 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64  else.# define vd
1c880 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
1c890 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41  ntWithinLimits(A
1c8a0 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,B,C).#endif../*
1c8b0 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20  .** Both *pMem1 
1c8c0 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61  and *pMem2 conta
1c8d0 69 6e 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73  in string values
1c8e0 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77  . Compare the tw
1c8f0 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e  o values.** usin
1c900 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  g the collation 
1c910 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
1c920 41 73 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e  As usual, return
1c930 20 61 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65   a negative , ze
1c940 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
1c950 65 20 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d  e value if *pMem
1c960 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
1c970 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61  equal to or grea
1c980 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d  ter than .** *pM
1c990 65 6d 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c  em2, respectivel
1c9a0 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70  y. Similar in sp
1c9b0 69 72 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a  irit to "rc = (*
1c9c0 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32  pMem1) - (*pMem2
1c9d0 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  );"..*/.static i
1c9e0 6e 74 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65  nt vdbeCompareMe
1c9f0 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74  mString(.  const
1ca00 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63   Mem *pMem1,.  c
1ca10 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c  onst Mem *pMem2,
1ca20 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71  .  const CollSeq
1ca30 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70   *pColl,.  u8 *p
1ca40 72 63 45 72 72 20 20 20 20 20 20 20 20 20 20 20  rcErr           
1ca50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1ca60 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20   an OOM occurs, 
1ca70 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f  set to SQLITE_NO
1ca80 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  MEM */.){.  if( 
1ca90 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c  pMem1->enc==pCol
1caa0 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a  l->enc ){.    /*
1cab0 20 54 68 65 20 73 74 72 69 6e 67 73 20 61 72 65   The strings are
1cac0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
1cad0 63 6f 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67  correct encoding
1cae0 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20  .  Call the.    
1caf0 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   ** comparison f
1cb00 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79  unction directly
1cb10 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70   */.    return p
1cb20 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
1cb30 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e  ->pUser,pMem1->n
1cb40 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d  ,pMem1->z,pMem2-
1cb50 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20  >n,pMem2->z);.  
1cb60 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
1cb70 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69  c;.    const voi
1cb80 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20  d *v1, *v2;.    
1cb90 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20  int n1, n2;.    
1cba0 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20  Mem c1;.    Mem 
1cbb0 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  c2;.    sqlite3V
1cbc0 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20  dbeMemInit(&c1, 
1cbd0 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e  pMem1->db, MEM_N
1cbe0 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ull);.    sqlite
1cbf0 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32  3VdbeMemInit(&c2
1cc00 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d  , pMem1->db, MEM
1cc10 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  _Null);.    sqli
1cc20 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
1cc30 77 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31  wCopy(&c1, pMem1
1cc40 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
1cc50 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1cc60 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c  ShallowCopy(&c2,
1cc70 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65   pMem2, MEM_Ephe
1cc80 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c  m);.    v1 = sql
1cc90 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73  ite3ValueText((s
1cca0 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63  qlite3_value*)&c
1ccb0 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  1, pColl->enc);.
1ccc0 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f      n1 = v1==0 ?
1ccd0 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76   0 : c1.n;.    v
1cce0 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  2 = sqlite3Value
1ccf0 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61  Text((sqlite3_va
1cd00 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d  lue*)&c2, pColl-
1cd10 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20  >enc);.    n2 = 
1cd20 76 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e  v2==0 ? 0 : c2.n
1cd30 3b 0a 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c  ;.    rc = pColl
1cd40 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
1cd50 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c  ser, n1, v1, n2,
1cd60 20 76 32 29 3b 0a 20 20 20 20 69 66 28 20 28 76   v2);.    if( (v
1cd70 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 26  1==0 || v2==0) &
1cd80 26 20 70 72 63 45 72 72 20 29 20 2a 70 72 63 45  & prcErr ) *prcE
1cd90 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rr = SQLITE_NOME
1cda0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69  M_BKPT;.    sqli
1cdb0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1cdc0 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71 6c 69  e(&c1);.    sqli
1cdd0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1cde0 65 28 26 63 32 29 3b 0a 20 20 20 20 72 65 74 75  e(&c2);.    retu
1cdf0 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rn rc;.  }.}../*
1ce00 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 70 42  .** The input pB
1ce10 6c 6f 62 20 69 73 20 67 75 61 72 61 6e 74 65 65  lob is guarantee
1ce20 64 20 74 6f 20 62 65 20 61 20 42 6c 6f 62 20 74  d to be a Blob t
1ce30 68 61 74 20 69 73 20 6e 6f 74 20 6d 61 72 6b 65  hat is not marke
1ce40 64 0a 2a 2a 20 77 69 74 68 20 4d 45 4d 5f 5a 65  d.** with MEM_Ze
1ce50 72 6f 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  ro.  Return true
1ce60 20 69 66 20 69 74 20 63 6f 75 6c 64 20 62 65 20   if it could be 
1ce70 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a  a zero-blob..*/.
1ce80 73 74 61 74 69 63 20 69 6e 74 20 69 73 41 6c 6c  static int isAll
1ce90 5a 65 72 6f 28 63 6f 6e 73 74 20 63 68 61 72 20  Zero(const char 
1cea0 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *z, int n){.  in
1ceb0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1cec0 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
1ced0 66 28 20 7a 5b 69 5d 20 29 20 72 65 74 75 72 6e  f( z[i] ) return
1cee0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1cef0 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   1;.}../*.** Com
1cf00 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20  pare two blobs. 
1cf10 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
1cf20 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
1cf30 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74  ive if the first
1cf40 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e  .** is less than
1cf50 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
1cf60 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
1cf70 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 69  second, respecti
1cf80 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20  vely..** If one 
1cf90 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66 69 78  blob is a prefix
1cfa0 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 74   of the other, t
1cfb0 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65 72 20  hen the shorter 
1cfc0 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a  is the lessor..*
1cfd0 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
1cfe0 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c  NOINLINE int sql
1cff0 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28  ite3BlobCompare(
1d000 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20  const Mem *pB1, 
1d010 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b  const Mem *pB2){
1d020 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20  .  int c;.  int 
1d030 6e 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20 69  n1 = pB1->n;.  i
1d040 6e 74 20 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a  nt n2 = pB2->n;.
1d050 0a 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73  .  /* It is poss
1d060 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 42  ible to have a B
1d070 6c 6f 62 20 76 61 6c 75 65 20 74 68 61 74 20 68  lob value that h
1d080 61 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f  as some non-zero
1d090 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 66 6f   content.  ** fo
1d0a0 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 63  llowed by zero c
1d0b0 6f 6e 74 65 6e 74 2e 20 20 42 75 74 20 74 68 61  ontent.  But tha
1d0c0 74 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 75 70 20  t only comes up 
1d0d0 66 6f 72 20 42 6c 6f 62 73 20 66 6f 72 6d 65 64  for Blobs formed
1d0e0 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 4f 50 5f  .  ** by the OP_
1d0f0 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
1d100 65 2c 20 61 6e 64 20 73 75 63 68 20 42 6c 6f 62  e, and such Blob
1d110 73 20 6e 65 76 65 72 20 67 65 74 20 70 61 73 73  s never get pass
1d120 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c  ed into.  ** sql
1d130 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29  ite3MemCompare()
1d140 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  . */.  assert( (
1d150 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  pB1->flags & MEM
1d160 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d  _Zero)==0 || n1=
1d170 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1d180 28 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45  (pB2->flags & ME
1d190 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32  M_Zero)==0 || n2
1d1a0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70  ==0 );..  if( (p
1d1b0 42 31 2d 3e 66 6c 61 67 73 7c 70 42 32 2d 3e 66  B1->flags|pB2->f
1d1c0 6c 61 67 73 29 20 26 20 4d 45 4d 5f 5a 65 72 6f  lags) & MEM_Zero
1d1d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 31 2d   ){.    if( pB1-
1d1e0 3e 66 6c 61 67 73 20 26 20 70 42 32 2d 3e 66 6c  >flags & pB2->fl
1d1f0 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
1d200 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1d210 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70 42  B1->u.nZero - pB
1d220 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  2->u.nZero;.    
1d230 7d 65 6c 73 65 20 69 66 28 20 70 42 31 2d 3e 66  }else if( pB1->f
1d240 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
1d250 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  ){.      if( !is
1d260 41 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c 20  AllZero(pB2->z, 
1d270 70 42 32 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e  pB2->n) ) return
1d280 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
1d290 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d  n pB1->u.nZero -
1d2a0 20 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n2;.    }else{.
1d2b0 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c        if( !isAll
1d2c0 5a 65 72 6f 28 70 42 31 2d 3e 7a 2c 20 70 42 31  Zero(pB1->z, pB1
1d2d0 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2b 31  ->n) ) return +1
1d2e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e  ;.      return n
1d2f0 31 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f  1 - pB2->u.nZero
1d300 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 20  ;.    }.  }.  c 
1d310 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c  = memcmp(pB1->z,
1d320 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f   pB2->z, n1>n2 ?
1d330 20 6e 32 20 3a 20 6e 31 29 3b 0a 20 20 69 66 28   n2 : n1);.  if(
1d340 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20   c ) return c;. 
1d350 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 6e 32 3b   return n1 - n2;
1d360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63  .}../*.** Do a c
1d370 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65  omparison betwee
1d380 6e 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65  n a 64-bit signe
1d390 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61 20  d integer and a 
1d3a0 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d  64-bit floating-
1d3b0 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e  point.** number.
1d3c0 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76    Return negativ
1d3d0 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
1d3e0 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73  tive if the firs
1d3f0 74 20 28 69 36 34 29 20 69 73 20 6c 65 73 73 20  t (i64) is less 
1d400 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74  than,.** equal t
1d410 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
1d420 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28 64  an the second (d
1d430 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  ouble)..*/.stati
1d440 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 74  c int sqlite3Int
1d450 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36 34  FloatCompare(i64
1d460 20 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20   i, double r){. 
1d470 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47   if( sizeof(LONG
1d480 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20 29  DOUBLE_TYPE)>8 )
1d490 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45  {.    LONGDOUBLE
1d4a0 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44  _TYPE x = (LONGD
1d4b0 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20  OUBLE_TYPE)i;.  
1d4c0 20 20 69 66 28 20 78 3c 72 20 29 20 72 65 74 75    if( x<r ) retu
1d4d0 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78  rn -1;.    if( x
1d4e0 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  >r ) return +1;.
1d4f0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1d500 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 79  }else{.    i64 y
1d510 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a  ;.    double s;.
1d520 20 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33 33      if( r<-92233
1d530 37 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 30  72036854775808.0
1d540 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1d550 20 20 69 66 28 20 72 3e 39 32 32 33 33 37 32 30    if( r>92233720
1d560 33 36 38 35 34 37 37 35 38 30 37 2e 30 20 29 20  36854775807.0 ) 
1d570 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79  return -1;.    y
1d580 20 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20 69   = (i64)r;.    i
1d590 66 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e 20  f( i<y ) return 
1d5a0 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79 20  -1;.    if( i>y 
1d5b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 79 3d 3d  ){.      if( y==
1d5c0 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26  SMALLEST_INT64 &
1d5d0 26 20 72 3e 30 2e 30 20 29 20 72 65 74 75 72 6e  & r>0.0 ) return
1d5e0 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
1d5f0 6e 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n +1;.    }.    
1d600 73 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20  s = (double)i;. 
1d610 20 20 20 69 66 28 20 73 3c 72 20 29 20 72 65 74     if( s<r ) ret
1d620 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  urn -1;.    if( 
1d630 73 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  s>r ) return +1;
1d640 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1d650 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70   }.}../*.** Comp
1d660 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 63  are the values c
1d670 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20  ontained by the 
1d680 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  two memory cells
1d690 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e  , returning.** n
1d6a0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72  egative, zero or
1d6b0 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65   positive if pMe
1d6c0 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  m1 is less than,
1d6d0 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
1d6e0 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d  eater.** than pM
1d6f0 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64  em2. Sorting ord
1d700 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72  er is NULL's fir
1d710 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  st, followed by 
1d720 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72  numbers (integer
1d730 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20  s.** and reals) 
1d740 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c  sorted numerical
1d750 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ly, followed by 
1d760 74 65 78 74 20 6f 72 64 65 72 65 64 20 62 79 20  text ordered by 
1d770 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  the collating.**
1d780 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20   sequence pColl 
1d790 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62  and finally blob
1d7a0 27 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65  's ordered by me
1d7b0 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77  mcmp()..**.** Tw
1d7c0 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
1d7d0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75  e considered equ
1d7e0 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  al by this funct
1d7f0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
1d800 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f  te3MemCompare(co
1d810 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20  nst Mem *pMem1, 
1d820 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32  const Mem *pMem2
1d830 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20  , const CollSeq 
1d840 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66  *pColl){.  int f
1d850 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d  1, f2;.  int com
1d860 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20  bined_flags;..  
1d870 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67  f1 = pMem1->flag
1d880 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d  s;.  f2 = pMem2-
1d890 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e  >flags;.  combin
1d8a0 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32  ed_flags = f1|f2
1d8b0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d  ;.  assert( (com
1d8c0 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45  bined_flags & ME
1d8d0 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a  M_RowSet)==0 );.
1d8e0 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61   .  /* If one va
1d8f0 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20  lue is NULL, it 
1d900 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  is less than the
1d910 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20   other. If both 
1d920 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20  values.  ** are 
1d930 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a  NULL, return 0..
1d940 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
1d950 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  ned_flags&MEM_Nu
1d960 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
1d970 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d   (f2&MEM_Null) -
1d980 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a   (f1&MEM_Null);.
1d990 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61    }..  /* At lea
1d9a0 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77  st one of the tw
1d9b0 6f 20 76 61 6c 75 65 73 20 69 73 20 61 20 6e 75  o values is a nu
1d9c0 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20  mber.  */.  if( 
1d9d0 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28  combined_flags&(
1d9e0 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
1d9f0 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31  ) ){.    if( (f1
1da00 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29   & f2 & MEM_Int)
1da10 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1da20 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d   pMem1->u.i < pM
1da30 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72  em2->u.i ) retur
1da40 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20  n -1;.      if( 
1da50 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65  pMem1->u.i > pMe
1da60 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e  m2->u.i ) return
1da70 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   +1;.      retur
1da80 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
1da90 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45  f( (f1 & f2 & ME
1daa0 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Real)!=0 ){.  
1dab0 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
1dac0 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20  .r < pMem2->u.r 
1dad0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1dae0 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1daf0 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29  r > pMem2->u.r )
1db00 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1db10 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1db20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45  }.    if( (f1&ME
1db30 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
1db40 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52     if( (f2&MEM_R
1db50 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
1db60 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1db70 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1db80 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65  (pMem1->u.i, pMe
1db90 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  m2->u.r);.      
1dba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1dbb0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1dbc0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1dbd0 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  (f1&MEM_Real)!=0
1dbe0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66   ){.      if( (f
1dbf0 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  2&MEM_Int)!=0 ){
1dc00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1dc10 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74  -sqlite3IntFloat
1dc20 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75  Compare(pMem2->u
1dc30 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b  .i, pMem1->u.r);
1dc40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1dc50 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1dc60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1dc70 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20     return +1;.  
1dc80 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  }..  /* If one v
1dc90 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
1dca0 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69   and the other i
1dcb0 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74  s a blob, the st
1dcc0 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20  ring is less..  
1dcd0 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 73  ** If both are s
1dce0 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20  trings, compare 
1dcf0 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74  using the collat
1dd00 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  ing functions.. 
1dd10 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
1dd20 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72  ed_flags&MEM_Str
1dd30 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20   ){.    if( (f1 
1dd40 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b  & MEM_Str)==0 ){
1dd50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1dd60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1dd70 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30  f2 & MEM_Str)==0
1dd80 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1dd90 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
1dda0 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
1ddb0 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c  nc==pMem2->enc |
1ddc0 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c  | pMem1->db->mal
1ddd0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1dde0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e   assert( pMem1->
1ddf0 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc==SQLITE_UTF8
1de00 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
1de10 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
1de20 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70  ITE_UTF16LE || p
1de30 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
1de40 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20  E_UTF16BE );..  
1de50 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
1de60 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74  on sequence must
1de70 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74   be defined at t
1de80 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20  his point, even 
1de90 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73  if.    ** the us
1dea0 65 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63  er deletes the c
1deb0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1dec0 65 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65  e after the vdbe
1ded0 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20   program is.    
1dee0 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69  ** compiled (thi
1def0 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73  s was not always
1df00 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20   the case)..    
1df10 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
1df20 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e  pColl || pColl->
1df30 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28  xCmp );..    if(
1df40 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
1df50 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61  return vdbeCompa
1df60 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d  reMemString(pMem
1df70 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c  1, pMem2, pColl,
1df80 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f   0);.    }.    /
1df90 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  * If a NULL poin
1dfa0 74 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61  ter was passed a
1dfb0 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75  s the collate fu
1dfc0 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72  nction, fall thr
1dfd0 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ough.    ** to t
1dfe0 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64  he blob case and
1dff0 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20   use memcmp().  
1e000 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f  */.  }. .  /* Bo
1e010 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  th values must b
1e020 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72  e blobs.  Compar
1e030 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29  e using memcmp()
1e040 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  .  */.  return s
1e050 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72  qlite3BlobCompar
1e060 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b  e(pMem1, pMem2);
1e070 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .}.../*.** The f
1e080 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
1e090 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
1e0a0 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61  ction is a seria
1e0b0 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63  l-type that.** c
1e0c0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
1e0d0 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76   integer - all v
1e0e0 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20  alues between 1 
1e0f0 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20  and 9 inclusive 
1e100 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68  .** except 7. Th
1e110 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20  e second points 
1e120 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
1e130 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65  aining an intege
1e140 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61  r value.** seria
1e150 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20  lized according 
1e160 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20  to serial_type. 
1e170 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
1e180 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e  serializes.** an
1e190 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61  d returns the va
1e1a0 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
1e1b0 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63  64 vdbeRecordDec
1e1c0 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61  odeInt(u32 seria
1e1d0 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38  l_type, const u8
1e1e0 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79   *aKey){.  u32 y
1e1f0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
1e200 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61  UPT_DB || (seria
1e210 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72  l_type>=1 && ser
1e220 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73  ial_type<=9 && s
1e230 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29  erial_type!=7) )
1e240 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  ;.  switch( seri
1e250 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
1e260 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20  ase 0:.    case 
1e270 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  1:.      testcas
1e280 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1e290 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e2a0 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  ONE_BYTE_INT(aKe
1e2b0 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a  y);.    case 2:.
1e2c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e2d0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1e2e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f        return TWO
1e2f0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1e300 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20  .    case 3:.   
1e310 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1e320 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1e330 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f     return THREE_
1e340 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1e350 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20      case 4: {.  
1e360 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1e370 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1e380 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54      y = FOUR_BYT
1e390 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1e3a0 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29      return (i64)
1e3b0 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d  *(int*)&y;.    }
1e3c0 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20  .    case 5: {. 
1e3d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1e3e0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1e3f0 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52       return FOUR
1e400 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1e410 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
1e420 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
1e430 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20  (aKey);.    }.  
1e440 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20    case 6: {.    
1e450 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
1e460 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1e470 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e480 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1e490 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
1e4a0 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ) | FOUR_BYTE_UI
1e4b0 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20  NT(aKey+4);.    
1e4c0 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28    return (i64)*(
1e4d0 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20  i64*)&x;.    }. 
1e4e0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65   }..  return (se
1e4f0 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a  rial_type - 8);.
1e500 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1e510 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
1e520 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f  the two table ro
1e530 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f  ws or index reco
1e540 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  rds.** specified
1e550 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   by {nKey1, pKey
1e560 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20  1} and pPKey2.  
1e570 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67  It returns a neg
1e580 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  ative, zero.** o
1e590 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  r positive integ
1e5a0 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65  er if key1 is le
1e5b0 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1e5c0 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72  o or .** greater
1e5d0 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65   than key2.  The
1e5e0 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
1e5f0 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c  key must be a bl
1e600 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79  ob.** created by
1e610 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
1e620 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65  rd opcode of the
1e630 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65   VDBE.  The pPKe
1e640 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62  y2.** key must b
1e650 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73  e a parsed key s
1e660 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20  uch as obtained 
1e670 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56  from.** sqlite3V
1e680 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a  dbeParseRecord..
1e690 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
1e6a0 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  t bSkip is non-z
1e6b0 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
1e6c0 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
1e6d0 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  er has already.*
1e6e0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  * determined tha
1e6f0 74 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  t the first fiel
1e700 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61  ds of the keys a
1e710 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20  re equal..**.** 
1e720 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
1e730 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
1e740 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
1e750 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20  mber of fields. 
1e760 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64  If all .** field
1e770 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
1e780 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65   both keys are e
1e790 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79  qual, then pPKey
1e7a0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73  2->default_rc is
1e7b0 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a   .** returned..*
1e7c0 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65  *.** If database
1e7d0 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
1e7e0 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70  iscovered, set p
1e7f0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74  PKey2->errCode t
1e800 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  o .** SQLITE_COR
1e810 52 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20  RUPT and return 
1e820 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  0. If an OOM err
1e830 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1e840 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65  d, .** pPKey2->e
1e850 72 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f  rrCode is set to
1e860 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e   SQLITE_NOMEM an
1e870 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  d, if it is not 
1e880 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c  NULL, the.** mal
1e890 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20  loc-failed flag 
1e8a0 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20  set on database 
1e8b0 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e  handle (pPKey2->
1e8c0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a  pKeyInfo->db)..*
1e8d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
1e8e0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
1e8f0 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b  thSkip(.  int nK
1e900 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1e910 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66  *pKey1,   /* Lef
1e920 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
1e930 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1e940 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69  2,         /* Ri
1e950 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ght key */.  int
1e960 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20   bSkip          
1e970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e980 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68  If true, skip th
1e990 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f  e first field */
1e9a0 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20  .){.  u32 d1;   
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9c0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1e9d0 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
1e9e0 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
1e9f0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea10 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1ea20 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20  f next field to 
1ea30 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32  compare */.  u32
1ea40 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ea60 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68  Size of record h
1ea70 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a  eader in bytes *
1ea80 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaa0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
1eab0 20 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68   first type in h
1eac0 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  eader */.  int r
1ead0 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
1eae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1eaf0 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  turn value */.  
1eb00 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65  Mem *pRhs = pPKe
1eb10 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20  y2->aMem;       
1eb20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66  /* Next field of
1eb30 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61   pPKey2 to compa
1eb40 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  re */.  KeyInfo 
1eb50 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65  *pKeyInfo = pPKe
1eb60 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
1eb70 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1eb80 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
1eb90 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1eba0 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d  r *)pKey1;.  Mem
1ebb0 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20   mem1;..  /* If 
1ebc0 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74  bSkip is true, t
1ebd0 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hen the caller h
1ebe0 61 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72  as already deter
1ebf0 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66  mined that the f
1ec00 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c  irst.  ** two el
1ec10 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65  ements in the ke
1ec20 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69  ys are equal. Fi
1ec30 78 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  x the various st
1ec40 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f  ack variables so
1ec50 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20  .  ** that this 
1ec60 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63  routine begins c
1ec70 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20  omparing at the 
1ec80 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f  second field. */
1ec90 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a  .  if( bSkip ){.
1eca0 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20      u32 s1;.    
1ecb0 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61  idx1 = 1 + getVa
1ecc0 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d  rint32(&aKey1[1]
1ecd0 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72  , s1);.    szHdr
1ece0 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20  1 = aKey1[0];.  
1ecf0 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20    d1 = szHdr1 + 
1ed00 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1ed10 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20  lTypeLen(s1);.  
1ed20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68    i = 1;.    pRh
1ed30 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s++;.  }else{.  
1ed40 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
1ed50 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
1ed60 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a  r1);.    d1 = sz
1ed70 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31  Hdr1;.    if( d1
1ed80 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  >(unsigned)nKey1
1ed90 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79   ){ .      pPKey
1eda0 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1edb0 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1edc0 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
1edd0 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70  rn 0;  /* Corrup
1ede0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  tion */.    }.  
1edf0 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20    i = 0;.  }..  
1ee00 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73  VVA_ONLY( mem1.s
1ee10 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
1ee20 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
1ee30 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1ee40 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ents */.  assert
1ee50 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1ee60 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79  fo->nField+pPKey
1ee70 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46  2->pKeyInfo->nXF
1ee80 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46  ield>=pPKey2->nF
1ee90 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20  ield .       || 
1eea0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1eeb0 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
1eec0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1eed0 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rder!=0 );.  ass
1eee0 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1eef0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20  yInfo->nField>0 
1ef00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
1ef10 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52  1<=szHdr1 || COR
1ef20 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b  RUPT_DB );.  do{
1ef30 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
1ef40 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48  type;..    /* RH
1ef50 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  S is an integer 
1ef60 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d  */.    if( pRhs-
1ef70 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
1ef80 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c   ){.      serial
1ef90 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1efa0 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  x1];.      testc
1efb0 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1efc0 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1efd0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
1efe0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1eff0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1f000 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1f010 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1f020 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1f030 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1f040 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
1f050 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1f060 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
1f070 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  1], serial_type,
1f080 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20   &mem1);.       
1f090 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e   rc = -sqlite3In
1f0a0 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52  tFloatCompare(pR
1f0b0 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e  hs->u.i, mem1.u.
1f0c0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
1f0d0 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73  .        i64 lhs
1f0e0 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63   = vdbeRecordDec
1f0f0 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79  odeInt(serial_ty
1f100 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b  pe, &aKey1[d1]);
1f110 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73  .        i64 rhs
1f120 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20   = pRhs->u.i;.  
1f130 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68        if( lhs<rh
1f140 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1f150 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1f160 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68  }else if( lhs>rh
1f170 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1f180 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1f190 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1f1a0 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72  .    /* RHS is r
1f1b0 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  eal */.    else 
1f1c0 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1f1d0 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
1f1e0 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
1f1f0 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
1f200 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1f210 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20  type>=10 ){.    
1f220 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
1f230 70 65 73 20 31 32 20 6f 72 20 67 72 65 61 74 65  pes 12 or greate
1f240 72 20 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e  r are strings an
1f250 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72  d blobs (greater
1f260 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a   than.        **
1f270 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73   numbers). Types
1f280 20 31 30 20 61 6e 64 20 31 31 20 61 72 65 20 63   10 and 11 are c
1f290 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76  urrently "reserv
1f2a0 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20  ed for future . 
1f2b0 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20         ** use", 
1f2c0 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65  so it doesn't re
1f2d0 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74  ally matter what
1f2e0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
1f2f0 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20  comparing.      
1f300 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d    ** them to num
1f310 62 65 72 69 63 20 76 61 6c 75 65 73 20 61 72 65  beric values are
1f320 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  .  */.        rc
1f330 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1f340 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1f350 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
1f360 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1f370 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1f380 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1f390 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
1f3a0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65  serial_type, &me
1f3b0 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m1);.        if(
1f3c0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
1f3d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1f3e0 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e   mem1.u.r<pRhs->
1f3f0 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  u.r ){.         
1f400 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1f410 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1f420 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75  mem1.u.r>pRhs->u
1f430 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .r ){.          
1f440 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1f450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1f460 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f470 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46  rc = sqlite3IntF
1f480 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31  loatCompare(mem1
1f490 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29  .u.i, pRhs->u.r)
1f4a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f4b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1f4c0 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e  * RHS is a strin
1f4d0 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  g */.    else if
1f4e0 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1f4f0 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  MEM_Str ){.     
1f500 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
1f510 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61  ey1[idx1], seria
1f520 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74  l_type);.      t
1f530 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
1f540 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
1f550 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1f560 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20  e<12 ){.        
1f570 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1f580 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61  else if( !(seria
1f590 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
1f5a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
1f5b0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1f5c0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d          mem1.n =
1f5d0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
1f5e0 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20  12) / 2;.       
1f5f0 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d   testcase( (d1+m
1f600 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65  em1.n)==(unsigne
1f610 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1f620 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1f630 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73  +mem1.n+1)==(uns
1f640 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1f650 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d         if( (d1+m
1f660 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e  em1.n) > (unsign
1f670 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  ed)nKey1 ){.    
1f680 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
1f690 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
1f6a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1f6b0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1f6c0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1f6d0 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
1f6e0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  n */.        }el
1f6f0 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  se if( pKeyInfo-
1f700 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20  >aColl[i] ){.   
1f710 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20         mem1.enc 
1f720 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1f730 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
1f740 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
1f750 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  b;.          mem
1f760 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  1.flags = MEM_St
1f770 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  r;.          mem
1f780 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b  1.z = (char*)&aK
1f790 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20  ey1[d1];.       
1f7a0 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70     rc = vdbeComp
1f7b0 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20  areMemString(.  
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d              &mem
1f7d0 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66  1, pRhs, pKeyInf
1f7e0 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50  o->aColl[i], &pP
1f7f0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20  Key2->errCode.  
1f800 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1f810 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f820 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d      int nCmp = M
1f830 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d  IN(mem1.n, pRhs-
1f840 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  >n);.          r
1f850 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  c = memcmp(&aKey
1f860 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20  1[d1], pRhs->z, 
1f870 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nCmp);.         
1f880 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
1f890 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d  = mem1.n - pRhs-
1f8a0 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  >n; .        }. 
1f8b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f8c0 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c    /* RHS is a bl
1f8d0 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ob */.    else i
1f8e0 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1f8f0 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20   MEM_Blob ){.   
1f900 20 20 20 61 73 73 65 72 74 28 20 28 70 52 68 73     assert( (pRhs
1f910 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1f920 72 6f 29 3d 3d 30 20 7c 7c 20 70 52 68 73 2d 3e  ro)==0 || pRhs->
1f930 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 67 65  n==0 );.      ge
1f940 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1f950 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
1f960 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
1f970 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1f980 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1f990 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1f9a0 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70  2 || (serial_typ
1f9b0 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
1f9c0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1f9d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f9e0 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73     int nStr = (s
1f9f0 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
1fa00 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
1fa10 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
1fa20 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1fa30 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
1fa40 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
1fa50 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  +1)==(unsigned)n
1fa60 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1fa70 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20  if( (d1+nStr) > 
1fa80 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1fa90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  ){.          pPK
1faa0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
1fab0 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1fac0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
1fad0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1fae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1faf0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1fb00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52      }else if( pR
1fb10 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1fb20 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Zero ){.        
1fb30 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f    if( !isAllZero
1fb40 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 61  ((const char*)&a
1fb50 4b 65 79 31 5b 64 31 5d 2c 6e 53 74 72 29 20 29  Key1[d1],nStr) )
1fb60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1fb70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1fb80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1fb90 20 20 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70     rc = nStr - p
1fba0 52 68 73 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Rhs->u.nZero;.  
1fbb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fbc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1fbd0 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49     int nCmp = MI
1fbe0 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29  N(nStr, pRhs->n)
1fbf0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1fc00 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
1fc10 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
1fc20 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
1fc30 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e  ( rc==0 ) rc = n
1fc40 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20  Str - pRhs->n;. 
1fc50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1fc60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1fc70 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20  HS is null */.  
1fc80 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65    else{.      se
1fc90 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
1fca0 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72  1[idx1];.      r
1fcb0 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  c = (serial_type
1fcc0 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  !=0);.    }..   
1fcd0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1fce0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
1fcf0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1fd00 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1fd10 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -rc;.      }.   
1fd20 20 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52     assert( vdbeR
1fd30 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1fd40 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
1fd50 70 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20  pPKey2, rc) );. 
1fd60 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
1fd70 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1fd80 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74    /* See comment
1fd90 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
1fda0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1fdb0 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70  ..    i++;.    p
1fdc0 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d  Rhs++;.    d1 +=
1fdd0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1fde0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
1fdf0 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31  _type);.    idx1
1fe00 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e   += sqlite3Varin
1fe10 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  tLen(serial_type
1fe20 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78  );.  }while( idx
1fe30 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64  1<(unsigned)szHd
1fe40 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
1fe50 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75  nField && d1<=(u
1fe60 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1fe70 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
1fe80 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
1fe90 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
1fea0 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
1feb0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
1fec0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
1fed0 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
1fee0 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
1fef0 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
1ff00 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
1ff10 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
1ff20 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1ff30 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20  e(&mem1).  */.  
1ff40 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1ff50 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
1ff60 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
1ff70 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62  ns that one or b
1ff80 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20  oth of the keys 
1ff90 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
1ffa0 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
1ffb0 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
1ffc0 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
1ffd0 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68  equal. Return th
1ffe0 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a  e default_rc.  *
1fff0 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61  * value.  */.  a
20000 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
20010 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62  B .       || vdb
20020 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
20030 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
20040 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32  , pPKey2, pPKey2
20050 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20  ->default_rc) . 
20060 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66        || pKeyInf
20070 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
20080 6c 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79  led.  );.  pPKey
20090 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20  2->eqSeen = 1;. 
200a0 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e   return pPKey2->
200b0 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e  default_rc;.}.in
200c0 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
200d0 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e  ordCompare(.  in
200e0 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
200f0 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a  oid *pKey1,   /*
20100 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
20110 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
20120 50 4b 65 79 32 20 20 20 20 20 20 20 20 20 20 2f  PKey2          /
20130 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
20140 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
20150 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
20160 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
20170 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
20180 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
20190 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
201a0 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65   an optimized ve
201b0 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
201c0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
201d0 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29  e() .** that (a)
201e0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
201f0 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e   of pPKey2 is an
20200 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62   integer, and (b
20210 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f  ) the .** size-o
20220 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
20230 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
20240 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69  (pKey1/nKey1) fi
20250 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a  ts in a single.*
20260 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  * byte (i.e. is 
20270 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a  less than 128)..
20280 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63  **.** To avoid c
20290 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75  oncerns about bu
202a0 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20  ffer overreads, 
202b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
202c0 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20  only used.** on 
202d0 73 63 68 65 6d 61 73 20 77 68 65 72 65 20 74 68  schemas where th
202e0 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20  e maximum valid 
202f0 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 36  header size is 6
20300 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e  3 bytes or less.
20310 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
20320 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20330 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  Int(.  int nKey1
20340 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
20350 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
20360 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
20370 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
20380 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
20390 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
203a0 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e  8 *aKey = &((con
203b0 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28  st u8*)pKey1)[*(
203c0 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20  const u8*)pKey1 
203d0 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73  & 0x3F];.  int s
203e0 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63  erial_type = ((c
203f0 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b  onst u8*)pKey1)[
20400 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  1];.  int res;. 
20410 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b   u32 y;.  u64 x;
20420 0a 20 20 69 36 34 20 76 3b 0a 20 20 69 36 34 20  .  i64 v;.  i64 
20430 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65  lhs;..  vdbeAsse
20440 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
20450 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20  inLimits(nKey1, 
20460 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70  pKey1, pPKey2->p
20470 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65  KeyInfo);.  asse
20480 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31  rt( (*(u8*)pKey1
20490 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55  )<=0x3F || CORRU
204a0 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63  PT_DB );.  switc
204b0 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
204c0 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  {.    case 1: { 
204d0 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
204e0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
204f0 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45    lhs = ONE_BYTE
20500 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
20510 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
20520 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
20530 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20540 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
20550 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
20560 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57  /.      lhs = TW
20570 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
20580 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20590 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
205a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
205b0 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
205c0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
205d0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
205e0 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49  s = THREE_BYTE_I
205f0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
20600 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
20610 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20620 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
20630 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
20640 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
20650 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42        y = FOUR_B
20660 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
20670 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34        lhs = (i64
20680 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20  )*(int*)&y;.    
20690 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
206a0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
206b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
206c0 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
206d0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
206e0 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f  /.      lhs = FO
206f0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
20700 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  y+2) + (((i64)1)
20710 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
20720 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
20730 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
20740 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
20750 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
20760 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  : { /* 8-byte si
20770 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
20780 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42        x = FOUR_B
20790 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
207a0 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
207b0 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ) | FOUR_BYTE_UI
207c0 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20  NT(aKey+4);.    
207d0 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26    lhs = *(i64*)&
207e0 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  x;.      testcas
207f0 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
20800 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
20810 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20     case 8: .    
20820 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20    lhs = 0;.     
20830 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
20840 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   9:.      lhs = 
20850 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
20860 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
20870 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76  e could be remov
20880 65 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ed without chang
20890 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20  ing the results 
208a0 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a  of running.    *
208b0 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63  * this code. Inc
208c0 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 73  luding it causes
208d0 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65   gcc to generate
208e0 20 61 20 66 61 73 74 65 72 20 73 77 69 74 63 68   a faster switch
208f0 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65   .    ** stateme
20900 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 61  nt (since the ra
20910 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 61  nge of switch ta
20920 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73  rgets now starts
20930 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20   at zero and.   
20940 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75   ** is contiguou
20950 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  s) but does not 
20960 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63  cause any duplic
20970 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67  ate code to be g
20980 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20  enerated.    ** 
20990 28 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 65  (as gcc is cleve
209a0 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62  r enough to comb
209b0 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65  ine the two like
209c0 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a   cases). Other .
209d0 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73      ** compilers
209e0 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61   might be simila
209f0 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65  r.  */ .    case
20a00 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20   0: case 7:.    
20a10 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
20a20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
20a30 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
20a40 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65  pPKey2);..    de
20a50 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
20a60 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
20a70 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
20a80 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
20a90 32 29 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 70  2);.  }..  v = p
20aa0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75  PKey2->aMem[0].u
20ab0 2e 69 3b 0a 20 20 69 66 28 20 76 3e 6c 68 73 20  .i;.  if( v>lhs 
20ac0 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
20ad0 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65  ey2->r1;.  }else
20ae0 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20   if( v<lhs ){.  
20af0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
20b00 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r2;.  }else if( 
20b10 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31  pPKey2->nField>1
20b20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   ){.    /* The f
20b30 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
20b40 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20  he two keys are 
20b50 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74  equal. Compare t
20b60 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20  he trailing .   
20b70 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a   ** fields.  */.
20b80 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
20b90 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
20ba0 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
20bb0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
20bc0 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
20bd0 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
20be0 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
20bf0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20   keys are equal 
20c00 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
20c10 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a   trailing.    **
20c20 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20   fields. Return 
20c30 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
20c40 72 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  rc in this case.
20c50 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50   */.    res = pP
20c60 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
20c70 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71  ;.    pPKey2->eq
20c80 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  Seen = 1;.  }.. 
20c90 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
20ca0 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
20cb0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
20cc0 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20  Key2, res) );.  
20cd0 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
20ce0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
20cf0 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  on is an optimiz
20d00 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
20d10 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20d20 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61  ompare() .** tha
20d30 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20  t (a) the first 
20d40 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
20d50 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61  is a string, tha
20d60 74 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20  t (b) the first 
20d70 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68  field.** uses th
20d80 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
20d90 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20  ence BINARY and 
20da0 28 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a  (c) that the siz
20db0 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
20dc0 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74  nt .** at the st
20dd0 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b  art of (pKey1/nK
20de0 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73  ey1) fits in a s
20df0 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73  ingle byte..*/.s
20e00 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
20e10 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
20e20 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g(.  int nKey1, 
20e30 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
20e40 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
20e50 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
20e60 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
20e70 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
20e80 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
20e90 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
20ea0 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74  u8*)pKey1;.  int
20eb0 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20   serial_type;.  
20ec0 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65  int res;..  asse
20ed0 72 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  rt( pPKey2->aMem
20ee0 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  [0].flags & MEM_
20ef0 53 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73 73  Str );.  vdbeAss
20f00 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
20f10 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c  hinLimits(nKey1,
20f20 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e   pKey1, pPKey2->
20f30 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74  pKeyInfo);.  get
20f40 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
20f50 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
20f60 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  ;.  if( serial_t
20f70 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65  ype<12 ){.    re
20f80 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20  s = pPKey2->r1; 
20f90 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e       /* (pKey1/n
20fa0 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65  Key1) is a numbe
20fb0 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20  r or a null */. 
20fc0 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72   }else if( !(ser
20fd0 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
20fe0 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70   ){ .    res = p
20ff0 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20  PKey2->r2;      
21000 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
21010 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20   is a blob */.  
21020 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
21030 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74  Cmp;.    int nSt
21040 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72  r;.    int szHdr
21050 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20   = aKey1[0];..  
21060 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c    nStr = (serial
21070 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20  _type-12) / 2;. 
21080 20 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20     if( (szHdr + 
21090 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b  nStr) > nKey1 ){
210a0 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  .      pPKey2->e
210b0 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
210c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
210d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
210e0 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69  ;    /* Corrupti
210f0 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  on */.    }.    
21100 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65  nCmp = MIN( pPKe
21110 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e  y2->aMem[0].n, n
21120 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  Str );.    res =
21130 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73   memcmp(&aKey1[s
21140 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61  zHdr], pPKey2->a
21150 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b  Mem[0].z, nCmp);
21160 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30  ..    if( res==0
21170 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
21180 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61  nStr - pPKey2->a
21190 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20  Mem[0].n;.      
211a0 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
211b0 20 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32        if( pPKey2
211c0 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20  ->nField>1 ){.  
211d0 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 71          res = sq
211e0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
211f0 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
21200 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
21210 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ey2, 1);.       
21220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21230 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
21240 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20  default_rc;.    
21250 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71        pPKey2->eq
21260 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Seen = 1;.      
21270 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
21280 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
21290 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
212a0 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c  2->r2;.      }el
212b0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20  se{.        res 
212c0 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
212d0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
212e0 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
212f0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
21300 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >r2;.    }else{.
21310 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
21320 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20  y2->r1;.    }.  
21330 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62  }..  assert( vdb
21340 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
21350 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
21360 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20  , pPKey2, res). 
21370 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
21380 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  _DB.       || pP
21390 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
213a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
213b0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  .  );.  return r
213c0 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  es;.}../*.** Ret
213d0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
213e0 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52   an sqlite3VdbeR
213f0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
21400 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69  ompatible functi
21410 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66  on.** suitable f
21420 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72  or comparing ser
21430 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20  ialized records 
21440 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20  to the unpacked 
21450 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a  record passed.**
21460 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
21470 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64  ument..*/.Record
21480 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56  Compare sqlite3V
21490 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55  dbeFindCompare(U
214a0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
214b0 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65  ){.  /* varintRe
214c0 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
214d0 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72   and varintRecor
214e0 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29  dCompareString()
214f0 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a   both assume.  *
21500 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d  * that the size-
21510 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
21520 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
21530 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
21540 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69  h record.  ** fi
21550 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62  ts in a single b
21560 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37  yte (i.e. is 127
21570 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e   or less). varin
21580 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
21590 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73  t().  ** also as
215a0 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
215b0 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61   safe to overrea
215c0 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74  d a buffer by at
215d0 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a   least the .  **
215e0 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c   maximum possibl
215f0 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73  e legal header s
21600 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73  ize plus 8 bytes
21610 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20  . Because there 
21620 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65  is.  ** guarante
21630 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73  ed to be at leas
21640 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33  t 74 (but not 13
21650 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  6) bytes of padd
21660 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ing following ea
21670 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70  ch.  ** buffer p
21680 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52  assed to varintR
21690 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
216a0 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20  ) this makes it 
216b0 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20  convenient to.  
216c0 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a  ** limit the siz
216d0 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
216e0 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63  to 64 bytes in c
216f0 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66  ases where the f
21700 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20  irst field.  ** 
21710 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20  is an integer.. 
21720 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73   **.  ** The eas
21730 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f  iest way to enfo
21740 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69  rce this limit i
21750 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e  s to consider on
21760 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a  ly records with.
21770 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f    ** 13 fields o
21780 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66  r less. If the f
21790 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e  irst field is an
217a0 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61   integer, the ma
217b0 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a  ximum legal.  **
217c0 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20   header size is 
217d0 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62  (12*5 + 1 + 1) b
217e0 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ytes.  */.  if( 
217f0 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  (p->pKeyInfo->nF
21800 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e  ield + p->pKeyIn
21810 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33  fo->nXField)<=13
21820 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   ){.    int flag
21830 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66  s = p->aMem[0].f
21840 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d  lags;.    if( p-
21850 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
21860 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  Order[0] ){.    
21870 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20    p->r1 = 1;.   
21880 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20     p->r2 = -1;. 
21890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
218a0 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20  p->r1 = -1;.    
218b0 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20    p->r2 = 1;.   
218c0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67   }.    if( (flag
218d0 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a  s & MEM_Int) ){.
218e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
218f0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
21900 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  t;.    }.    tes
21910 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
21920 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74  EM_Real );.    t
21930 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
21940 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20   MEM_Null );.   
21950 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
21960 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
21970 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
21980 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75  (MEM_Real|MEM_Nu
21990 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30  ll|MEM_Blob))==0
219a0 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d   && p->pKeyInfo-
219b0 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a  >aColl[0]==0 ){.
219c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
219d0 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b  ags & MEM_Str );
219e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
219f0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
21a00 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  tring;.    }.  }
21a10 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ..  return sqlit
21a20 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
21a30 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43  are;.}../*.** pC
21a40 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
21a50 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61  index entry crea
21a60 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  ted using the OP
21a70 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
21a80 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  de..** Read the 
21a90 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20  rowid (the last 
21aa0 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63  field in the rec
21ab0 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69  ord) and store i
21ac0 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20  t in *rowid..** 
21ad0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
21ae0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
21af0 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f  orks, or an erro
21b00 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
21b10 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67  ..**.** pCur mig
21b20 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  ht be pointing t
21b30 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20  o text obtained 
21b40 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64  from a corrupt d
21b50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
21b60 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   So the content 
21b70 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
21b80 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61  d.  Do appropria
21b90 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65  te checks on the
21ba0 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74   content..*/.int
21bb0 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
21bc0 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
21bd0 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  , BtCursor *pCur
21be0 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20  , i64 *rowid){. 
21bf0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
21c00 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
21c10 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20  32 szHdr;       
21c20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
21c30 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
21c40 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a  typeRowid;    /*
21c50 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   Serial type of 
21c60 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75  the rowid */.  u
21c70 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20  32 lenRowid;    
21c80 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
21c90 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d  rowid */.  Mem m
21ca0 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  , v;..  /* Get t
21cb0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  he size of the i
21cc0 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c  ndex entry.  Onl
21cd0 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65  y indices entrie
21ce0 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74  s of less.  ** t
21cf0 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70  han 2GiB are sup
21d00 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20  port - anything 
21d10 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61  large must be da
21d20 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
21d30 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72  n..  ** Any corr
21d40 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
21d50 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72  ed in sqlite3Btr
21d60 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
21d70 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a  , though, so.  *
21d80 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20  * this code can 
21d90 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68  safely assume th
21da0 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33  at nCellKey is 3
21db0 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20  2-bits  .  */.  
21dc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
21dd0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
21de0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65  d(pCur) );.  nCe
21df0 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42  llKey = sqlite3B
21e00 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28  treePayloadSize(
21e10 70 43 75 72 29 3b 0a 20 20 61 73 73 65 72 74 28  pCur);.  assert(
21e20 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c   (nCellKey & SQL
21e30 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75  ITE_MAX_U32)==(u
21e40 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a  64)nCellKey );..
21e50 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
21e60 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
21e70 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  t of the index e
21e80 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
21e90 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c  3VdbeMemInit(&m,
21ea0 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20   db, 0);.  rc = 
21eb0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
21ec0 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c  omBtree(pCur, 0,
21ed0 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20   (u32)nCellKey, 
21ee0 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
21ef0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
21f00 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e    }..  /* The in
21f10 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62  dex entry must b
21f20 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64  egin with a head
21f30 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f  er size */.  (vo
21f40 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
21f50 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b  u8*)m.z, szHdr);
21f60 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
21f70 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  dr==3 );.  testc
21f80 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20  ase( szHdr==m.n 
21f90 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
21fa0 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e  y(szHdr<3 || (in
21fb0 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a  t)szHdr>m.n) ){.
21fc0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
21fd0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
21fe0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73   }..  /* The las
21ff0 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  t field of the i
22000 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61  ndex should be a
22010 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20  n integer - the 
22020 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69  ROWID..  ** Veri
22030 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  fy that the last
22040 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73   entry really is
22050 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   an integer. */.
22060 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
22070 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a  t32((u8*)&m.z[sz
22080 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69  Hdr-1], typeRowi
22090 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d);.  testcase( 
220a0 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a  typeRowid==1 );.
220b0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
220c0 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65  Rowid==2 );.  te
220d0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
220e0 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  d==3 );.  testca
220f0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34  se( typeRowid==4
22100 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
22110 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a  typeRowid==5 );.
22120 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
22130 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65  Rowid==6 );.  te
22140 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
22150 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61  d==8 );.  testca
22160 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39  se( typeRowid==9
22170 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
22180 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c  ly(typeRowid<1 |
22190 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c  | typeRowid>9 ||
221a0 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29   typeRowid==7) )
221b0 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
221c0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
221d0 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20  .  }.  lenRowid 
221e0 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  = sqlite3SmallTy
221f0 70 65 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69  peSizes[typeRowi
22200 64 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d];.  testcase( 
22210 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b  (u32)m.n==szHdr+
22220 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66  lenRowid );.  if
22230 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29  ( unlikely((u32)
22240 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  m.n<szHdr+lenRow
22250 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  id) ){.    goto 
22260 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
22270 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
22280 46 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65  Fetch the intege
22290 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  r off the end of
222a0 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72   the index recor
222b0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  d */.  sqlite3Vd
222c0 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a  beSerialGet((u8*
222d0 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  )&m.z[m.n-lenRow
222e0 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
222f0 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
22300 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33  v.u.i;.  sqlite3
22310 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
22320 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
22330 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
22340 6d 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62  mp here if datab
22350 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
22360 73 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72  s detected after
22370 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a   m has been.  **
22380 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65   allocated.  Fre
22390 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61  e the m object a
223a0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
223b0 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78  _CORRUPT. */.idx
223c0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
223d0 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d  n:.  testcase( m
223e0 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a  .szMalloc!=0 );.
223f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
22400 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
22410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
22420 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a  RUPT_BKPT;.}../*
22430 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
22440 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78  key of the index
22450 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
22460 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e  or pC is pointin
22470 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20  g to against.** 
22480 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69  the key string i
22490 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72  n pUnpacked.  Wr
224a0 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61  ite into *pRes a
224b0 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20   number.** that 
224c0 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  is negative, zer
224d0 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
224e0 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61  f pC is less tha
224f0 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20  n, equal to,.** 
22500 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
22510 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75  pUnpacked.  Retu
22520 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
22530 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
22540 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68  Unpacked is eith
22550 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f  er created witho
22560 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73  ut a rowid or is
22570 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68   truncated so th
22580 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74  at it.** omits t
22590 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
225a0 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  end.  The rowid 
225b0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
225c0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
225d0 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77   is ignored as w
225e0 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69  ell.  Hence, thi
225f0 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63  s routine only c
22600 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66  ompares the pref
22610 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20  ixes .** of the 
22620 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68  keys prior to th
22630 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e  e final rowid, n
22640 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  ot the entire ke
22650 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
22660 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
22670 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  re(.  sqlite3 *d
22680 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
22690 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
226a0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
226b0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
226c0 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
226d0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
226e0 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
226f0 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  inst */.  Unpack
22700 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63  edRecord *pUnpac
22710 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e  ked,       /* Un
22720 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f  packed version o
22730 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  f key */.  int *
22740 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  res             
22750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
22760 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  rite the compari
22770 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20  son result here 
22780 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  */.){.  i64 nCel
22790 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
227a0 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rc;.  BtCursor *
227b0 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a  pCur;.  Mem m;..
227c0 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
227d0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
227e0 42 54 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20  BTREE );.  pCur 
227f0 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  = pC->uc.pCursor
22800 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
22810 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
22820 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
22830 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   nCellKey = sqli
22840 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53  te3BtreePayloadS
22850 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 2f 2a 20  ize(pCur);.  /* 
22860 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c  nCellKey will al
22870 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20  ways be between 
22880 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66  0 and 0xffffffff
22890 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
228a0 77 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74  way.  ** that bt
228b0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
228c0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74  ) and sqlite3Get
228d0 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69  Varint32() are i
228e0 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20  mplemented */.  
228f0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
22900 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66  || nCellKey>0x7f
22910 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72  ffffff ){.    *r
22920 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
22930 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
22940 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  T_BKPT;.  }.  sq
22950 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
22960 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72  (&m, db, 0);.  r
22970 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
22980 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72  emFromBtree(pCur
22990 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b  , 0, (u32)nCellK
229a0 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72  ey, &m);.  if( r
229b0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
229c0 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d  rc;.  }.  *res =
229d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
229e0 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
229f0 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
22a00 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
22a10 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
22a20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22a30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
22a40 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
22a50 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
22a60 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
22a70 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
22a80 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
22a90 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
22aa0 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
22ab0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
22ac0 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
22ad0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
22ae0 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
22af0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
22b00 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
22b10 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
22b20 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
22b30 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
22b40 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
22b50 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
22b60 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
22b70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
22b80 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
22b90 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
22ba0 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
22bb0 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
22bc0 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
22bd0 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
22be0 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
22bf0 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
22c00 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
22c10 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22c20 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
22c30 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
22c40 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
22c50 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
22c60 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
22c70 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
22c80 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
22c90 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
22ca0 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
22cb0 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
22cc0 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
22cd0 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
22ce0 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
22cf0 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
22d00 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
22d10 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
22d20 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
22d30 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
22d40 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
22d50 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
22d60 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
22d70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
22d80 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
22d90 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
22da0 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
22db0 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
22dc0 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
22dd0 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
22de0 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
22df0 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
22e00 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
22e10 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
22e20 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
22e30 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
22e40 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
22e50 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
22e60 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
22e70 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
22e80 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
22e90 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
22ea0 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
22eb0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
22ec0 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
22ed0 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
22ee0 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
22ef0 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
22f00 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
22f10 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
22f20 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
22f30 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
22f40 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
22f50 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
22f60 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
22f70 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
22f80 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
22f90 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
22fa0 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
22fb0 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
22fc0 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
22fd0 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
22fe0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
22ff0 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
23000 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  ndValue(Vdbe *v,
23010 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
23020 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
23030 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
23040 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
23050 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
23060 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
23070 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
23080 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
23090 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
230a0 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
230b0 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
230c0 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
230d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
230e0 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
230f0 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
23100 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23110 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
23120 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
23130 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
23140 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
23150 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
23160 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
23170 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
23180 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
23190 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
231a0 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
231b0 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
231c0 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
231d0 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
231e0 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
231f0 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
23200 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
23210 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
23220 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
23230 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
23240 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
23250 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
23260 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
23270 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
23280 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
23290 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
232a0 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
232b0 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
232c0 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
232d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
232e0 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
232f0 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
23300 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
23310 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
23320 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
23330 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
23340 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
23350 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
23360 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
23370 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
23380 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
23390 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
233a0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
233b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
233c0 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
233d0 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
233e0 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
233f0 69 66 28 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  if( pVtab->zErrM
23400 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sg ){.    sqlite
23410 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
23420 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
23430 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
23440 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
23450 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
23460 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45  up(db, pVtab->zE
23470 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
23480 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
23490 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 56  zErrMsg);.    pV
234a0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
234b0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
234c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
234d0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
234e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
234f0 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
23500 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  OK../*.** If the
23510 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
23520 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65   is not NULL, re
23530 6c 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61  lease any alloca
23540 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
23550 20 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6d 65   .** with the me
23560 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68  mory cells in th
23570 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61  e p->aMem[] arra
23580 79 2e 20 41 6c 73 6f 20 66 72 65 65 20 74 68 65  y. Also free the
23590 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
235a0 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 74 73  ** structure its
235b0 65 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c 69 74  elf, using sqlit
235c0 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a  e3DbFree()..**.*
235d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
235e0 69 73 20 75 73 65 64 20 74 6f 20 66 72 65 65 20  is used to free 
235f0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
23600 74 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61  tructures alloca
23610 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 64  ted by.** the vd
23620 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29  beUnpackRecord()
23630 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20   function found 
23640 69 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f  in vdbeapi.c..*/
23650 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
23660 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 73 71  eFreeUnpacked(sq
23670 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
23680 46 69 65 6c 64 2c 20 55 6e 70 61 63 6b 65 64 52  Field, UnpackedR
23690 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28  ecord *p){.  if(
236a0 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
236b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
236c0 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  nField; i++){.  
236d0 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
236e0 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20  &p->aMem[i];.   
236f0 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61     if( pMem->zMa
23700 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64  lloc ) sqlite3Vd
23710 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65  beMemRelease(pMe
23720 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  m);.    }.    sq
23730 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
23740 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  p);.  }.}.#endif
23750 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
23760 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
23770 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
23780 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
23790 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49  ATE_HOOK./*.** I
237a0 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70  nvoke the pre-up
237b0 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68  date hook. If th
237c0 69 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20  is is an UPDATE 
237d0 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75 70  or DELETE pre-up
237e0 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68  date call,.** th
237f0 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  en cursor passed
23800 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
23810 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70  rgument should p
23820 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77 20  oint to the row 
23830 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75  about.** to be u
23840 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 64  pdate or deleted
23850 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61  . If the applica
23860 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74  tion calls sqlit
23870 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64  e3_preupdate_old
23880 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75 69  (),.** the requi
23890 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 62  red value will b
238a0 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
238b0 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20 70  row the cursor p
238c0 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69  oints to..*/.voi
238d0 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65  d sqlite3VdbePre
238e0 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64  UpdateHook(.  Vd
238f0 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23910 20 56 64 62 65 20 70 72 65 2d 75 70 64 61 74 65   Vdbe pre-update
23920 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64   hook is invoked
23930 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75 72   by */.  VdbeCur
23940 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20  sor *pCsr,      
23950 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
23960 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a  or to grab old.*
23970 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a   values from */.
23980 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
23990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239a0 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45    /* SQLITE_INSE
239b0 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
239c0 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  LETE */.  const 
239d0 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20  char *zDb,      
239e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
239f0 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  abase name */.  
23a00 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62 6c  /* Modified tabl
23a30 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 31  e */.  i64 iKey1
23a40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23a50 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
23a60 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20  l key value */. 
23a70 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20   int iReg       
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a90 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72   /* Register for
23aa0 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f   new.* record */
23ab0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
23ac0 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34  b = v->db;.  i64
23ad0 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70 64   iKey2;.  PreUpd
23ae0 61 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a 20  ate preupdate;. 
23af0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
23b00 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  l = pTab->zName;
23b10 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
23b20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65 72  u8 fakeSortOrder
23b30 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
23b40 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 3d   db->pPreUpdate=
23b50 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  =0 );.  memset(&
23b60 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73 69  preupdate, 0, si
23b70 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65 29 29  zeof(PreUpdate))
23b80 3b 0a 20 20 69 66 28 20 48 61 73 52 6f 77 69 64  ;.  if( HasRowid
23b90 28 70 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20  (pTab)==0 ){.   
23ba0 20 69 4b 65 79 31 20 3d 20 69 4b 65 79 32 20 3d   iKey1 = iKey2 =
23bb0 20 30 3b 0a 20 20 20 20 70 72 65 75 70 64 61 74   0;.    preupdat
23bc0 65 2e 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50  e.pPk = sqlite3P
23bd0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
23be0 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Tab);.  }else{. 
23bf0 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54     if( op==SQLIT
23c00 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20  E_UPDATE ){.    
23c10 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65    iKey2 = v->aMe
23c20 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 20  m[iReg].u.i;.   
23c30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4b   }else{.      iK
23c40 65 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 20  ey2 = iKey1;.   
23c50 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
23c60 28 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d  ( pCsr->nField==
23c70 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20  pTab->nCol .    
23c80 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69     || (pCsr->nFi
23c90 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b  eld==pTab->nCol+
23ca0 31 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f  1 && op==SQLITE_
23cb0 44 45 4c 45 54 45 20 26 26 20 69 52 65 67 3d 3d  DELETE && iReg==
23cc0 2d 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75  -1).  );..  preu
23cd0 70 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70  pdate.v = v;.  p
23ce0 72 65 75 70 64 61 74 65 2e 70 43 73 72 20 3d 20  reupdate.pCsr = 
23cf0 70 43 73 72 3b 0a 20 20 70 72 65 75 70 64 61 74  pCsr;.  preupdat
23d00 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65  e.op = op;.  pre
23d10 75 70 64 61 74 65 2e 69 4e 65 77 52 65 67 20 3d  update.iNewReg =
23d20 20 69 52 65 67 3b 0a 20 20 70 72 65 75 70 64 61   iReg;.  preupda
23d30 74 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20  te.keyinfo.db = 
23d40 64 62 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  db;.  preupdate.
23d50 6b 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e  keyinfo.enc = EN
23d60 43 28 64 62 29 3b 0a 20 20 70 72 65 75 70 64 61  C(db);.  preupda
23d70 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69 65 6c  te.keyinfo.nFiel
23d80 64 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  d = pTab->nCol;.
23d90 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69    preupdate.keyi
23da0 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d  nfo.aSortOrder =
23db0 20 28 75 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f   (u8*)&fakeSortO
23dc0 72 64 65 72 3b 0a 20 20 70 72 65 75 70 64 61 74  rder;.  preupdat
23dd0 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b  e.iKey1 = iKey1;
23de0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65  .  preupdate.iKe
23df0 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72  y2 = iKey2;.  pr
23e00 65 75 70 64 61 74 65 2e 70 54 61 62 20 3d 20 70  eupdate.pTab = p
23e10 54 61 62 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65  Tab;..  db->pPre
23e20 55 70 64 61 74 65 20 3d 20 26 70 72 65 75 70 64  Update = &preupd
23e30 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55  ate;.  db->xPreU
23e40 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62  pdateCallback(db
23e50 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 2c  ->pPreUpdateArg,
23e60 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54   db, op, zDb, zT
23e70 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32  bl, iKey1, iKey2
23e80 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  );.  db->pPreUpd
23e90 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ate = 0;.  sqlit
23ea0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65  e3DbFree(db, pre
23eb0 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b  update.aRecord);
23ec0 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  .  vdbeFreeUnpac
23ed0 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74  ked(db, preupdat
23ee0 65 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69 65 6c 64  e.keyinfo.nField
23ef0 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70 55  +1, preupdate.pU
23f00 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76 64 62 65  npacked);.  vdbe
23f10 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c  FreeUnpacked(db,
23f20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
23f30 66 6f 2e 6e 46 69 65 6c 64 2b 31 2c 20 70 72 65  fo.nField+1, pre
23f40 75 70 64 61 74 65 2e 70 4e 65 77 55 6e 70 61 63  update.pNewUnpac
23f50 6b 65 64 29 3b 0a 20 20 69 66 28 20 70 72 65 75  ked);.  if( preu
23f60 70 64 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20 20  pdate.aNew ){.  
23f70 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
23f80 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 46  (i=0; i<pCsr->nF
23f90 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ield; i++){.    
23fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
23fb0 52 65 6c 65 61 73 65 28 26 70 72 65 75 70 64 61  Release(&preupda
23fc0 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20 20  te.aNew[i]);.   
23fd0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
23fe0 46 72 65 65 28 64 62 2c 20 70 72 65 75 70 64 61  Free(db, preupda
23ff0 74 65 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a  te.aNew);.  }.}.
24000 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
24010 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
24020 45 5f 48 4f 4f 4b 20 2a 2f 0a                    E_HOOK */.