/ Hex Artifact Content
Login

Artifact be0797ca0c392eea2201afbf2eef0b1531e2a8b7:


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 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4cd0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
4ce0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
4cf0: 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73  ay of opcodes as
4d00: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
4d10: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
4d20: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
4d30: 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68  gument. It is th
4d40: 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
4d50: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61  sibility.** to a
4d60: 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72  rrange for the r
4d70: 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f  eturned array to
4d80: 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
4d90: 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a  reed using the .
4da0: 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  ** vdbeFreeOpArr
4db0: 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ay() function..*
4dc0: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
4dd0: 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20  rning, *pnOp is 
4de0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
4df0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
4e00: 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
4e10: 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e  array. Also, *pn
4e20: 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f  MaxArg is set to
4e30: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69   the larger of i
4e40: 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
4e50: 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d   and .** the num
4e60: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
4e70: 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  n the Vdbe.apArg
4e80: 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65  [] array require
4e90: 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
4ea0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72   .** returned pr
4eb0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70  ogram..*/.VdbeOp
4ec0: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b   *sqlite3VdbeTak
4ed0: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70  eOpArray(Vdbe *p
4ee0: 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74  , int *pnOp, int
4ef0: 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56   *pnMaxArg){.  V
4f00: 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e  dbeOp *aOp = p->
4f10: 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61  aOp;.  assert( a
4f20: 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61  Op && !p->db->ma
4f30: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
4f40: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73   /* Check that s
4f50: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
4f60: 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ree() was not ca
4f70: 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20  lled on this VM 
4f80: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d  */.  assert( DbM
4f90: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74  askAllZero(p->bt
4fa0: 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72  reeMask) );..  r
4fb0: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
4fc0: 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a  , pnMaxArg);.  *
4fd0: 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  pnOp = p->nOp;. 
4fe0: 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72   p->aOp = 0;.  r
4ff0: 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a  eturn aOp;.}../*
5000: 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20  .** Add a whole 
5010: 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f  list of operatio
5020: 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74  ns to the operat
5030: 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75  ion stack.  Retu
5040: 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  rn a.** pointer 
5050: 74 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  to the first ope
5060: 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e  ration inserted.
5070: 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20  .**.** Non-zero 
5080: 50 32 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  P2 arguments to 
5090: 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  jump instruction
50a0: 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
50b0: 6c 6c 79 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20  lly adjusted.** 
50c0: 73 6f 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70  so that the jump
50d0: 20 74 61 72 67 65 74 20 69 73 20 72 65 6c 61 74   target is relat
50e0: 69 76 65 20 74 6f 20 74 68 65 20 66 69 72 73 74  ive to the first
50f0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72   operation inser
5100: 74 65 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ted..*/.VdbeOp *
5110: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5120: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 2c  List(.  Vdbe *p,
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 2f 2a 20 41 64 64 20 6f 70 63 6f       /* Add opco
5150: 64 65 73 20 74 6f 20 74 68 65 20 70 72 65 70 61  des to the prepa
5160: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
5170: 0a 20 20 69 6e 74 20 6e 4f 70 2c 20 20 20 20 20  .  int nOp,     
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70 63  /* Number of opc
51a0: 6f 64 65 73 20 74 6f 20 61 64 64 20 2a 2f 0a 20  odes to add */. 
51b0: 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73   VdbeOpList cons
51c0: 74 20 2a 61 4f 70 2c 20 20 20 20 20 20 20 2f 2a  t *aOp,       /*
51d0: 20 54 68 65 20 6f 70 63 6f 64 65 73 20 74 6f 20   The opcodes to 
51e0: 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e  be added */.  in
51f0: 74 20 69 4c 69 6e 65 6e 6f 20 20 20 20 20 20 20  t iLineno       
5200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
5210: 75 72 63 65 2d 66 69 6c 65 20 6c 69 6e 65 20 6e  urce-file line n
5220: 75 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 6f  umber of first o
5230: 70 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  pcode */.){.  in
5240: 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  t i;.  VdbeOp *p
5250: 4f 75 74 2c 20 2a 70 46 69 72 73 74 3b 0a 20 20  Out, *pFirst;.  
5260: 61 73 73 65 72 74 28 20 6e 4f 70 3e 30 20 29 3b  assert( nOp>0 );
5270: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
5280: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
5290: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
52a0: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
52b0: 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63  pParse->nOpAlloc
52c0: 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28   && growOpArray(
52d0: 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72  p, nOp) ){.    r
52e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
52f0: 46 69 72 73 74 20 3d 20 70 4f 75 74 20 3d 20 26  First = pOut = &
5300: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a  p->aOp[p->nOp];.
5310: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70    for(i=0; i<nOp
5320: 3b 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f  ; i++, aOp++, pO
5330: 75 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d  ut++){.    pOut-
5340: 3e 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f  >opcode = aOp->o
5350: 70 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d  pcode;.    pOut-
5360: 3e 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20  >p1 = aOp->p1;. 
5370: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f     pOut->p2 = aO
5380: 70 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73 65 72  p->p2;.    asser
5390: 74 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b  t( aOp->p2>=0 );
53a0: 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65  .    if( (sqlite
53b0: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
53c0: 61 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f  aOp->opcode] & O
53d0: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26  PFLG_JUMP)!=0 &&
53e0: 20 61 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20   aOp->p2>0 ){.  
53f0: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20      pOut->p2 += 
5400: 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  p->nOp;.    }.  
5410: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70    pOut->p3 = aOp
5420: 2d 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  ->p3;.    pOut->
5430: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
5440: 53 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  SED;.    pOut->p
5450: 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75  4.p = 0;.    pOu
5460: 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65  t->p5 = 0;.#ifde
5470: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
5480: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
5490: 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d  .    pOut->zComm
54a0: 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ent = 0;.#endif.
54b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44  #ifdef SQLITE_VD
54c0: 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20  BE_COVERAGE.    
54d0: 70 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  pOut->iSrcLine =
54e0: 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73   iLineno+i;.#els
54f0: 65 0a 20 20 20 20 28 76 6f 69 64 29 69 4c 69 6e  e.    (void)iLin
5500: 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  eno;.#endif.#ifd
5510: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5520: 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66      if( p->db->f
5530: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
5540: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
5550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5560: 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d  ePrintOp(0, i+p-
5570: 3e 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  >nOp, &p->aOp[i+
5580: 70 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a  p->nOp]);.    }.
5590: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e  #endif.  }.  p->
55a0: 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65  nOp += nOp;.  re
55b0: 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a  turn pFirst;.}..
55c0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
55d0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
55e0: 43 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a  CANSTATUS)./*.**
55f0: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
5600: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f   the array of co
5610: 75 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62  unters managed b
5620: 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  y sqlite3_stmt_s
5630: 63 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  canstatus()..*/.
5640: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5650: 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64  ScanStatus(.  Vd
5660: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
5670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5680: 20 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73   VM to add scans
5690: 74 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20  tatus() to */.  
56a0: 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c  int addrExplain,
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56c0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
56d0: 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20  _Explain (or 0) 
56e0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f  */.  int addrLoo
56f0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
5700: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
5710: 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  of loop counter 
5720: 2a 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69  */ .  int addrVi
5730: 73 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  sit,            
5740: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
5750: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
5760: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f   counter */.  Lo
5770: 67 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20  gEst nEst,      
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5790: 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
57a0: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
57b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
57c0: 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20   *zName         
57d0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
57e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
57f0: 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f  being scanned */
5800: 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  .){.  int nByte 
5810: 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a  = (p->nScan+1) *
5820: 20 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74   sizeof(ScanStat
5830: 75 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75  us);.  ScanStatu
5840: 73 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20  s *aNew;.  aNew 
5850: 3d 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73  = (ScanStatus*)s
5860: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
5870: 70 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c  p->db, p->aScan,
5880: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61   nByte);.  if( a
5890: 4e 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53  New ){.    ScanS
58a0: 74 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61  tatus *pNew = &a
58b0: 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b  New[p->nScan++];
58c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45  .    pNew->addrE
58d0: 78 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70  xplain = addrExp
58e0: 6c 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lain;.    pNew->
58f0: 61 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c  addrLoop = addrL
5900: 6f 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  oop;.    pNew->a
5910: 64 64 72 56 69 73 69 74 20 3d 20 61 64 64 72 56  ddrVisit = addrV
5920: 69 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  isit;.    pNew->
5930: 6e 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20  nEst = nEst;.   
5940: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pNew->zName = s
5950: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
5960: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
5970: 20 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65    p->aScan = aNe
5980: 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  w;.  }.}.#endif.
5990: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
59a0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
59b0: 6f 70 63 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50  opcode, or P1, P
59c0: 32 2c 20 50 33 2c 20 6f 72 20 50 35 20 6f 70 65  2, P3, or P5 ope
59d0: 72 61 6e 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73  rands.** for a s
59e0: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
59f0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
5a00: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70  ite3VdbeChangeOp
5a10: 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 33  code(Vdbe *p, u3
5a20: 32 20 61 64 64 72 2c 20 75 38 20 69 4e 65 77 4f  2 addr, u8 iNewO
5a30: 70 63 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65  pcode){.  sqlite
5a40: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64  3VdbeGetOp(p,add
5a50: 72 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65  r)->opcode = iNe
5a60: 77 4f 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20  wOpcode;.}.void 
5a70: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5a80: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32  eP1(Vdbe *p, u32
5a90: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
5aa0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  .  sqlite3VdbeGe
5ab0: 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 31 20  tOp(p,addr)->p1 
5ac0: 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71  = val;.}.void sq
5ad0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
5ae0: 32 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  2(Vdbe *p, u32 a
5af0: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
5b00: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
5b10: 70 28 70 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20  p(p,addr)->p2 = 
5b20: 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  val;.}.void sqli
5b30: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
5b40: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
5b50: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73  r, int val){.  s
5b60: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
5b70: 70 2c 61 64 64 72 29 2d 3e 70 33 20 3d 20 76 61  p,addr)->p3 = va
5b80: 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  l;.}.void sqlite
5b90: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64  3VdbeChangeP5(Vd
5ba0: 62 65 20 2a 70 2c 20 75 38 20 70 35 29 7b 0a 20  be *p, u8 p5){. 
5bb0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
5bc0: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
5bd0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
5be0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 20 70 2d 3e  ( p->nOp>0 ) p->
5bf0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35  aOp[p->nOp-1].p5
5c00: 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   = p5;.}../*.** 
5c10: 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70  Change the P2 op
5c20: 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63  erand of instruc
5c30: 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61  tion addr so tha
5c40: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
5c50: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
5c60: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
5c70: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65  ction to be code
5c80: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
5c90: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56  e3VdbeJumpHere(V
5ca0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
5cb0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
5cc0: 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72  ChangeP2(p, addr
5cd0: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f  , p->nOp);.}.../
5ce0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75  *.** If the inpu
5cf0: 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  t FuncDef struct
5d00: 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ure is ephemeral
5d10: 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20  , then free it. 
5d20: 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44   If.** the FuncD
5d30: 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d  ef is not epherm
5d40: 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  al, then do noth
5d50: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
5d60: 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61  oid freeEphemera
5d70: 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65  lFunction(sqlite
5d80: 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a  3 *db, FuncDef *
5d90: 70 44 65 66 29 7b 0a 20 20 69 66 28 20 28 70 44  pDef){.  if( (pD
5da0: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
5db0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45  SQLITE_FUNC_EPHE
5dc0: 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  M)!=0 ){.    sql
5dd0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5de0: 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  Def);.  }.}..sta
5df0: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
5e00: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
5e10: 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a   *, Op *, int);.
5e20: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
5e30: 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65  P4 value if nece
5e40: 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssary..*/.static
5e50: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
5e60: 20 76 6f 69 64 20 66 72 65 65 50 34 4d 65 6d 28   void freeP4Mem(
5e70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d 65 6d  sqlite3 *db, Mem
5e80: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73   *p){.  if( p->s
5e90: 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
5ea0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
5eb0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c 69 74  Malloc);.  sqlit
5ec0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
5ed0: 0a 7d 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  .}.static SQLITE
5ee0: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66  _NOINLINE void f
5ef0: 72 65 65 50 34 46 75 6e 63 43 74 78 28 73 71 6c  reeP4FuncCtx(sql
5f00: 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74 65  ite3 *db, sqlite
5f10: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20  3_context *p){. 
5f20: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
5f30: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e 70 46  nction(db, p->pF
5f40: 75 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  unc);.  sqlite3D
5f50: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
5f60: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
5f70: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
5f80: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
5f90: 20 2a 70 34 29 7b 0a 20 20 61 73 73 65 72 74 28   *p4){.  assert(
5fa0: 20 64 62 20 29 3b 0a 20 20 73 77 69 74 63 68 28   db );.  switch(
5fb0: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63   p4type ){.    c
5fc0: 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20  ase P4_FUNCCTX: 
5fd0: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 46 75  {.      freeP4Fu
5fe0: 6e 63 43 74 78 28 64 62 2c 20 28 73 71 6c 69 74  ncCtx(db, (sqlit
5ff0: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34 29 3b  e3_context*)p4);
6000: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6010: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
6020: 52 45 41 4c 3a 0a 20 20 20 20 63 61 73 65 20 50  REAL:.    case P
6030: 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 63 61 73  4_INT64:.    cas
6040: 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20  e P4_DYNAMIC:.  
6050: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
6060: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
6070: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34  te3DbFree(db, p4
6080: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6090: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
60a0: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
60b0: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
60c0: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
60d0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
60e0: 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a  ((KeyInfo*)p4);.
60f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6100: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
6110: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
6120: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
6130: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73  _EXPR: {.      s
6140: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6150: 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b  (db, (Expr*)p4);
6160: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6170: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
6180: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
6190: 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65  {.      freeEphe
61a0: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
61b0: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b  , (FuncDef*)p4);
61c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
61d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
61e0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  MEM: {.      if(
61f0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
6200: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
6210: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
6220: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
6230: 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  )p4);.      }els
6240: 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50  e{.        freeP
6250: 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70  4Mem(db, (Mem*)p
6260: 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
6270: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6280: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20     case P4_VTAB 
6290: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
62a0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
62b0: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
62c0: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
62d0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
62e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
62f0: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70  *.** Free the sp
6300: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
6310: 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34  r aOp and any p4
6320: 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65   values allocate
6330: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63  d for the.** opc
6340: 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  odes contained w
6350: 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73  ithin. If aOp is
6360: 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20   not NULL it is 
6370: 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61  assumed to conta
6380: 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69  in .** nOp entri
6390: 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  es. .*/.static v
63a0: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
63b0: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ray(sqlite3 *db,
63c0: 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f   Op *aOp, int nO
63d0: 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b  p){.  if( aOp ){
63e0: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
63f0: 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70    for(pOp=aOp; p
6400: 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f  Op<&aOp[nOp]; pO
6410: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  p++){.      if( 
6420: 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 20 66 72  pOp->p4type ) fr
6430: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
6440: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
6450: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6460: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
6470: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71  OMMENTS.      sq
6480: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
6490: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
64a0: 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20  #endif     .    
64b0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
64c0: 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a  bFree(db, aOp);.
64d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68  }../*.** Link th
64e0: 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a  e SubProgram obj
64f0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
6500: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
6510: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  t into the linke
6520: 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62  d.** list at Vdb
6530: 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54  e.pSubProgram. T
6540: 68 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64  his list is used
6550: 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73   to delete all s
6560: 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62  ub-program.** ob
6570: 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56  jects when the V
6580: 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72  M is no longer r
6590: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64  equired..*/.void
65a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b   sqlite3VdbeLink
65b0: 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20  SubProgram(Vdbe 
65c0: 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72  *pVdbe, SubProgr
65d0: 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65  am *p){.  p->pNe
65e0: 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f  xt = pVdbe->pPro
65f0: 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70  gram;.  pVdbe->p
6600: 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a  Program = p;.}..
6610: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
6620: 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20   opcode at addr 
6630: 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a  into OP_Noop.*/.
6640: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
6650: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65  hangeToNoop(Vdbe
6660: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
6670: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
6680: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
6690: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
66a0: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61  n 0;.  assert( a
66b0: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
66c0: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d  ->nOp );.  pOp =
66d0: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
66e0: 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20    freeP4(p->db, 
66f0: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
6700: 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e  ->p4.p);.  pOp->
6710: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
6720: 53 45 44 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a  SED;.  pOp->p4.z
6730: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63   = 0;.  pOp->opc
6740: 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
6750: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
6760: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20  .** If the last 
6770: 6f 70 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61  opcode is "op" a
6780: 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a  nd it is not a j
6790: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c  ump destination,
67a0: 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20  .** then remove 
67b0: 69 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  it.  Return true
67c0: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
67d0: 61 6e 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65  an opcode was re
67e0: 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
67f0: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50  lite3VdbeDeleteP
6800: 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20  riorOpcode(Vdbe 
6810: 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66  *p, u8 op){.  if
6820: 28 20 70 2d 3e 6e 4f 70 3e 30 20 26 26 20 70 2d  ( p->nOp>0 && p-
6830: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f  >aOp[p->nOp-1].o
6840: 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20  pcode==op ){.   
6850: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
6860: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
6870: 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20  p, p->nOp-1);.  
6880: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
6890: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
68a0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
68b0: 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65  ue of the P4 ope
68c0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
68d0: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
68e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
68f0: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
6900: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
6910: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
6920: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
6930: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
6940: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
6950: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
6960: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
6970: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
6980: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
6990: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34  n>=0 then the P4
69a0: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
69b0: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
69c0: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
69d0: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
69e0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
69f0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
6a00: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
6a10: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30   A value of n==0
6a20: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65   means copy byte
6a30: 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61  s of zP4 up to a
6a40: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  nd including the
6a50: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62  .** first null b
6a60: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65  yte.  If n>0 the
6a70: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73  n copy n+1 bytes
6a80: 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20   of zP4..** .** 
6a90: 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20  Other values of 
6aa0: 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34  n (P4_STATIC, P4
6ab0: 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69  _COLLSEQ etc.) i
6ac0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 34  ndicate that zP4
6ad0: 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20   points.** to a 
6ae0: 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74  string or struct
6af0: 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61 72  ure that is guar
6b00: 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
6b10: 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65  for the lifetime
6b20: 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e   of.** the Vdbe.
6b30: 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 20   In these cases 
6b40: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
6b50: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a   the pointer..**
6b60: 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68  .** If addr<0 th
6b70: 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20  en change P4 on 
6b80: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
6b90: 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72  y inserted instr
6ba0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uction..*/.stati
6bb0: 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 4e 4f  c void SQLITE_NO
6bc0: 49 4e 4c 49 4e 45 20 76 64 62 65 43 68 61 6e 67  INLINE vdbeChang
6bd0: 65 50 34 46 75 6c 6c 28 0a 20 20 56 64 62 65 20  eP4Full(.  Vdbe 
6be0: 2a 70 2c 0a 20 20 4f 70 20 2a 70 4f 70 2c 0a 20  *p,.  Op *pOp,. 
6bf0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
6c00: 2c 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 69  ,.  int n.){.  i
6c10: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  f( pOp->p4type )
6c20: 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d 3e  {.    freeP4(p->
6c30: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
6c40: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20   pOp->p4.p);.   
6c50: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 30   pOp->p4type = 0
6c60: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  ;.    pOp->p4.p 
6c70: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  = 0;.  }.  if( n
6c80: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
6c90: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c  3VdbeChangeP4(p,
6ca0: 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 70 2d 3e   (int)(pOp - p->
6cb0: 61 4f 70 29 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20  aOp), zP4, n);. 
6cc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
6cd0: 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74  n==0 ) n = sqlit
6ce0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b  e3Strlen30(zP4);
6cf0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d  .    pOp->p4.z =
6d00: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
6d10: 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29  p(p->db, zP4, n)
6d20: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
6d30: 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a  e = P4_DYNAMIC;.
6d40: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
6d50: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56  e3VdbeChangeP4(V
6d60: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
6d70: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
6d80: 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20  4, int n){.  Op 
6d90: 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20  *pOp;.  sqlite3 
6da0: 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  *db;.  assert( p
6db0: 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  !=0 );.  db = p-
6dc0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
6dd0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
6de0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
6df0: 73 65 72 74 28 20 70 2d 3e 61 4f 70 21 3d 30 20  sert( p->aOp!=0 
6e00: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
6e10: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  led );.  if( db-
6e20: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
6e30: 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56  .    if( n!=P4_V
6e40: 54 41 42 20 29 20 66 72 65 65 50 34 28 64 62 2c  TAB ) freeP4(db,
6e50: 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61   n, (void*)*(cha
6e60: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 72  r**)&zP4);.    r
6e70: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
6e80: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
6e90: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c  .  assert( addr<
6ea0: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20  p->nOp );.  if( 
6eb0: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
6ec0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
6ed0: 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d  .  }.  pOp = &p-
6ee0: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66  >aOp[addr];.  if
6ef0: 28 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70 2d 3e 70  ( n>=0 || pOp->p
6f00: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 76 64 62  4type ){.    vdb
6f10: 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 70 2c  eChangeP4Full(p,
6f20: 20 70 4f 70 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20   pOp, zP4, n);. 
6f30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6f40: 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32   if( n==P4_INT32
6f50: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a   ){.    /* Note:
6f60: 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61   this cast is sa
6f70: 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  fe, because the 
6f80: 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e  origin data poin
6f90: 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20  t was an int.   
6fa0: 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73   ** that was cas
6fb0: 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68  t to a (const ch
6fc0: 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f  ar *). */.    pO
6fd0: 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45  p->p4.i = SQLITE
6fe0: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29  _PTR_TO_INT(zP4)
6ff0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
7000: 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20  e = P4_INT32;.  
7010: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 21 3d 30  }else if( zP4!=0
7020: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7030: 6e 3c 30 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 );.    pOp->
7040: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
7050: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
7060: 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  pe = (signed cha
7070: 72 29 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  r)n;.    if( n==
7080: 50 34 5f 56 54 41 42 20 29 20 73 71 6c 69 74 65  P4_VTAB ) sqlite
7090: 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c  3VtabLock((VTabl
70a0: 65 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a 7d 0a 0a  e*)zP4);.  }.}..
70b0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
70c0: 20 50 34 20 6f 70 65 72 61 6e 64 20 6f 66 20 74   P4 operand of t
70d0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
70e0: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
70f0: 6f 6e 20 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61  on .** to the va
7100: 6c 75 65 20 64 65 66 69 6e 65 64 20 62 79 20 74  lue defined by t
7110: 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  he arguments.  T
7120: 68 69 73 20 69 73 20 61 20 68 69 67 68 2d 73 70  his is a high-sp
7130: 65 65 64 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 6f  eed.** version o
7140: 66 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  f sqlite3VdbeCha
7150: 6e 67 65 50 34 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  ngeP4()..**.** T
7160: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 6d 75  he P4 operand mu
7170: 73 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  st not have been
7180: 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 66 69   previously defi
7190: 6e 65 64 2e 20 20 41 6e 64 20 74 68 65 20 6e 65  ned.  And the ne
71a0: 77 0a 2a 2a 20 50 34 20 6d 75 73 74 20 6e 6f 74  w.** P4 must not
71b0: 20 62 65 20 50 34 5f 49 4e 54 33 32 2e 20 20 55   be P4_INT32.  U
71c0: 73 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  se sqlite3VdbeCh
71d0: 61 6e 67 65 50 34 28 29 20 69 6e 20 65 69 74 68  angeP4() in eith
71e0: 65 72 20 6f 66 0a 2a 2a 20 74 68 6f 73 65 20 63  er of.** those c
71f0: 61 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ases..*/.void sq
7200: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
7210: 34 28 56 64 62 65 20 2a 70 2c 20 76 6f 69 64 20  4(Vdbe *p, void 
7220: 2a 70 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  *pP4, int n){.  
7230: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 61  VdbeOp *pOp;.  a
7240: 73 73 65 72 74 28 20 6e 21 3d 50 34 5f 49 4e 54  ssert( n!=P4_INT
7250: 33 32 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42  32 && n!=P4_VTAB
7260: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3c   );.  assert( n<
7270: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  =0 );.  if( p->d
7280: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7290: 29 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d  ){.    freeP4(p-
72a0: 3e 64 62 2c 20 6e 2c 20 70 50 34 29 3b 0a 20 20  >db, n, pP4);.  
72b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
72c0: 74 28 20 70 50 34 21 3d 30 20 29 3b 0a 20 20 20  t( pP4!=0 );.   
72d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
72e0: 30 20 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 26  0 );.    pOp = &
72f0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
7300: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
7310: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f  p->p4type==P4_NO
7320: 54 55 53 45 44 20 29 3b 0a 20 20 20 20 70 4f 70  TUSED );.    pOp
7330: 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20  ->p4type = n;.  
7340: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 70 50    pOp->p4.p = pP
7350: 34 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  4;.  }.}../*.** 
7360: 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68  Set the P4 on th
7370: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
7380: 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20  added opcode to 
7390: 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20  the KeyInfo for 
73a0: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76  the.** index giv
73b0: 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  en..*/.void sqli
73c0: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
73d0: 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
73e0: 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
73f0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
7400: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 4b 65  rse->pVdbe;.  Ke
7410: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
7420: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
7430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
7440: 78 21 3d 30 20 29 3b 0a 20 20 70 4b 65 79 49 6e  x!=0 );.  pKeyIn
7450: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
7460: 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
7470: 65 2c 20 70 49 64 78 29 3b 0a 20 20 69 66 28 20  e, pIdx);.  if( 
7480: 70 4b 65 79 49 6e 66 6f 20 29 20 73 71 6c 69 74  pKeyInfo ) sqlit
7490: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
74a0: 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  , pKeyInfo, P4_K
74b0: 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64  EYINFO);.}..#ifd
74c0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
74d0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
74e0: 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  S./*.** Change t
74f0: 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
7500: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
7510: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
7520: 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74  n.  Or.** insert
7530: 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64   a No-op and add
7540: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20   the comment to 
7550: 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63  that new instruc
7560: 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  tion.  This.** m
7570: 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61  akes the code ea
7580: 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72  sier to read dur
7590: 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20  ing debugging.  
75a0: 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70  None of this hap
75b0: 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f  pens.** in a pro
75c0: 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a  duction build..*
75d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
75e0: 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  beVComment(Vdbe 
75f0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
7600: 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74  zFormat, va_list
7610: 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   ap){.  assert( 
7620: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
7630: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
7640: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
7650: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
7660: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
7670: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
7680: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
7690: 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nOp ){.    asser
76a0: 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20  t( p->aOp );.   
76b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
76c0: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ->db, p->aOp[p->
76d0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29  nOp-1].zComment)
76e0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ;.    p->aOp[p->
76f0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20  nOp-1].zComment 
7700: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
7710: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
7720: 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  , ap);.  }.}.voi
7730: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  d sqlite3VdbeCom
7740: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
7750: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
7760: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
7770: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29  st ap;.  if( p )
7780: 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  {.    va_start(a
7790: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
77a0: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c   vdbeVComment(p,
77b0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
77c0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
77d0: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
77e0: 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74  3VdbeNoopComment
77f0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
7800: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
7810: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
7820: 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  p;.  if( p ){.  
7830: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7840: 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(p, OP_Noop);
7850: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
7860: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
7870: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
7880: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
7890: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
78a0: 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e  }.}.#endif  /* N
78b0: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
78c0: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
78d0: 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ERAGE./*.** Set 
78e0: 74 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65  the value if the
78f0: 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20   iSrcLine field 
7900: 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
7910: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
7920: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
7930: 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65  lite3VdbeSetLine
7940: 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20  Number(Vdbe *v, 
7950: 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71  int iLine){.  sq
7960: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
7970: 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  ,-1)->iSrcLine =
7980: 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66   iLine;.}.#endif
7990: 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f   /* SQLITE_VDBE_
79a0: 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a  COVERAGE */../*.
79b0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
79c0: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
79d0: 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68   address.  If th
79e0: 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c  e address is -1,
79f0: 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20   then.** return 
7a00: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
7a10: 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64  y inserted opcod
7a20: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  e..**.** If a me
7a30: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
7a40: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
7a50: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
7a60: 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a  calling of this.
7a70: 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  ** routine, then
7a80: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
7a90: 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c  dummy VdbeOp wil
7aa0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  l be returned.  
7ab0: 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69  That opcode.** i
7ac0: 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e  s readable but n
7ad0: 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f  ot writable, tho
7ae0: 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74  ugh it is cast t
7af0: 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c  o a writable val
7b00: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ue..** The retur
7b10: 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63  n of a dummy opc
7b20: 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ode allows the c
7b30: 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  all to continue 
7b40: 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61  functioning.** a
7b50: 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  fter an OOM faul
7b60: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
7b70: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65   to check to see
7b80: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66   if the return f
7b90: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  rom .** this rou
7ba0: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20  tine is a valid 
7bb0: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65  pointer.  But be
7bc0: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e  cause the dummy.
7bd0: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20  opcode is 0,.** 
7be0: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72  dummy will never
7bf0: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
7c00: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65   This is verifie
7c10: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63  d by code inspec
7c20: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72  tion and.** by r
7c30: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67  unning with Valg
7c40: 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  rind..*/.VdbeOp 
7c50: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
7c60: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
7c70: 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73  ddr){.  /* C89 s
7c80: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68  pecifies that th
7c90: 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d  e constant "dumm
7ca0: 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69  y" will be initi
7cb0: 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20  alized to all.  
7cc0: 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20  ** zeros, which 
7cd0: 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56  is correct.  MSV
7ce0: 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61  C generates a wa
7cf0: 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c  rning, neverthel
7d00: 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ess. */.  static
7d10: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20   VdbeOp dummy;  
7d20: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53  /* Ignore the MS
7d30: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  VC warning about
7d40: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20   no initializer 
7d50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
7d60: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
7d70: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
7d80: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
7d90: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
7da0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
7db0: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
7dc0: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
7dd0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7de0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
7df0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
7e00: 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f     return (VdbeO
7e10: 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c  p*)&dummy;.  }el
7e20: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
7e30: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
7e40: 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
7e50: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45  (SQLITE_ENABLE_E
7e60: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29  XPLAIN_COMMENTS)
7e70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
7e80: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
7e90: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61  or one of the pa
7ea0: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20  rameters to the 
7eb0: 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65  opcode pOp.** de
7ec0: 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72  termined by char
7ed0: 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74  acter c..*/.stat
7ee0: 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65  ic int translate
7ef0: 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20  P(char c, const 
7f00: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20  Op *pOp){.  if( 
7f10: 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20  c=='1' ) return 
7f20: 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63  pOp->p1;.  if( c
7f30: 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70  =='2' ) return p
7f40: 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d  Op->p2;.  if( c=
7f50: 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='3' ) return pO
7f60: 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p3;.  if( c==
7f70: 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '4' ) return pOp
7f80: 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e  ->p4.i;.  return
7f90: 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a   pOp->p5;.}../*.
7fa0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
7fb0: 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d  ing for the "com
7fc0: 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61  ment" field of a
7fd0: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73   VDBE opcode lis
7fe0: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
7ff0: 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20  Synopsis: field 
8000: 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  in comments in t
8010: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
8020: 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65   file gets conve
8030: 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78  rted.** to an ex
8040: 74 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  tra string that 
8050: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
8060: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
8070: 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a  Name().  In the.
8080: 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74  ** absence of ot
8090: 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68  her comments, th
80a0: 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f  is synopsis beco
80b0: 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  mes the comment 
80c0: 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a  on the opcode..*
80d0: 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69  * Some translati
80e0: 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a  on occurs:.**.**
80f0: 20 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20         "PX"     
8100: 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20   ->  "r[X]".**  
8110: 20 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d       "PX@PY"   -
8120: 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22  >  "r[X..X+Y-1]"
8130: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
8140: 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20   is 0 or 1.**   
8150: 20 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e      "PX@PY+1" ->
8160: 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20    "r[X..X+Y]"   
8170: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
8180: 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50  is 0.**       "P
8190: 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58  Y..PY"  ->  "r[X
81a0: 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72  ..Y]"      or "r
81b0: 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a  [x]" if y<=x.*/.
81c0: 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
81d0: 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e  ayComment(.  con
81e0: 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20  st Op *pOp,     
81f0: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f  /* The opcode to
8200: 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f   be commented */
8210: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8220: 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  P4,   /* Previou
8230: 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c  sly obtained val
8240: 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63  ue for P4 */.  c
8250: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20  har *zTemp,     
8260: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
8270: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
8280: 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f  nTemp          /
8290: 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c  * Space availabl
82a0: 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a  e in zTemp[] */.
82b0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
82c0: 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  *zOpName;.  cons
82d0: 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69  t char *zSynopsi
82e0: 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65  s;.  int nOpName
82f0: 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a  ;.  int ii, jj;.
8300: 20 20 63 68 61 72 20 7a 41 6c 74 5b 35 30 5d 3b    char zAlt[50];
8310: 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c  .  zOpName = sql
8320: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
8330: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e  Op->opcode);.  n
8340: 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  OpName = sqlite3
8350: 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65  Strlen30(zOpName
8360: 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65  );.  if( zOpName
8370: 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20  [nOpName+1] ){. 
8380: 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d     int seenCom =
8390: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a   0;.    char c;.
83a0: 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20      zSynopsis = 
83b0: 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61  zOpName += nOpNa
83c0: 6d 65 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20  me + 1;.    if( 
83d0: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
83e0: 73 2c 22 49 46 20 22 2c 33 29 3d 3d 30 20 29 7b  s,"IF ",3)==0 ){
83f0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
8400: 70 35 20 26 20 53 51 4c 49 54 45 5f 53 54 4f 52  p5 & SQLITE_STOR
8410: 45 50 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73  EP2 ){.        s
8420: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8430: 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41  sizeof(zAlt), zA
8440: 6c 74 2c 20 22 72 5b 50 32 5d 20 3d 20 28 25 73  lt, "r[P2] = (%s
8450: 29 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29  )", zSynopsis+3)
8460: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8470: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8480: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
8490: 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 69 66 20  Alt), zAlt, "if 
84a0: 25 73 20 67 6f 74 6f 20 50 32 22 2c 20 7a 53 79  %s goto P2", zSy
84b0: 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20  nopsis+3);.     
84c0: 20 7d 0a 20 20 20 20 20 20 7a 53 79 6e 6f 70 73   }.      zSynops
84d0: 69 73 20 3d 20 7a 41 6c 74 3b 0a 20 20 20 20 7d  is = zAlt;.    }
84e0: 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30  .    for(ii=jj=0
84f0: 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20  ; jj<nTemp-1 && 
8500: 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69  (c = zSynopsis[i
8510: 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20  i])!=0; ii++){. 
8520: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20       if( c=='P' 
8530: 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  ){.        c = z
8540: 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a  Synopsis[++ii];.
8550: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
8560: 34 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  4' ){.          
8570: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8580: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
8590: 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b  +jj, "%s", zP4);
85a0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
85b0: 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20  f( c=='X' ){.   
85c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
85d0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
85e0: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22  , zTemp+jj, "%s"
85f0: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
8600: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65 65 6e  ;.          seen
8610: 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Com = 1;.       
8620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8630: 20 20 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73    int v1 = trans
8640: 6c 61 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20  lateP(c, pOp);. 
8650: 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b           int v2;
8660: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8670: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8680: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
8690: 22 25 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20  "%d", v1);.     
86a0: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
86b0: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
86c0: 20 22 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a   "@P", 2)==0 ){.
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
86e0: 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 3;.           
86f0: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
8700: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
8710: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 32  ;.            v2
8720: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53   = translateP(zS
8730: 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70  ynopsis[ii], pOp
8740: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
8750: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f  f( strncmp(zSyno
8760: 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32  psis+ii+1,"+1",2
8770: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8780: 20 20 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20        ii += 2;. 
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 76 32 2b               v2+
87a0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
87b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
87c0: 20 76 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20   v2>1 ){.       
87d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
87e0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
87f0: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25  , zTemp+jj, "..%
8800: 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20  d", v1+v2-1);.  
8810: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8820: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8830: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
8840: 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20  s+ii+1, "..P3", 
8850: 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33  4)==0 && pOp->p3
8860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8870: 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20     ii += 4;.    
8880: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8890: 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20  }.        jj += 
88a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
88b0: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20  zTemp+jj);.     
88c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
88d0: 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b  zTemp[jj++] = c;
88e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
88f0: 20 20 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20     if( !seenCom 
8900: 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26  && jj<nTemp-5 &&
8910: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29   pOp->zComment )
8920: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8930: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
8940: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20  j, zTemp+jj, "; 
8950: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  %s", pOp->zComme
8960: 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d  nt);.      jj +=
8970: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
8980: 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20  (zTemp+jj);.    
8990: 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65  }.    if( jj<nTe
89a0: 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d  mp ) zTemp[jj] =
89b0: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
89c0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
89d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
89e0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
89f0: 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  mp, "%s", pOp->z
8a00: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a  Comment);.    jj
8a10: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
8a20: 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c  30(zTemp);.  }el
8a30: 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d  se{.    zTemp[0]
8a40: 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30   = 0;.    jj = 0
8a50: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
8a60: 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  j;.}.#endif /* S
8a70: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
8a80: 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59  #if VDBE_DISPLAY
8a90: 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53  _P4 && defined(S
8aa0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
8ab0: 53 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a  SOR_HINTS)./*.**
8ac0: 20 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 50   Translate the P
8ad0: 34 2e 70 45 78 70 72 20 76 61 6c 75 65 20 66 6f  4.pExpr value fo
8ae0: 72 20 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69  r an OP_CursorHi
8af0: 6e 74 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74  nt opcode into t
8b00: 65 78 74 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20  ext.** that can 
8b10: 62 65 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20  be displayed in 
8b20: 74 68 65 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66  the P4 column of
8b30: 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e   EXPLAIN output.
8b40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8b50: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 53 74  displayP4Expr(St
8b60: 72 41 63 63 75 6d 20 2a 70 2c 20 45 78 70 72 20  rAccum *p, Expr 
8b70: 2a 70 45 78 70 72 29 7b 0a 20 20 63 6f 6e 73 74  *pExpr){.  const
8b80: 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a   char *zOp = 0;.
8b90: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
8ba0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
8bb0: 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20  TK_STRING:.     
8bc0: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
8bd0: 70 2c 20 22 25 51 22 2c 20 70 45 78 70 72 2d 3e  p, "%Q", pExpr->
8be0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
8bf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8c00: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
8c10: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
8c20: 66 28 70 2c 20 22 25 64 22 2c 20 70 45 78 70 72  f(p, "%d", pExpr
8c30: 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20  ->u.iValue);.   
8c40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8c50: 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20  se TK_NULL:.    
8c60: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
8c70: 28 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  (p, "NULL");.   
8c80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8c90: 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
8ca0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  {.      sqlite3X
8cb0: 50 72 69 6e 74 66 28 70 2c 20 22 72 5b 25 64 5d  Printf(p, "r[%d]
8cc0: 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ", pExpr->iTable
8cd0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8ce0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
8cf0: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
8d00: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
8d10: 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
8d20: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
8d30: 28 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20 20  (p, "rowid");.  
8d40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8d50: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
8d60: 66 28 70 2c 20 22 63 25 64 22 2c 20 28 69 6e 74  f(p, "c%d", (int
8d70: 29 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29  )pExpr->iColumn)
8d80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8d90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8da0: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20   case TK_LT:    
8db0: 20 20 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20    zOp = "LT";   
8dc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8dd0: 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a  se TK_LE:      z
8de0: 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 20  Op = "LE";      
8df0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8e00: 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70 20  TK_GT:      zOp 
8e10: 3d 20 22 47 54 22 3b 20 20 20 20 20 20 62 72 65  = "GT";      bre
8e20: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8e30: 47 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  GE:      zOp = "
8e40: 47 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  GE";      break;
8e50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
8e60: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22        zOp = "NE"
8e70: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
8e80: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20    case TK_EQ:   
8e90: 20 20 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20     zOp = "EQ";  
8ea0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8eb0: 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20  ase TK_IS:      
8ec0: 7a 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20  zOp = "IS";     
8ed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8ee0: 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70   TK_ISNOT:   zOp
8ef0: 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20 20 62 72   = "ISNOT";   br
8f00: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8f10: 5f 41 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20  _AND:     zOp = 
8f20: 22 41 4e 44 22 3b 20 20 20 20 20 62 72 65 61 6b  "AND";     break
8f30: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  ;.    case TK_OR
8f40: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52  :      zOp = "OR
8f50: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
8f60: 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
8f70: 20 20 20 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b      zOp = "ADD";
8f80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8f90: 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20  case TK_STAR:   
8fa0: 20 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20   zOp = "MUL";   
8fb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8fc0: 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f  e TK_MINUS:   zO
8fd0: 70 20 3d 20 22 53 55 42 22 3b 20 20 20 20 20 62  p = "SUB";     b
8fe0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8ff0: 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d  K_REM:     zOp =
9000: 20 22 52 45 4d 22 3b 20 20 20 20 20 62 72 65 61   "REM";     brea
9010: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
9020: 49 54 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42  ITAND:  zOp = "B
9030: 49 54 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a  ITAND";  break;.
9040: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
9050: 52 3a 20 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f  R:   zOp = "BITO
9060: 52 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  R";   break;.   
9070: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20   case TK_SLASH: 
9080: 20 20 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20 20    zOp = "DIV";  
9090: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
90a0: 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a  se TK_LSHIFT:  z
90b0: 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 20  Op = "LSHIFT";  
90c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
90d0: 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70 20  TK_RSHIFT:  zOp 
90e0: 3d 20 22 52 53 48 49 46 54 22 3b 20 20 62 72 65  = "RSHIFT";  bre
90f0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
9100: 43 4f 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22  CONCAT:  zOp = "
9110: 43 4f 4e 43 41 54 22 3b 20 20 62 72 65 61 6b 3b  CONCAT";  break;
9120: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
9130: 4e 55 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e  NUS:  zOp = "MIN
9140: 55 53 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  US";   break;.  
9150: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
9160: 20 20 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b     zOp = "PLUS";
9170: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
9180: 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20  ase TK_BITNOT:  
9190: 7a 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20  zOp = "BITNOT"; 
91a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
91b0: 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70   TK_NOT:     zOp
91c0: 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20 20 62 72   = "NOT";     br
91d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
91e0: 5f 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20  _ISNULL:  zOp = 
91f0: 22 49 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b  "ISNULL";  break
9200: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
9210: 54 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f  TNULL: zOp = "NO
9220: 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a  TNULL"; break;..
9230: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
9240: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9250: 66 28 70 2c 20 22 25 73 22 2c 20 22 65 78 70 72  f(p, "%s", "expr
9260: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
9270: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a 4f 70 20  .  }..  if( zOp 
9280: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50  ){.    sqlite3XP
9290: 72 69 6e 74 66 28 70 2c 20 22 25 73 28 22 2c 20  rintf(p, "%s(", 
92a0: 7a 4f 70 29 3b 0a 20 20 20 20 64 69 73 70 6c 61  zOp);.    displa
92b0: 79 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72  yP4Expr(p, pExpr
92c0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  ->pLeft);.    if
92d0: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
92e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
92f0: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
9300: 2c 20 22 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20  , ",", 1);.     
9310: 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 70   displayP4Expr(p
9320: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
9330: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
9340: 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
9350: 64 28 70 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  d(p, ")", 1);.  
9360: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44  }.}.#endif /* VD
9370: 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26  BE_DISPLAY_P4 &&
9380: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
9390: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
93a0: 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69 66 20 56 44  NTS) */...#if VD
93b0: 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 0a 2f 2a  BE_DISPLAY_P4./*
93c0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  .** Compute a st
93d0: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
93e0: 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d  bes the P4 param
93f0: 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f  eter for an opco
9400: 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70  de..** Use zTemp
9410: 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65   for any require
9420: 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  d temporary buff
9430: 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  er space..*/.sta
9440: 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61  tic char *displa
9450: 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61  yP4(Op *pOp, cha
9460: 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54  r *zTemp, int nT
9470: 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  emp){.  char *zP
9480: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 53 74 72  4 = zTemp;.  Str
9490: 41 63 63 75 6d 20 78 3b 0a 20 20 61 73 73 65 72  Accum x;.  asser
94a0: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
94b0: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
94c0: 6d 49 6e 69 74 28 26 78 2c 20 30 2c 20 7a 54 65  mInit(&x, 0, zTe
94d0: 6d 70 2c 20 6e 54 65 6d 70 2c 20 30 29 3b 0a 20  mp, nTemp, 0);. 
94e0: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34   switch( pOp->p4
94f0: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
9500: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20   P4_KEYINFO: {. 
9510: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
9520: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
9530: 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
9540: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73  eyInfo;.      as
9550: 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
9560: 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
9570: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
9580: 72 69 6e 74 66 28 26 78 2c 20 22 6b 28 25 64 22  rintf(&x, "k(%d"
9590: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
95a0: 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ld);.      for(j
95b0: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
95c0: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
95d0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
95e0: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
95f0: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
9600: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9610: 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70  Coll = pColl ? p
9620: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22  Coll->zName : ""
9630: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  ;.        if( st
9640: 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e  rcmp(zColl, "BIN
9650: 41 52 59 22 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c  ARY")==0 ) zColl
9660: 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20 20   = "B";.        
9670: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
9680: 78 2c 20 22 2c 25 73 25 73 22 2c 20 70 4b 65 79  x, ",%s%s", pKey
9690: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
96a0: 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20  [j] ? "-" : "", 
96b0: 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  zColl);.      }.
96c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
96d0: 41 63 63 75 6d 41 70 70 65 6e 64 28 26 78 2c 20  AccumAppend(&x, 
96e0: 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  ")", 1);.      b
96f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64  reak;.    }.#ifd
9700: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
9710: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20  _CURSOR_HINTS.  
9720: 20 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20    case P4_EXPR: 
9730: 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79 50  {.      displayP
9740: 34 45 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e 70  4Expr(&x, pOp->p
9750: 34 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  4.pExpr);.      
9760: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
9770: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
9780: 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20  COLLSEQ: {.     
9790: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
97a0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b  = pOp->p4.pColl;
97b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
97c0: 72 69 6e 74 66 28 26 78 2c 20 22 28 25 2e 32 30  rintf(&x, "(%.20
97d0: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
97e0: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
97f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9800: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
9810: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
9820: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  f = pOp->p4.pFun
9830: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
9840: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 73 28  XPrintf(&x, "%s(
9850: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
9860: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
9870: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9880: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53   }.#if defined(S
9890: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
98a0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
98b0: 46 49 4c 45 29 0a 20 20 20 20 63 61 73 65 20 50  FILE).    case P
98c0: 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20  4_FUNCCTX: {.   
98d0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
98e0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d   = pOp->p4.pCtx-
98f0: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  >pFunc;.      sq
9900: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9910: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
9920: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
9930: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
9940: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
9950: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
9960: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
9970: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 6c  3XPrintf(&x, "%l
9980: 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49  ld", *pOp->p4.pI
9990: 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  64);.      break
99a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
99b0: 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20   P4_INT32: {.   
99c0: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
99d0: 66 28 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d  f(&x, "%d", pOp-
99e0: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
99f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
9a00: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
9a10: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
9a20: 6e 74 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c  ntf(&x, "%.16g",
9a30: 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29   *pOp->p4.pReal)
9a40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9a50: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
9a60: 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65  _MEM: {.      Me
9a70: 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70  m *pMem = pOp->p
9a80: 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66  4.pMem;.      if
9a90: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
9aa0: 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  MEM_Str ){.     
9ab0: 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a     zP4 = pMem->z
9ac0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9ad0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
9ae0: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  MEM_Int ){.     
9af0: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9b00: 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 70 4d  f(&x, "%lld", pM
9b10: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20  em->u.i);.      
9b20: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
9b30: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
9b40: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9b50: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
9b60: 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e  %.16g", pMem->u.
9b70: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
9b80: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
9b90: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
9ba0: 20 20 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c        zP4 = "NUL
9bb0: 4c 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  L";.      }else{
9bc0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9bd0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
9be0: 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20  EM_Blob );.     
9bf0: 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29     zP4 = "(blob)
9c00: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
9c10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
9c20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9c30: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
9c40: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a     case P4_VTAB:
9c50: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9c60: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70  _vtab *pVtab = p
9c70: 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56  Op->p4.pVtab->pV
9c80: 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tab;.      sqlit
9c90: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 76  e3XPrintf(&x, "v
9ca0: 74 61 62 3a 25 70 22 2c 20 70 56 74 61 62 29 3b  tab:%p", pVtab);
9cb0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9cc0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
9cd0: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
9ce0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a   {.      int i;.
9cf0: 20 20 20 20 20 20 69 6e 74 20 2a 61 69 20 3d 20        int *ai = 
9d00: 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20  pOp->p4.ai;.    
9d10: 20 20 69 6e 74 20 6e 20 3d 20 61 69 5b 30 5d 3b    int n = ai[0];
9d20: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
9d30: 65 6c 65 6d 65 6e 74 20 6f 66 20 61 6e 20 49 4e  element of an IN
9d40: 54 41 52 52 41 59 20 69 73 20 61 6c 77 61 79 73  TARRAY is always
9d50: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63              ** c
9d70: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
9d80: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 74  er of elements t
9d90: 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  o follow */.    
9da0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20    for(i=1; i<n; 
9db0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
9dc0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9dd0: 20 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29 3b 0a   ",%d", ai[i]);.
9de0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
9df0: 65 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a 20 20  emp[0] = '[';.  
9e00: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
9e10: 63 75 6d 41 70 70 65 6e 64 28 26 78 2c 20 22 5d  cumAppend(&x, "]
9e20: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65  ", 1);.      bre
9e30: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9e40: 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  se P4_SUBPROGRAM
9e50: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
9e60: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 70 72  3XPrintf(&x, "pr
9e70: 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62  ogram");.      b
9e80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9e90: 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a  case P4_ADVANCE:
9ea0: 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30   {.      zTemp[0
9eb0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  ] = 0;.      bre
9ec0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9ed0: 73 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a 20  se P4_TABLE: {. 
9ee0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
9ef0: 6e 74 66 28 26 78 2c 20 22 25 73 22 2c 20 70 4f  ntf(&x, "%s", pO
9f00: 70 2d 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d  p->p4.pTab->zNam
9f10: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
9f20: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
9f30: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20  lt: {.      zP4 
9f40: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
9f50: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b     if( zP4==0 ){
9f60: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
9f70: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
9f80: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
9f90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9fa0: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
9fb0: 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 61 73 73  inish(&x);.  ass
9fc0: 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20  ert( zP4!=0 );. 
9fd0: 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23   return zP4;.}.#
9fe0: 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49  endif /* VDBE_DI
9ff0: 53 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a  SPLAY_P4 */../*.
a000: 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68  ** Declare to th
a010: 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20  e Vdbe that the 
a020: 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20  BTree object at 
a030: 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73  db->aDb[i] is us
a040: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
a050: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
a060: 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  s need to know i
a070: 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f  n advance the co
a080: 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a  mplete set of.**
a090: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
a0a0: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ses that will be
a0b0: 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66   use.  A mask of
a0c0: 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73   these databases
a0d0: 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65  .** is maintaine
a0e0: 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  d in p->btreeMas
a0f0: 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d  k.  The p->lockM
a100: 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65  ask value is the
a110: 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d   subset of.** p-
a120: 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61  >btreeMask of da
a130: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
a140: 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b  l require a lock
a150: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a160: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56  3VdbeUsesBtree(V
a170: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
a180: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
a190: 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26  & i<p->db->nDb &
a1a0: 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  & i<(int)sizeof(
a1b0: 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  yDbMask)*8 );.  
a1c0: 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73  assert( i<(int)s
a1d0: 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61  izeof(p->btreeMa
a1e0: 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73  sk)*8 );.  DbMas
a1f0: 6b 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73  kSet(p->btreeMas
a200: 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d  k, i);.  if( i!=
a210: 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  1 && sqlite3Btre
a220: 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d  eSharable(p->db-
a230: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a  >aDb[i].pBt) ){.
a240: 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d      DbMaskSet(p-
a250: 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20  >lockMask, i);. 
a260: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
a270: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
a280: 48 41 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a  HARED_CACHE)./*.
a290: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
a2a0: 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70  compiled to supp
a2b0: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
a2c0: 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20   mode and to be 
a2d0: 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74  threadsafe,.** t
a2e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61  his routine obta
a2f0: 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73  ins the mutex as
a300: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
a310: 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75  ch BtShared stru
a320: 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61  cture.** that ma
a330: 79 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79  y be accessed by
a340: 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
a350: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
a360: 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c  n doing so it al
a370: 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42  so.** sets the B
a380: 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65  tShared.db membe
a390: 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65  r of each of the
a3a0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
a3b0: 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a  ures, ensuring.*
a3c0: 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  * that the corre
a3d0: 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ct busy-handler 
a3e0: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
a3f0: 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e  ked if required.
a400: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  .**.** If SQLite
a410: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
a420: 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70  fe but does supp
a430: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
a440: 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73   mode, then.** s
a450: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
a460: 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  () is invoked to
a470: 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65   set the BtShare
a480: 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a  d.db variables.*
a490: 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68  * of all of BtSh
a4a0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20  ared structures 
a4b0: 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74  accessible via t
a4c0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
a4d0: 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  le .** associate
a4e0: 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a  d with the VM..*
a4f0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
a500: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
a510: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75   and does not su
a520: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
a530: 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a  he mode, this.**
a540: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
a550: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
a560: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65  p->btreeMask fie
a570: 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  ld is a bitmask 
a580: 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68  of all btrees th
a590: 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20  at the prepared 
a5a0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20  .** statement p 
a5b0: 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20  will ever use.  
a5c0: 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d  Let N be the num
a5d0: 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70  ber of bits in p
a5e0: 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63  ->btreeMask.** c
a5f0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
a600: 62 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20  btrees that use 
a610: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
a620: 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20  hen the runtime 
a630: 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  of.** this routi
a640: 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20  ne is N*N.  But 
a650: 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d  as N is rarely m
a660: 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73  ore than 1, this
a670: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62   should not.** b
a680: 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  e a problem..*/.
a690: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
a6a0: 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a  Enter(Vdbe *p){.
a6b0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
a6c0: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
a6d0: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
a6e0: 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  if( DbMaskAllZer
a6f0: 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29  o(p->lockMask) )
a700: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
a710: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
a720: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
a730: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20  aDb = db->aDb;. 
a740: 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a   nDb = db->nDb;.
a750: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62    for(i=0; i<nDb
a760: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
a770: 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65  i!=1 && DbMaskTe
a780: 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69  st(p->lockMask,i
a790: 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  ) && ALWAYS(aDb[
a7a0: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
a7b0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
a7c0: 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74  Enter(aDb[i].pBt
a7d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
a7e0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
a7f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a800: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
a810: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
a820: 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  FE>0./*.** Unloc
a830: 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72  k all of the btr
a840: 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  ees previously l
a850: 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20  ocked by a call 
a860: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  to sqlite3VdbeEn
a870: 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ter()..*/.static
a880: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
a890: 20 76 6f 69 64 20 76 64 62 65 4c 65 61 76 65 28   void vdbeLeave(
a8a0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
a8b0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
a8c0: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
a8d0: 6e 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70  nt nDb;.  db = p
a8e0: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
a8f0: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
a900: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
a910: 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a  0; i<nDb; i++){.
a920: 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20      if( i!=1 && 
a930: 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f  DbMaskTest(p->lo
a940: 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57  ckMask,i) && ALW
a950: 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d  AYS(aDb[i].pBt!=
a960: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
a970: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44  te3BtreeLeave(aD
a980: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d  b[i].pBt);.    }
a990: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
a9a0: 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62  te3VdbeLeave(Vdb
a9b0: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 44 62 4d  e *p){.  if( DbM
a9c0: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f  askAllZero(p->lo
a9d0: 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e  ckMask) ) return
a9e0: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
a9f0: 20 63 61 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c   case */.  vdbeL
aa00: 65 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69  eave(p);.}.#endi
aa10: 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56  f..#if defined(V
aa20: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
aa30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
aa40: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  EBUG)./*.** Prin
aa50: 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  t a single opcod
aa60: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
aa70: 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62   is used for deb
aa80: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
aa90: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
aaa0: 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f  PrintOp(FILE *pO
aab0: 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a  ut, int pc, Op *
aac0: 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  pOp){.  char *zP
aad0: 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35  4;.  char zPtr[5
aae0: 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b  0];.  char zCom[
aaf0: 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63  100];.  static c
ab00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
ab10: 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73  at1 = "%4d %-13s
ab20: 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 31   %4d %4d %4d %-1
ab30: 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20  3s %.2X %s\n";. 
ab40: 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70   if( pOut==0 ) p
ab50: 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  Out = stdout;.  
ab60: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
ab70: 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f  pOp, zPtr, sizeo
ab80: 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65 66  f(zPtr));.#ifdef
ab90: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
aba0: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
abb0: 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74    displayComment
abc0: 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c  (pOp, zP4, zCom,
abd0: 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a   sizeof(zCom));.
abe0: 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20  #else.  zCom[0] 
abf0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  = 0;.#endif.  /*
ac00: 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74 65   NB:  The sqlite
ac10: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66 75  3OpcodeName() fu
ac20: 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  nction is implem
ac30: 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63 72  ented by code cr
ac40: 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  eated.  ** by th
ac50: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
ac60: 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77  and mkopcodec.aw
ac70: 6b 20 73 63 72 69 70 74 73 20 77 68 69 63 68 20  k scripts which 
ac80: 65 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a 2a  extract the.  **
ac90: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
aca0: 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75  m the vdbe.c sou
acb0: 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66 70  rce text */.  fp
acc0: 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72  rintf(pOut, zFor
acd0: 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20  mat1, pc, .     
ace0: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
acf0: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c  me(pOp->opcode),
ad00: 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
ad10: 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c  2, pOp->p3, zP4,
ad20: 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20   pOp->p5,.      
ad30: 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75  zCom.  );.  fflu
ad40: 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64  sh(pOut);.}.#end
ad50: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  if../*.** Initia
ad60: 6c 69 7a 65 20 61 6e 20 61 72 72 61 79 20 6f 66  lize an array of
ad70: 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e 0a   N Mem element..
ad80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
ad90: 6e 69 74 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20  nitMemArray(Mem 
ada0: 2a 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c 69 74  *p, int N, sqlit
adb0: 65 33 20 2a 64 62 2c 20 75 31 36 20 66 6c 61 67  e3 *db, u16 flag
adc0: 73 29 7b 0a 20 20 77 68 69 6c 65 28 20 28 4e 2d  s){.  while( (N-
add0: 2d 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 64  -)>0 ){.    p->d
ade0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 66  b = db;.    p->f
adf0: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
ae00: 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20    p->szMalloc = 
ae10: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
ae20: 5f 44 45 42 55 47 0a 20 20 20 20 70 2d 3e 70 53  _DEBUG.    p->pS
ae30: 63 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23 65  copyFrom = 0;.#e
ae40: 6e 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a 20 20  ndif.    p++;.  
ae50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  }.}../*.** Relea
ae60: 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e  se an array of N
ae70: 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f   Mem elements.*/
ae80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
ae90: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d  easeMemArray(Mem
aea0: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69   *p, int N){.  i
aeb0: 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20  f( p && N ){.   
aec0: 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 5b   Mem *pEnd = &p[
aed0: 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  N];.    sqlite3 
aee0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  *db = p->db;.   
aef0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
af00: 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64  Freed ){.      d
af10: 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  o{.        if( p
af20: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  ->szMalloc ) sql
af30: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
af40: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
af50: 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c    }while( (++p)<
af60: 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65  pEnd );.      re
af70: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
af80: 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  do{.      assert
af90: 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20  ( (&p[1])==pEnd 
afa0: 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d  || p[0].db==p[1]
afb0: 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73  .db );.      ass
afc0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
afd0: 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e  CheckMemInvarian
afe0: 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20  ts(p) );..      
aff0: 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73  /* This block is
b000: 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e   really an inlin
b010: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
b020: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
b030: 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74  ase().      ** t
b040: 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74  hat takes advant
b050: 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20  age of the fact 
b060: 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  that the memory 
b070: 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20  cell value is . 
b080: 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65       ** being se
b090: 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20  t to NULL after 
b0a0: 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79  releasing any dy
b0b0: 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e  namic resources.
b0c0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
b0d0: 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61  ** The justifica
b0e0: 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
b0f0: 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61  ting code is tha
b100: 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a  t according to .
b110: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69        ** callgri
b120: 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20  nd, this causes 
b130: 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63  a certain test c
b140: 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43  ase to hit the C
b150: 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a  PU 4.7 .      **
b160: 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78   percent less (x
b170: 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65  86 linux, gcc ve
b180: 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36  rsion 4.1.2, -O6
b190: 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20  ) than if .     
b1a0: 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65   ** sqlite3MemRe
b1b0: 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c  lease() were cal
b1c0: 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57  led from here. W
b1d0: 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75  ith -O2, this ju
b1e0: 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  mps.      ** to 
b1f0: 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65  6.6 percent. The
b200: 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e   test case is in
b210: 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77  serting 1000 row
b220: 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a  s into a table .
b230: 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f        ** with no
b240: 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61   indexes using a
b250: 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64   single prepared
b260: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
b270: 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20  t, bind() .     
b280: 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e   ** and reset().
b290: 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f   Inserts are gro
b2a0: 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e  uped into a tran
b2b0: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
b2c0: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
b2d0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
b2e0: 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65  _Agg );.      te
b2f0: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
b300: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20   & MEM_Dyn );.  
b310: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
b320: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61  >flags & MEM_Fra
b330: 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  me );.      test
b340: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
b350: 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20   MEM_RowSet );. 
b360: 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67       if( p->flag
b370: 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44  s&(MEM_Agg|MEM_D
b380: 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d  yn|MEM_Frame|MEM
b390: 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20  _RowSet) ){.    
b3a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
b3b0: 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20  emRelease(p);.  
b3c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
b3d0: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  >szMalloc ){.   
b3e0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
b3f0: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
b400: 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  c);.        p->s
b410: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
b420: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66     }..      p->f
b430: 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
b440: 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ined;.    }while
b450: 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a  ( (++p)<pEnd );.
b460: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
b470: 65 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20  ete a VdbeFrame 
b480: 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63  object and its c
b490: 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61  ontents. VdbeFra
b4a0: 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a  me objects are.*
b4b0: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  * allocated by t
b4c0: 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70  he OP_Program op
b4d0: 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56  code in sqlite3V
b4e0: 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f  dbeExec()..*/.vo
b4f0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
b500: 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72  ameDelete(VdbeFr
b510: 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ame *p){.  int i
b520: 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20  ;.  Mem *aMem = 
b530: 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b  VdbeFrameMem(p);
b540: 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  .  VdbeCursor **
b550: 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72  apCsr = (VdbeCur
b560: 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e  sor **)&aMem[p->
b570: 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f  nChildMem];.  fo
b580: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69  r(i=0; i<p->nChi
b590: 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ldCsr; i++){.   
b5a0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
b5b0: 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43  Cursor(p->v, apC
b5c0: 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  sr[i]);.  }.  re
b5d0: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d  leaseMemArray(aM
b5e0: 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d  em, p->nChildMem
b5f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
b600: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2d  DeleteAuxData(p-
b610: 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78  >v->db, &p->pAux
b620: 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  Data, -1, 0);.  
b630: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
b640: 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23  >v->db, p);.}..#
b650: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b660: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
b670: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
b680: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
b690: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
b6a0: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
b6b0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
b6c0: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
b6d0: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
b6e0: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
b6f0: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
b700: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
b710: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
b720: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
b730: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
b740: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
b750: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
b760: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  IN"..**.** When 
b770: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65  p->explain==1, e
b780: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
b790: 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e  is listed.  When
b7a0: 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  .** p->explain==
b7b0: 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61  2, only OP_Expla
b7c0: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  in instructions 
b7d0: 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74  are listed and t
b7e0: 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77  hese.** are show
b7f0: 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n in a different
b800: 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70   format.  p->exp
b810: 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20  lain==2 is used 
b820: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
b830: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
b840: 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  AN..**.** When p
b850: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69  ->explain==1, fi
b860: 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  rst the main pro
b870: 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20  gram is listed, 
b880: 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20  then each of.** 
b890: 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70  the trigger subp
b8a0: 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74  rograms are list
b8b0: 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a  ed one by one..*
b8c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
b8d0: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8f0: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
b900: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  /.){.  int nRow;
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b930: 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75  top when row cou
b940: 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20  nt reaches this 
b950: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
b960: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
b970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b980: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
b990: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
b9a0: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
b9b0: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
b9c0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
b9d0: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
b9e0: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
ba10: 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79   cell hold array
ba20: 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a   of subprogs */.
ba30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ba40: 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
ba50: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
ba60: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ba70: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
baa0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
bab0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
bac0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
bad0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
bae0: 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  code */.  Mem *p
baf0: 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Mem = &p->aMem[1
bb00: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
bb10: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
bb20: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
bb30: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
bb40: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
bb50: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
bb60: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
bb70: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
bb80: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
bb90: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
bba0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
bbb0: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
bbc0: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
bbd0: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
bbe0: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
bbf0: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
bc00: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
bc10: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
bc20: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
bc30: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
bc40: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
bc50: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
bc60: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
bc70: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
bc80: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
bc90: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
bca0: 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74  8);.  p->pResult
bcb0: 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Set = 0;..  if( 
bcc0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
bcd0: 4d 45 4d 5f 42 4b 50 54 20 29 7b 0a 20 20 20 20  MEM_BKPT ){.    
bce0: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
bcf0: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e  if a malloc() in
bd00: 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73  side a call to s
bd10: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
bd20: 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  xt() or.    ** s
bd30: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
bd40: 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20  xt16() failed.  
bd50: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  */.    sqlite3Oo
bd60: 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20  mFault(db);.    
bd70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
bd80: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  ROR;.  }..  /* W
bd90: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
bda0: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65  f output rows re
bdb0: 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74  aches nRow, that
bdc0: 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20   means the.  ** 
bdd0: 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69  listing has fini
bde0: 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33  shed and sqlite3
bdf0: 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72  _step() should r
be00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
be10: 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20  E..  ** nRow is 
be20: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
be30: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
be40: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
be50: 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65  m, plus.  ** the
be60: 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62   sum of the numb
be70: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c  er of rows in al
be80: 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f  l trigger subpro
be90: 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65  grams encountere
bea0: 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20  d.  ** so far.  
beb0: 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77  The nRow value w
bec0: 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20  ill increase as 
bed0: 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62 70  new trigger subp
bee0: 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a  rograms are.  **
bef0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75   encountered, bu
bf00: 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65  t p->pc will eve
bf10: 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70  ntually catch up
bf20: 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20   to nRow..  */. 
bf30: 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a   nRow = p->nOp;.
bf40: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
bf50: 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==1 ){.    /* Th
bf60: 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79  e first 8 memory
bf70: 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20   cells are used 
bf80: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
bf90: 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a  et.  So we will.
bfa0: 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65      ** commandee
bfb0: 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74  r the 9th cell t
bfc0: 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67 65  o use as storage
bfd0: 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66   for an array of
bfe0: 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a   pointers.    **
bff0: 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62 70   to trigger subp
c000: 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44  rograms.  The VD
c010: 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  BE is guaranteed
c020: 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73   to have at leas
c030: 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73  t 9.    ** cells
c040: 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
c050: 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20  ( p->nMem>9 );. 
c060: 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d     pSub = &p->aM
c070: 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70  em[9];.    if( p
c080: 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42  Sub->flags&MEM_B
c090: 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lob ){.      /* 
c0a0: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  On the first cal
c0b0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  l to sqlite3_ste
c0c0: 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68  p(), pSub will h
c0d0: 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20  old a NULL.  It 
c0e0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74  is.      ** init
c0f0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f  ialized to a BLO
c100: 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42 50  B by the P4_SUBP
c110: 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e  ROGRAM processin
c120: 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f  g logic below */
c130: 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53  .      nSub = pS
c140: 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62  ub->n/sizeof(Vdb
c150: 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62  e*);.      apSub
c160: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
c170: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d  *)pSub->z;.    }
c180: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
c190: 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSub; i++){.    
c1a0: 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b    nRow += apSub[
c1b0: 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20  i]->nOp;.    }. 
c1c0: 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20   }..  do{.    i 
c1d0: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
c1e0: 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70  ile( i<nRow && p
c1f0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20  ->explain==2 && 
c200: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
c210: 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a  !=OP_Explain );.
c220: 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b    if( i>=nRow ){
c230: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
c240: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
c250: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
c260: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31  }else if( db->u1
c270: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29  .isInterrupted )
c280: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
c290: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
c2a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c2b0: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
c2c0: 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 73  e3VdbeError(p, s
c2d0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
c2e0: 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rc));.  }else{. 
c2f0: 20 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20     char *zP4;.  
c300: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69    Op *pOp;.    i
c310: 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20  f( i<p->nOp ){. 
c320: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70       /* The outp
c330: 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  ut line number i
c340: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74  s small enough t
c350: 68 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c  hat we are still
c360: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
c370: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a   main program. *
c380: 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70  /.      pOp = &p
c390: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65  ->aOp[i];.    }e
c3a0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65  lse{.      /* We
c3b0: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c   are currently l
c3c0: 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61  isting subprogra
c3d0: 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20  ms.  Figure out 
c3e0: 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20  which one and.  
c3f0: 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74      ** pick up t
c400: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f  he appropriate o
c410: 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20  pcode. */.      
c420: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d  int j;.      i -
c430: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  = p->nOp;.      
c440: 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75  for(j=0; i>=apSu
c450: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b  b[j]->nOp; j++){
c460: 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70  .        i -= ap
c470: 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[j]->nOp;.   
c480: 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d     }.      pOp =
c490: 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b   &apSub[j]->aOp[
c4a0: 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i];.    }.    if
c4b0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
c4c0: 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ){.      pMem->f
c4d0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
c4e0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
c4f0: 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  = i;            
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63      /* Program c
c520: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
c530: 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20  pMem++;.  .     
c540: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
c550: 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74  EM_Static|MEM_St
c560: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
c570: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
c580: 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  r*)sqlite3Opcode
c590: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
c5a0: 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a  ); /* Opcode */.
c5b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
c5c0: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
c5d0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
c5e0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
c5f0: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
c600: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
c610: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
c620: 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  +;..      /* Whe
c630: 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20  n an OP_Program 
c640: 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e  opcode is encoun
c650: 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70  ter (the only op
c660: 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20  code that has.  
c670: 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50      ** a P4_SUBP
c680: 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29  ROGRAM argument)
c690: 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a  , expand the siz
c6a0: 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f  e of the array o
c6b0: 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20  f subprograms.  
c6c0: 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70      ** kept in p
c6d0: 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68  ->aMem[9].z to h
c6e0: 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67  old the new prog
c6f0: 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74  ram - assuming t
c700: 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20  his subprogram. 
c710: 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20       ** has not 
c720: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65  already been see
c730: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
c740: 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70    if( pOp->p4typ
c750: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
c760: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
c770: 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29  nByte = (nSub+1)
c780: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72  *sizeof(SubProgr
c790: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  am*);.        in
c7a0: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
c7b0: 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b  (j=0; j<nSub; j+
c7c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
c7d0: 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d  ( apSub[j]==pOp-
c7e0: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
c7f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
c800: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e          if( j==n
c810: 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  Sub && SQLITE_OK
c820: 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ==sqlite3VdbeMem
c830: 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65  Grow(pSub, nByte
c840: 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20 20  , nSub!=0) ){.  
c850: 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20          apSub = 
c860: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
c870: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20  Sub->z;.        
c880: 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20    apSub[nSub++] 
c890: 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  = pOp->p4.pProgr
c8a0: 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  am;.          pS
c8b0: 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d  ub->flags |= MEM
c8c0: 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20  _Blob;.         
c8d0: 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a   pSub->n = nSub*
c8e0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
c8f0: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  m*);.        }. 
c900: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
c910: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
c920: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
c930: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
c940: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
c960: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a   */.    pMem++;.
c970: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
c980: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
c990: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
c9a0: 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p2;            
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c9c0: 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b   P2 */.    pMem+
c9d0: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
c9e0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
c9f0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
ca00: 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20  Op->p3;         
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d   /* P3 */.    pM
ca30: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73  em++;..    if( s
ca40: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
ca50: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
ca60: 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34 20  , 100) ){ /* P4 
ca70: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
ca80: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
ca90: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
caa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
cab0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  R;.    }.    pMe
cac0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
cad0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
cae0: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
caf0: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70  (pOp, pMem->z, p
cb00: 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a  Mem->szMalloc);.
cb10: 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65      if( zP4!=pMe
cb20: 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 70 4d  m->z ){.      pM
cb30: 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  em->n = 0;.     
cb40: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
cb50: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c  etStr(pMem, zP4,
cb60: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
cb70: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
cb80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cb90: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
cba0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
cbb0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
cbc0: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
cbd0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
cbe0: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
cbf0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
cc00: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
cc10: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
cc20: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
cc30: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34  ndResize(pMem, 4
cc40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
cc50: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
cc60: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
cc70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
cc80: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
cc90: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
cca0: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
ccb0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
ccc0: 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20  m->n = 2;.      
ccd0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
cce0: 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e  (3, pMem->z, "%.
ccf0: 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20  2x", pOp->p5);  
cd00: 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20   /* P5 */.      
cd10: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
cd20: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
cd30: 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66  Mem++;.  .#ifdef
cd40: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
cd50: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
cd60: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
cd70: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
cd80: 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30  Resize(pMem, 500
cd90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
cda0: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
cdb0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
cdc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
cdd0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
cde0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
cdf0: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
ce00: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
ce10: 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f  m->n = displayCo
ce20: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
ce30: 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20  pMem->z, 500);. 
ce40: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
ce50: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
ce60: 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  lse.      pMem->
ce70: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
ce80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ce90: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65          /* Comme
cea0: 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  nt */.#endif.   
ceb0: 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43   }..    p->nResC
cec0: 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70  olumn = 8 - 4*(p
ced0: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
cee0: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
cef0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20  = &p->aMem[1];. 
cf00: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
cf10: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
cf20: 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20  QLITE_ROW;.  }. 
cf30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
cf40: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
cf50: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
cf60: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
cf70: 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
cf80: 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73  the SQL that was
cf90: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
cfa0: 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  e a VDBE program
cfb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
cfc0: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64  3VdbePrintSql(Vd
cfd0: 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20  be *p){.  const 
cfe0: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69  char *z = 0;.  i
cff0: 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20  f( p->zSql ){.  
d000: 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20    z = p->zSql;. 
d010: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f   }else if( p->nO
d020: 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73  p>=1 ){.    cons
d030: 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20  t VdbeOp *pOp = 
d040: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20  &p->aOp[0];.    
d050: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
d060: 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d  =OP_Init && pOp-
d070: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
d080: 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b    z = pOp->p4.z;
d090: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71  .      while( sq
d0a0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29  lite3Isspace(*z)
d0b0: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) z++;.    }.  
d0c0: 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e  }.  if( z ) prin
d0d0: 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  tf("SQL: [%s]\n"
d0e0: 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  , z);.}.#endif..
d0f0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
d100: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
d110: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
d120: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
d130: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e  )./*.** Print an
d140: 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65   IOTRACE message
d150: 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e   showing SQL con
d160: 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tent..*/.void sq
d170: 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65  lite3VdbeIOTrace
d180: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
d190: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
d1a0: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
d1b0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f  .  if( sqlite3Io
d1c0: 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Trace==0 ) retur
d1d0: 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29  n;.  if( nOp<1 )
d1e0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
d1f0: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69   &p->aOp[0];.  i
d200: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
d210: 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e  OP_Init && pOp->
d220: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69  p4.z!=0 ){.    i
d230: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61  nt i, j;.    cha
d240: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73  r z[1000];.    s
d250: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
d260: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
d270: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  s", pOp->p4.z);.
d280: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c      for(i=0; sql
d290: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
d2a0: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f  ); i++){}.    fo
d2b0: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(j=0; z[i]; i++
d2c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
d2d0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
d2e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
d2f0: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
d300: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
d310: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
d320: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
d330: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
d340: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
d350: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
d360: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54  ;.    sqlite3IoT
d370: 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c  race("SQL %s\n",
d380: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
d390: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
d3a0: 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54  T_TRACE && SQLIT
d3b0: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
d3c0: 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61   */../* An insta
d3d0: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
d3e0: 63 74 20 64 65 73 63 72 69 62 65 73 20 62 75 6c  ct describes bul
d3f0: 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62  k memory availab
d400: 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20 62 79  le for use.** by
d410: 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f   subcomponents o
d420: 66 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  f a prepared sta
d430: 74 65 6d 65 6e 74 2e 20 20 53 70 61 63 65 20 69  tement.  Space i
d440: 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 75 74 0a  s allocated out.
d450: 2a 2a 20 6f 66 20 61 20 52 65 75 73 61 62 6c 65  ** of a Reusable
d460: 53 70 61 63 65 20 6f 62 6a 65 63 74 20 62 79 20  Space object by 
d470: 74 68 65 20 61 6c 6c 6f 63 53 70 61 63 65 28 29  the allocSpace()
d480: 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77 2e 0a   routine below..
d490: 2a 2f 0a 73 74 72 75 63 74 20 52 65 75 73 61 62  */.struct Reusab
d4a0: 6c 65 53 70 61 63 65 20 7b 0a 20 20 75 38 20 2a  leSpace {.  u8 *
d4b0: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
d4c0: 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d 65   /* Available me
d4d0: 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  mory */.  int nF
d4e0: 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ree;           /
d4f0: 2a 20 42 79 74 65 73 20 6f 66 20 61 76 61 69 6c  * Bytes of avail
d500: 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  able memory */. 
d510: 20 69 6e 74 20 6e 4e 65 65 64 65 64 3b 20 20 20   int nNeeded;   
d520: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 62        /* Total b
d530: 79 74 65 73 20 74 68 61 74 20 63 6f 75 6c 64 20  ytes that could 
d540: 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  not be allocated
d550: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74   */.};../* Try t
d560: 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  o allocate nByte
d570: 20 62 79 74 65 73 20 6f 66 20 38 2d 62 79 74 65   bytes of 8-byte
d580: 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b 20 6d 65   aligned bulk me
d590: 6d 6f 72 79 20 66 6f 72 20 70 42 75 66 0a 2a 2a  mory for pBuf.**
d5a0: 20 66 72 6f 6d 20 74 68 65 20 52 65 75 73 61 62   from the Reusab
d5b0: 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2e 20  leSpace object. 
d5c0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
d5d0: 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
d5e0: 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20  ed.** memory on 
d5f0: 73 75 63 63 65 73 73 2e 20 20 49 66 20 69 6e 73  success.  If ins
d600: 75 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f 72 79  ufficient memory
d610: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
d620: 20 74 68 65 0a 2a 2a 20 52 65 75 73 61 62 6c 65   the.** Reusable
d630: 53 70 61 63 65 20 6f 62 6a 65 63 74 2c 20 69 6e  Space object, in
d640: 63 72 65 61 73 65 20 74 68 65 20 52 65 75 73 61  crease the Reusa
d650: 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65 64 65 64  bleSpace.nNeeded
d660: 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20 74 68 65  .** value by the
d670: 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65 64 20 61   amount needed a
d680: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  nd return NULL..
d690: 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66 20 69 73  **.** If pBuf is
d6a0: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20 4e   not initially N
d6b0: 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ULL, that means 
d6c0: 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  that the memory 
d6d0: 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
d6e0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  een allocated by
d6f0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
d700: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 73   this routine, s
d710: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 20  o just return a 
d720: 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 75 66 20  copy.** of pBuf 
d730: 61 6e 64 20 6c 65 61 76 65 20 52 65 75 73 61 62  and leave Reusab
d740: 6c 65 53 70 61 63 65 20 75 6e 63 68 61 6e 67 65  leSpace unchange
d750: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 6c  d..**.** This al
d760: 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d 70 6c 6f  locator is emplo
d770: 79 65 64 20 74 6f 20 72 65 70 75 72 70 6f 73 65  yed to repurpose
d780: 20 75 6e 75 73 65 64 20 73 6c 6f 74 73 20 61 74   unused slots at
d790: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
d7a0: 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  ** opcode array 
d7b0: 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61 74  of prepared stat
d7c0: 65 20 66 6f 72 20 6f 74 68 65 72 20 6d 65 6d 6f  e for other memo
d7d0: 72 79 20 6e 65 65 64 73 20 6f 66 20 74 68 65 20  ry needs of the 
d7e0: 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74  prepared.** stat
d7f0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
d800: 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63   void *allocSpac
d810: 65 28 0a 20 20 73 74 72 75 63 74 20 52 65 75 73  e(.  struct Reus
d820: 61 62 6c 65 53 70 61 63 65 20 2a 70 2c 20 20 2f  ableSpace *p,  /
d830: 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76  * Bulk memory av
d840: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f  ailable for allo
d850: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  cation */.  void
d860: 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
d870: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
d880: 20 74 6f 20 61 20 70 72 69 6f 72 20 61 6c 6c 6f   to a prior allo
d890: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  cation */.  int 
d8a0: 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20  nByte           
d8b0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
d8c0: 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 20  f memory needed 
d8d0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
d8e0: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
d8f0: 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63 65 29 20  MENT(p->pSpace) 
d900: 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30  );.  if( pBuf==0
d910: 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
d920: 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20  ROUND8(nByte);. 
d930: 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c 3d 20     if( nByte <= 
d940: 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  p->nFree ){.    
d950: 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42    p->nFree -= nB
d960: 79 74 65 3b 0a 20 20 20 20 20 20 70 42 75 66 20  yte;.      pBuf 
d970: 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b 70 2d 3e  = &p->pSpace[p->
d980: 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d 65 6c 73  nFree];.    }els
d990: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4e 65 65  e{.      p->nNee
d9a0: 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  ded += nByte;.  
d9b0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
d9c0: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
d9d0: 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29 3b 0a  GNMENT(pBuf) );.
d9e0: 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d    return pBuf;.}
d9f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74  ../*.** Rewind t
da00: 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20  he VDBE back to 
da10: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e  the beginning in
da20: 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72   preparation for
da30: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a  .** running it..
da40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
da50: 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a  dbeRewind(Vdbe *
da60: 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  p){.#if defined(
da70: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
da80: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
da90: 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a  OFILE).  int i;.
daa0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
dab0: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
dac0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
dad0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 7c 7c 20  E_MAGIC_INIT || 
dae0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
daf0: 41 47 49 43 5f 52 45 53 45 54 20 29 3b 0a 0a 20  AGIC_RESET );.. 
db00: 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64   /* There should
db10: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
db20: 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20   opcode..  */.  
db30: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
db40: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
db50: 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f  e magic to VDBE_
db60: 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72  MAGIC_RUN sooner
db70: 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
db80: 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69  er. */.  p->magi
db90: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
dba0: 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  UN;..#ifdef SQLI
dbb0: 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69  TE_DEBUG.  for(i
dbc0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69  =0; i<p->nMem; i
dbd0: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
dbe0: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d   p->aMem[i].db==
dbf0: 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e  p->db );.  }.#en
dc00: 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31  dif.  p->pc = -1
dc10: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
dc20: 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f  TE_OK;.  p->erro
dc30: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
dc40: 72 74 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65  rt;.  p->nChange
dc50: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
dc60: 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69  Ctr = 1;.  p->mi
dc70: 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74  nWriteFileFormat
dc80: 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74   = 255;.  p->iSt
dc90: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70  atement = 0;.  p
dca0: 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20  ->nFkConstraint 
dcb0: 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45  = 0;.#ifdef VDBE
dcc0: 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69  _PROFILE.  for(i
dcd0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
dce0: 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69  +){.    p->aOp[i
dcf0: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  ].cnt = 0;.    p
dd00: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20  ->aOp[i].cycles 
dd10: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
dd20: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
dd30: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
dd40: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
dd50: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
dd60: 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65  ime after.** cre
dd70: 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61  ating the virtua
dd80: 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73  l machine.  This
dd90: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73   involves things
dda0: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f   such.** as allo
ddb0: 63 61 74 69 6e 67 20 72 65 67 69 73 74 65 72 73  cating registers
ddc0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
ddd0: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
dde0: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
ddf0: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
de00: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
de10: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
de20: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
de30: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
de40: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
de50: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
de60: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78  may be called ex
de70: 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61  actly once on ea
de80: 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ch virtual machi
de90: 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  ne..** After thi
dea0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
deb0: 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  led the VM has b
dec0: 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61  een "packaged" a
ded0: 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74  nd is ready.** t
dee0: 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68  o run.  After th
def0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
df00: 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63 61  lled, further ca
df10: 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  lls to .** sqlit
df20: 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75  e3VdbeAddOp() fu
df30: 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68  nctions are proh
df40: 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f  ibited.  This ro
df50: 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74  utine disconnect
df60: 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72  s.** the Vdbe fr
df70: 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  om the Parse obj
df80: 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20  ect that helped 
df90: 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74  generate it so t
dfa0: 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56  hat the.** the V
dfb0: 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69  dbe becomes an i
dfc0: 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74  ndependent entit
dfd0: 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20  y and the Parse 
dfe0: 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a  object can be.**
dff0: 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a   destroyed..**.*
e000: 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65  * Use the sqlite
e010: 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72  3VdbeRewind() pr
e020: 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f  ocedure to resto
e030: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
e040: 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  hine back.** to 
e050: 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74  its initial stat
e060: 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62  e after it has b
e070: 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64  een run..*/.void
e080: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
e090: 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70  Ready(.  Vdbe *p
e0a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e0b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
e0c0: 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  DBE */.  Parse *
e0d0: 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20  pParse          
e0e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e0f0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  ng context */.){
e100: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
e130: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
e140: 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20    int nVar;     
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e160: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
e170: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e  rameters */.  in
e180: 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  t nMem;         
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e1a0: 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d  Number of VM mem
e1b0: 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f  ory registers */
e1c0: 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20  .  int nCursor; 
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
e1f0: 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20  ursors required 
e200: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  */.  int nArg;  
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e220: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e230: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75   arguments in su
e240: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
e250: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e270: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
e280: 0a 20 20 73 74 72 75 63 74 20 52 65 75 73 61 62  .  struct Reusab
e290: 6c 65 53 70 61 63 65 20 78 3b 20 20 20 20 20 20  leSpace x;      
e2a0: 20 20 2f 2a 20 52 65 75 73 61 62 6c 65 20 62 75    /* Reusable bu
e2b0: 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20  lk memory */..  
e2c0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
e2d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
e2e0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
e2f0: 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
e300: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
e310: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
e320: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
e330: 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20  arse==p->pParse 
e340: 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
e350: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
e360: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
e370: 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73  ;.  nVar = pPars
e380: 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20  e->nVar;.  nMem 
e390: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
e3a0: 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72    nCursor = pPar
e3b0: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67  se->nTab;.  nArg
e3c0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41   = pParse->nMaxA
e3d0: 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 45 61 63 68  rg;.  .  /* Each
e3e0: 20 63 75 72 73 6f 72 20 75 73 65 73 20 61 20 6d   cursor uses a m
e3f0: 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20 54 68 65  emory cell.  The
e400: 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 28 63   first cursor (c
e410: 75 72 73 6f 72 20 30 29 20 63 61 6e 0a 20 20 2a  ursor 0) can.  *
e420: 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d 20 77 68  * use aMem[0] wh
e430: 69 63 68 20 69 73 20 6e 6f 74 20 6f 74 68 65 72  ich is not other
e440: 77 69 73 65 20 75 73 65 64 20 62 79 20 74 68 65  wise used by the
e450: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20   VDBE program.  
e460: 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70  Allocate.  ** sp
e470: 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
e480: 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20 63 75 72  f aMem[] for cur
e490: 73 6f 72 73 20 31 20 61 6e 64 20 67 72 65 61 74  sors 1 and great
e4a0: 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73  er..  ** See als
e4b0: 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f  o: allocateCurso
e4c0: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d  r()..  */.  nMem
e4d0: 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 69   += nCursor;.  i
e4e0: 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30 20 26 26  f( nCursor==0 &&
e4f0: 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b   nMem>0 ) nMem++
e500: 3b 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20  ;  /* Space for 
e510: 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20 69 66 20  aMem[0] even if 
e520: 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f  not used */..  /
e530: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
e540: 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65 20 6d   much reusable m
e550: 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62  emory is availab
e560: 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  le at the end of
e570: 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65   the.  ** opcode
e580: 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 65 78   array.  This ex
e590: 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  tra memory will 
e5a0: 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 66  be reallocated f
e5b0: 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74  or other element
e5c0: 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72  s.  ** of the pr
e5d0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
e5e0: 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55  ..  */.  n = ROU
e5f0: 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70  ND8(sizeof(Op)*p
e600: 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 20 20  ->nOp);         
e610: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
e620: 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75   opcode memory u
e630: 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63  sed */.  x.pSpac
e640: 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f  e = &((u8*)p->aO
e650: 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 20  p)[n];          
e660: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f       /* Unused o
e670: 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  pcode memory */.
e680: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
e690: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78  BYTE_ALIGNMENT(x
e6a0: 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 78 2e  .pSpace) );.  x.
e6b0: 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57  nFree = ROUNDDOW
e6c0: 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41  N8(pParse->szOpA
e6d0: 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42  lloc - n);  /* B
e6e0: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 6d  ytes of unused m
e6f0: 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72  emory */.  asser
e700: 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b  t( x.nFree>=0 );
e710: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
e720: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
e730: 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e 46 72 65  &x.pSpace[x.nFre
e740: 65 5d 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76  e]) );..  resolv
e750: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41  eP2Values(p, &nA
e760: 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74  rg);.  p->usesSt
e770: 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  mtJournal = (u8)
e780: 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69  (pParse->isMulti
e790: 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d  Write && pParse-
e7a0: 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66  >mayAbort);.  if
e7b0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
e7c0: 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a  n && nMem<10 ){.
e7d0: 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20      nMem = 10;. 
e7e0: 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20   }.  p->expired 
e7f0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72  = 0;..  /* Memor
e800: 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c  y for registers,
e810: 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72   parameters, cur
e820: 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c  sor, etc, is all
e830: 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72  ocated in one or
e840: 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73   two.  ** passes
e850: 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  .  On the first 
e860: 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20  pass, we try to 
e870: 72 65 75 73 65 20 75 6e 75 73 65 64 20 6d 65 6d  reuse unused mem
e880: 6f 72 79 20 61 74 20 74 68 65 20 0a 20 20 2a 2a  ory at the .  **
e890: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
e8a0: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
e8b0: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
e8c0: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
e8d0: 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65  y.  ** requireme
e8e0: 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74  nts by reusing t
e8f0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
e900: 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73  tail, then the s
e910: 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20  econd.  ** pass 
e920: 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65  will fill in the
e930: 20 72 65 6d 61 69 6e 64 65 72 20 75 73 69 6e 67   remainder using
e940: 20 61 20 66 72 65 73 68 20 6d 65 6d 6f 72 79 20   a fresh memory 
e950: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20  allocation.  .  
e960: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f  **.  ** This two
e970: 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74  -pass approach t
e980: 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75  hat reuses as mu
e990: 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
e9a0: 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20  sible from.  ** 
e9b0: 74 68 65 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d  the leftover mem
e9c0: 6f 72 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ory at the end o
e9d0: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
e9e0: 61 79 2e 20 20 54 68 69 73 20 63 61 6e 20 73 69  ay.  This can si
e9f0: 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
ea00: 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75   reduce the amou
ea10: 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c  nt of memory hel
ea20: 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20  d by a prepared 
ea30: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
ea40: 20 20 64 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e 65    do {.    x.nNe
ea50: 65 64 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 2d  eded = 0;.    p-
ea60: 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61  >aMem = allocSpa
ea70: 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20  ce(&x, p->aMem, 
ea80: 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
ea90: 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d  );.    p->aVar =
eaa0: 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
eab0: 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69  p->aVar, nVar*si
eac0: 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20  zeof(Mem));.    
ead0: 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63  p->apArg = alloc
eae0: 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 41  Space(&x, p->apA
eaf0: 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28  rg, nArg*sizeof(
eb00: 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 70 2d 3e 61  Mem*));.    p->a
eb10: 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pCsr = allocSpac
eb20: 65 28 26 78 2c 20 70 2d 3e 61 70 43 73 72 2c 20  e(&x, p->apCsr, 
eb30: 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56  nCursor*sizeof(V
eb40: 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69  dbeCursor*));.#i
eb50: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
eb60: 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
eb70: 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65 63  US.    p->anExec
eb80: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
eb90: 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e  , p->anExec, p->
eba0: 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29  nOp*sizeof(i64))
ebb0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
ebc0: 20 78 2e 6e 4e 65 65 64 65 64 3d 3d 30 20 29 20   x.nNeeded==0 ) 
ebd0: 62 72 65 61 6b 3b 0a 20 20 20 20 78 2e 70 53 70  break;.    x.pSp
ebe0: 61 63 65 20 3d 20 70 2d 3e 70 46 72 65 65 20 3d  ace = p->pFree =
ebf0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
ec00: 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65 65  RawNN(db, x.nNee
ec10: 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72 65  ded);.    x.nFre
ec20: 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a 20  e = x.nNeeded;. 
ec30: 20 7d 77 68 69 6c 65 28 20 21 64 62 2d 3e 6d 61   }while( !db->ma
ec40: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
ec50: 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72   p->nzVar = pPar
ec60: 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 70 2d 3e  se->nzVar;.  p->
ec70: 61 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e  azVar = pParse->
ec80: 61 7a 56 61 72 3b 0a 20 20 70 50 61 72 73 65 2d  azVar;.  pParse-
ec90: 3e 6e 7a 56 61 72 20 3d 20 20 30 3b 0a 20 20 70  >nzVar =  0;.  p
eca0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 30  Parse->azVar = 0
ecb0: 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d  ;.  p->explain =
ecc0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
ecd0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
ece0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
ecf0: 70 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 20  p->nVar = 0;.   
ed00: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30 3b   p->nCursor = 0;
ed10: 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30  .    p->nMem = 0
ed20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
ed30: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72  ->nCursor = nCur
ed40: 73 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e 56 61 72  sor;.    p->nVar
ed50: 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a   = (ynVar)nVar;.
ed60: 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79      initMemArray
ed70: 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2c 20  (p->aVar, nVar, 
ed80: 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  db, MEM_Null);. 
ed90: 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65     p->nMem = nMe
eda0: 6d 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72  m;.    initMemAr
edb0: 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65  ray(p->aMem, nMe
edc0: 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e 64 65 66  m, db, MEM_Undef
edd0: 69 6e 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ined);.    memse
ede0: 74 28 70 2d 3e 61 70 43 73 72 2c 20 30 2c 20 6e  t(p->apCsr, 0, n
edf0: 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64  Cursor*sizeof(Vd
ee00: 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66  beCursor*));.#if
ee10: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ee20: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
ee30: 53 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e  S.    memset(p->
ee40: 61 6e 45 78 65 63 2c 20 30 2c 20 70 2d 3e 6e 4f  anExec, 0, p->nO
ee50: 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a  p*sizeof(i64));.
ee60: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
ee70: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 70  ite3VdbeRewind(p
ee80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
ee90: 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20  e a VDBE cursor 
eea0: 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20  and release all 
eeb0: 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68  the resources th
eec0: 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61  at cursor .** ha
eed0: 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a  ppens to hold..*
eee0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
eef0: 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62  beFreeCursor(Vdb
ef00: 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72  e *p, VdbeCursor
ef10: 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43   *pCx){.  if( pC
ef20: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x==0 ){.    retu
ef30: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
ef40: 28 20 70 43 78 2d 3e 70 42 74 3d 3d 30 20 7c 7c  ( pCx->pBt==0 ||
ef50: 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d   pCx->eCurType==
ef60: 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
ef70: 0a 20 20 73 77 69 74 63 68 28 20 70 43 78 2d 3e  .  switch( pCx->
ef80: 65 43 75 72 54 79 70 65 20 29 7b 0a 20 20 20 20  eCurType ){.    
ef90: 63 61 73 65 20 43 55 52 54 59 50 45 5f 53 4f 52  case CURTYPE_SOR
efa0: 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
efb0: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c  ite3VdbeSorterCl
efc0: 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b  ose(p->db, pCx);
efd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
efe0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 43 55 52    }.    case CUR
eff0: 54 59 50 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20  TYPE_BTREE: {.  
f000: 20 20 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74      if( pCx->pBt
f010: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f020: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
f030: 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 20  x->pBt);.       
f040: 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75   /* The pCx->pCu
f050: 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f  rsor will be clo
f060: 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  se automatically
f070: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20  , if it exists, 
f080: 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  by.        ** th
f090: 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f  e call above. */
f0a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f0b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
f0c0: 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30  x->uc.pCursor!=0
f0d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
f0e0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
f0f0: 73 6f 72 28 70 43 78 2d 3e 75 63 2e 70 43 75 72  sor(pCx->uc.pCur
f100: 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
f110: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f120: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f130: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
f140: 45 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59  E.    case CURTY
f150: 50 45 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20  PE_VTAB: {.     
f160: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
f170: 72 73 6f 72 20 2a 70 56 43 75 72 20 3d 20 70 43  rsor *pVCur = pC
f180: 78 2d 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20 20  x->uc.pVCur;.   
f190: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
f1a0: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
f1b0: 20 3d 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d   = pVCur->pVtab-
f1c0: 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20  >pModule;.      
f1d0: 61 73 73 65 72 74 28 20 70 56 43 75 72 2d 3e 70  assert( pVCur->p
f1e0: 56 74 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Vtab->nRef>0 );.
f1f0: 20 20 20 20 20 20 70 56 43 75 72 2d 3e 70 56 74        pVCur->pVt
f200: 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  ab->nRef--;.    
f210: 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73    pModule->xClos
f220: 65 28 70 56 43 75 72 29 3b 0a 20 20 20 20 20 20  e(pVCur);.      
f230: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
f240: 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
f250: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
f260: 72 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  rs in the curren
f270: 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  t frame..*/.stat
f280: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72  ic void closeCur
f290: 73 6f 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65  sorsInFrame(Vdbe
f2a0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61   *p){.  if( p->a
f2b0: 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  pCsr ){.    int 
f2c0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
f2d0: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
f2e0: 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75  +){.      VdbeCu
f2f0: 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70  rsor *pC = p->ap
f300: 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Csr[i];.      if
f310: 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pC ){.        
f320: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
f330: 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20  ursor(p, pC);.  
f340: 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69        p->apCsr[i
f350: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
f360: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
f370: 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65  * Copy the value
f380: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
f390: 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74  VdbeFrame struct
f3a0: 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e  ure to its Vdbe.
f3b0: 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64   This.** is used
f3c0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
f3d0: 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75  hen a trigger su
f3e0: 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c  b-program is hal
f3f0: 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a  ted to restore.*
f400: 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65  * control to the
f410: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a   main program..*
f420: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
f430: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64  eFrameRestore(Vd
f440: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29  beFrame *pFrame)
f450: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46  {.  Vdbe *v = pF
f460: 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65  rame->v;.  close
f470: 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76  CursorsInFrame(v
f480: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
f490: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
f4a0: 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45  NSTATUS.  v->anE
f4b0: 78 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e  xec = pFrame->an
f4c0: 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76  Exec;.#endif.  v
f4d0: 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->aOp = pFrame->
f4e0: 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20  aOp;.  v->nOp = 
f4f0: 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76  pFrame->nOp;.  v
f500: 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->aMem = pFrame-
f510: 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d  >aMem;.  v->nMem
f520: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b   = pFrame->nMem;
f530: 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46  .  v->apCsr = pF
f540: 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76  rame->apCsr;.  v
f550: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61  ->nCursor = pFra
f560: 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76  me->nCursor;.  v
f570: 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20  ->db->lastRowid 
f580: 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f  = pFrame->lastRo
f590: 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67  wid;.  v->nChang
f5a0: 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61  e = pFrame->nCha
f5b0: 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43  nge;.  v->db->nC
f5c0: 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e  hange = pFrame->
f5d0: 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c  nDbChange;.  sql
f5e0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
f5f0: 78 44 61 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d  xData(v->db, &v-
f600: 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30  >pAuxData, -1, 0
f610: 29 3b 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61  );.  v->pAuxData
f620: 20 3d 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44   = pFrame->pAuxD
f630: 61 74 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70  ata;.  pFrame->p
f640: 41 75 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72  AuxData = 0;.  r
f650: 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63  eturn pFrame->pc
f660: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
f670: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a   all cursors..**
f680: 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65  .** Also release
f690: 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d   any dynamic mem
f6a0: 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  ory held by the 
f6b0: 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  VM in the Vdbe.a
f6c0: 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63  Mem memory .** c
f6d0: 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20  ell array. This 
f6e0: 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  is necessary as 
f6f0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
f700: 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69  array may contai
f710: 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f  n.** pointers to
f720: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
f730: 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e  ts, which may in
f740: 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f   turn contain po
f750: 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65  inters to.** ope
f760: 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74  n cursors..*/.st
f770: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41  atic void closeA
f780: 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a  llCursors(Vdbe *
f790: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72  p){.  if( p->pFr
f7a0: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
f7b0: 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20  rame *pFrame;.  
f7c0: 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e    for(pFrame=p->
f7d0: 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e  pFrame; pFrame->
f7e0: 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d  pParent; pFrame=
f7f0: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
f800: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f810: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46  eFrameRestore(pF
f820: 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46  rame);.    p->pF
f830: 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rame = 0;.    p-
f840: 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  >nFrame = 0;.  }
f850: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46  .  assert( p->nF
f860: 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f  rame==0 );.  clo
f870: 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65  seCursorsInFrame
f880: 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d  (p);.  if( p->aM
f890: 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  em ){.    releas
f8a0: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65  eMemArray(p->aMe
f8b0: 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d  m, p->nMem);.  }
f8c0: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65  .  while( p->pDe
f8d0: 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  lFrame ){.    Vd
f8e0: 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20  beFrame *pDel = 
f8f0: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20  p->pDelFrame;.  
f900: 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d    p->pDelFrame =
f910: 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a   pDel->pParent;.
f920: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
f930: 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29  rameDelete(pDel)
f940: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
f950: 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61  te any auxdata a
f960: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20  llocations made 
f970: 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69  by the VM */.  i
f980: 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29  f( p->pAuxData )
f990: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
f9a0: 74 65 41 75 78 44 61 74 61 28 70 2d 3e 64 62 2c  teAuxData(p->db,
f9b0: 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d   &p->pAuxData, -
f9c0: 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  1, 0);.  assert(
f9d0: 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20   p->pAuxData==0 
f9e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
f9f0: 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65  n up the VM afte
fa00: 72 20 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e 0a  r a single run..
fa10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43  */.static void C
fa20: 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b  leanup(Vdbe *p){
fa30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
fa40: 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20   p->db;..#ifdef 
fa50: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
fa60: 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74  * Execute assert
fa70: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
fa80: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
fa90: 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e   Vdbe.apCsr[] an
faa0: 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65  d .  ** Vdbe.aMe
fab0: 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20  m[] arrays have 
fac0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65  already been cle
fad0: 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69  aned up.  */.  i
fae0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61  nt i;.  if( p->a
faf0: 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20  pCsr ) for(i=0; 
fb00: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
fb10: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  +) assert( p->ap
fb20: 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69  Csr[i]==0 );.  i
fb30: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
fb40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
fb50: 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72  nMem; i++) asser
fb60: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c  t( p->aMem[i].fl
fb70: 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e  ags==MEM_Undefin
fb80: 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed );.  }.#endif
fb90: 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
fba0: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
fbb0: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
fbc0: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
fbd0: 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tSet = 0;.}../*.
fbe0: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
fbf0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
fc00: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
fc10: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
fc20: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
fc30: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
fc40: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
fc50: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
fc60: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
fc70: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
fc80: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
fc90: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
fca0: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
fcb0: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
fcc0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
fcd0: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
fce0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
fcf0: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
fd00: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
fd10: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
fd20: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
fd30: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
fd40: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
fd50: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
fd60: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
fd70: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
fd80: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
fd90: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
fda0: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e  olName);.  n = n
fdb0: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
fdc0: 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
fdd0: 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
fde0: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
fdf0: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
fe00: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
fe10: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
fe20: 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20  , sizeof(Mem)*n 
fe30: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  );.  if( p->aCol
fe40: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
fe50: 3b 0a 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79  ;.  initMemArray
fe60: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 6e 2c  (p->aColName, n,
fe70: 20 70 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c   p->db, MEM_Null
fe80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
fe90: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
fea0: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
feb0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
fec0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
fed0: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
fee0: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
fef0: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
ff00: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
ff10: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
ff20: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
ff30: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
ff40: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
ff50: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20  **.** The final 
ff60: 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c  parameter, xDel,
ff70: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
ff80: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
ff90: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a  SQLITE_STATIC.**
ffa0: 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   or SQLITE_TRANS
ffb0: 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53  IENT. If it is S
ffc0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74  QLITE_DYNAMIC, t
ffd0: 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
ffe0: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
fff0: 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72  zName will be fr
10000 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62  eed by sqlite3Db
10010 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
10020 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65  vdbe is destroye
10030 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
10040 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
10050 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10070 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e      /* Vdbe bein
10080 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a  g configured */.
10090 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100b0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
100c0 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c  olumn zName appl
100d0 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ies to */.  int 
100e0 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  var,            
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10100 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41  One of the COLNA
10110 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a  ME_* constants *
10120 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10130 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
10140 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
10150 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
10160 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76  ning name */.  v
10170 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
10180 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
10190 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  /* Memory manage
101a0 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f  ment strategy fo
101b0 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  r zName */.){.  
101c0 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70  int rc;.  Mem *p
101d0 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  ColName;.  asser
101e0 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f  t( idx<p->nResCo
101f0 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
10200 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20  ( var<COLNAME_N 
10210 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
10220 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
10230 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61      assert( !zNa
10240 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49  me || xDel!=SQLI
10250 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20  TE_DYNAMIC );.  
10260 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10270 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
10280 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
10290 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
102a0 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
102b0 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
102c0 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
102d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
102e0 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
102f0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
10300 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44   SQLITE_UTF8, xD
10310 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  el);.  assert( r
10320 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c  c!=0 || !zName |
10330 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  | (pColName->fla
10340 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20  gs&MEM_Term)!=0 
10350 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
10360 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20  }../*.** A read 
10370 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
10380 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20  tion may or may 
10390 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e  not be active on
103a0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
103b0 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61  .** db. If a tra
103c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
103d0 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49  ve, commit it. I
103e0 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20  f there is a.** 
103f0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
10400 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20  n spanning more 
10410 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
10420 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75  e file, this rou
10430 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61  tine.** takes ca
10440 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  re of the master
10450 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72   journal tricker
10460 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
10470 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69   vdbeCommit(sqli
10480 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
10490 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
104a0 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f  t nTrans = 0;  /
104b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61  * Number of data
104c0 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63  bases with an ac
104d0 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73  tive write-trans
104e0 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20  action.         
104f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
10500 74 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73  t are candidates
10510 20 66 6f 72 20 61 20 74 77 6f 2d 70 68 61 73 65   for a two-phase
10520 20 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20 61 0a   commit using a.
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
10550 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 72 63  rnal */.  int rc
10560 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10570 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  int needXcommit 
10580 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  = 0;..#ifdef SQL
10590 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
105a0 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20  TABLE.  /* With 
105b0 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c  this option, sql
105c0 69 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69  ite3VtabSync() i
105d0 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20  s defined to be 
105e0 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c  simply .  ** SQL
105f0 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e  ITE_OK so p is n
10600 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20  ot used. .  */. 
10610 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
10620 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  R(p);.#endif..  
10630 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  /* Before doing 
10640 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63  anything else, c
10650 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20  all the xSync() 
10660 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79  callback for any
10670 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f  .  ** virtual mo
10680 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74  dule tables writ
10690 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e  ten in this tran
106a0 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61  saction. This ha
106b0 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e  s to.  ** be don
106c0 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69  e before determi
106d0 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d  ning whether a m
106e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
106f0 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75  le is .  ** requ
10700 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e  ired, as an xSyn
10710 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79  c() callback may
10720 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64   add an attached
10730 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74   database.  ** t
10740 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
10750 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  n..  */.  rc = s
10760 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64  qlite3VtabSync(d
10770 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  b, p);..  /* Thi
10780 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65  s loop determine
10790 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d  s (a) if the com
107a0 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20  mit hook should 
107b0 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20  be invoked and. 
107c0 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79   ** (b) how many
107d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
107e0 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20  have open write 
107f0 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f  transactions, no
10800 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e  t .  ** includin
10810 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  g the temp datab
10820 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f  ase. (b) is impo
10830 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66  rtant because if
10840 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a   more than .  **
10850 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
10860 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77  le has an open w
10870 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
10880 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  , a master journ
10890 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  al.  ** file is 
108a0 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
108b0 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20  atomic commit.. 
108c0 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */ .  for(i=0; 
108d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
108e0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
108f0 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  { .    Btree *pB
10900 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
10910 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  Bt;.    if( sqli
10920 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
10930 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
10940 2f 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  /* Whether or no
10950 74 20 61 20 64 61 74 61 62 61 73 65 20 6d 69 67  t a database mig
10960 68 74 20 6e 65 65 64 20 61 20 6d 61 73 74 65 72  ht need a master
10970 20 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e 64 73   journal depends
10980 20 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69   upon.      ** i
10990 74 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  ts journal mode 
109a0 28 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74 68 69  (among other thi
109b0 6e 67 73 29 2e 20 20 54 68 69 73 20 6d 61 74 72  ngs).  This matr
109c0 69 78 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ix determines wh
109d0 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  ich.      ** jou
109e0 72 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65 20 61  rnal modes use a
109f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10a00 61 6e 64 20 77 68 69 63 68 20 64 6f 20 6e 6f 74  and which do not
10a10 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
10a20 20 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e 65 65   const u8 aMJNee
10a30 64 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ded[] = {.      
10a40 20 20 2f 2a 20 44 45 4c 45 54 45 20 20 20 2a 2f    /* DELETE   */
10a50 20 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20    1,.        /* 
10a60 50 45 52 53 49 53 54 20 20 20 2a 2f 20 31 2c 0a  PERSIST   */ 1,.
10a70 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 20 20          /* OFF  
10a80 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20       */ 0,.     
10a90 20 20 20 2f 2a 20 54 52 55 4e 43 41 54 45 20 20     /* TRUNCATE  
10aa0 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a  */ 1,.        /*
10ab0 20 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20 30 2c   MEMORY    */ 0,
10ac0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c 20  .        /* WAL 
10ad0 20 20 20 20 20 20 2a 2f 20 30 0a 20 20 20 20 20        */ 0.     
10ae0 20 7d 3b 0a 20 20 20 20 20 20 50 61 67 65 72 20   };.      Pager 
10af0 2a 70 50 61 67 65 72 3b 20 20 20 2f 2a 20 50 61  *pPager;   /* Pa
10b00 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ger associated w
10b10 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 20 20 20  ith pBt */.     
10b20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31   needXcommit = 1
10b30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
10b40 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a  treeEnter(pBt);.
10b50 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73        pPager = s
10b60 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
10b70 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (pBt);.      if(
10b80 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61 66 65   db->aDb[i].safe
10b90 74 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45 52 5f  ty_level!=PAGER_
10ba0 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 0a  SYNCHRONOUS_OFF.
10bb0 20 20 20 20 20 20 20 26 26 20 61 4d 4a 4e 65 65         && aMJNee
10bc0 64 65 64 5b 73 71 6c 69 74 65 33 50 61 67 65 72  ded[sqlite3Pager
10bd0 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70  GetJournalMode(p
10be0 50 61 67 65 72 29 5d 0a 20 20 20 20 20 20 29 7b  Pager)].      ){
10bf0 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
10c00 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( i!=1 );.      
10c10 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20    nTrans++;.    
10c20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
10c30 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
10c40 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29  siveLock(pPager)
10c50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
10c60 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a  treeLeave(pBt);.
10c70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
10c80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10c90 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10ca0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
10cb0 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65  re are any write
10cc0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74  -transactions at
10cd0 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65   all, invoke the
10ce0 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a   commit hook */.
10cf0 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69    if( needXcommi
10d00 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  t && db->xCommit
10d10 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
10d20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  rc = db->xCommit
10d30 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f  Callback(db->pCo
10d40 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66  mmitArg);.    if
10d50 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
10d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
10d70 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
10d80 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
10d90 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
10da0 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
10db0 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
10dc0 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
10dd0 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
10de0 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
10df0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
10e00 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
10e10 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
10e20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
10e30 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
10e40 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
10e50 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
10e60 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
10e70 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
10e80 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
10e90 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
10ea0 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
10eb0 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69  ry: or a temp fi
10ec0 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68  le.  In .  ** th
10ed0 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f  at case we do no
10ee0 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
10ef0 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
10f00 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
10f10 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73  .  ** simple cas
10f20 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f  e then too..  */
10f30 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
10f40 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
10f50 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
10f60 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
10f70 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c  )).   || nTrans<
10f80 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  =1.  ){.    for(
10f90 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
10fa0 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
10fb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
10fc0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
10fd0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
10fe0 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
10ff0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
11000 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
11010 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
11020 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
11030 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
11040 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
11050 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
11060 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
11070 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
11080 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
11090 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
110a0 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
110b0 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
110c0 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
110d0 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
110e0 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
110f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
11100 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
11110 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
11120 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
11130 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
11140 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
11150 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
11160 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
11170 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11180 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
11190 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
111a0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
111b0 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
111c0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
111d0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
111e0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
111f0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
11200 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
11210 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11220 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
11230 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
11240 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
11250 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
11260 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
11270 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
11280 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
11290 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
112a0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
112b0 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
112c0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
112d0 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
112e0 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  ed atomically.. 
112f0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
11300 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
11310 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
11320 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
11330 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68 61  b->pVfs;.    cha
11340 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
11350 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66    /* File-name f
11360 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  or the master jo
11370 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61  urnal */.    cha
11380 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69  r const *zMainFi
11390 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
113a0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
113b0 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
113c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
113d0 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  pMaster = 0;.   
113e0 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
113f0 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  .    int res;.  
11400 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74    int retryCount
11410 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
11420 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a  ainFile;..    /*
11430 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
11440 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
11450 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46  me */.    nMainF
11460 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ile = sqlite3Str
11470 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29  len30(zMainFile)
11480 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
11490 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
114a0 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39  b, "%s-mjXXXXXX9
114b0 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29  XXz", zMainFile)
114c0 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65  ;.    if( zMaste
114d0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
114e0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
114f0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
11500 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
11510 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
11520 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
11530 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20   retryCount>100 
11540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
11550 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
11560 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65  FULL, "MJ delete
11570 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
11580 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11590 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
115a0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
115b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
115c0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
115d0 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29   retryCount==1 )
115e0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
115f0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
11600 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65  ULL, "MJ collide
11610 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
11620 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11630 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f   }.      retryCo
11640 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  unt++;.      sql
11650 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
11660 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c  sizeof(iRandom),
11670 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20   &iRandom);.    
11680 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
11690 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b  tf(13, &zMaster[
116a0 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a  nMainFile], "-mj
116b0 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20  %06X9%02X",.    
116c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116d0 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e             (iRan
116e0 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66  dom>>8)&0xffffff
116f0 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b  , iRandom&0xff);
11700 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e  .      /* The an
11710 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68  tipenultimate ch
11720 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d  aracter of the m
11730 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
11740 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  me must.      **
11750 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64   be "9" to avoid
11760 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73   name collisions
11770 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20   when using 8+3 
11780 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20  filenames. */.  
11790 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73      assert( zMas
117a0 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ter[sqlite3Strle
117b0 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d  n30(zMaster)-3]=
117c0 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71  ='9' );.      sq
117d0 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
117e0 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73  (zMainFile, zMas
117f0 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ter);.      rc =
11800 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
11810 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
11820 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
11830 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
11840 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
11850 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
11860 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11870 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11880 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
11890 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
118a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
118b0 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
118c0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
118d0 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
118e0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
118f0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
11900 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
11910 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
11920 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
11930 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
11940 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
11950 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
11960 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11970 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
11980 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
11990 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
119a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
119b0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
119c0 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
119d0 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
119e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
119f0 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
11a00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11a10 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
11a20 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
11a30 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
11a40 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
11a50 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11a60 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
11a70 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
11a80 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
11a90 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
11aa0 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
11ab0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
11ac0 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
11ad0 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
11ae0 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
11af0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
11b00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
11b10 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
11b20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
11b30 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
11b40 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
11b50 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
11b60 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
11b70 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
11b80 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
11b90 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
11ba0 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
11bb0 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d        if( zFile=
11bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11bd0 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
11be0 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d  nore TEMP and :m
11bf0 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
11c00 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
11c10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46        assert( zF
11c20 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ile[0]!=0 );.   
11c30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11c40 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72  3OsWrite(pMaster
11c50 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33  , zFile, sqlite3
11c60 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
11c70 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
11c80 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71      offset += sq
11c90 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
11ca0 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
11cb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11cc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
11cd0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
11ce0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
11cf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
11d00 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
11d10 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
11d20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11d30 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
11d40 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11d50 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
11d60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
11d70 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
11d80 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11d90 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
11da0 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
11db0 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
11dc0 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
11dd0 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
11de0 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71 6c  .    if( 0==(sql
11df0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
11e00 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
11e10 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
11e20 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20  P_SEQUENTIAL).  
11e30 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
11e40 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
11e50 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
11e60 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
11e70 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
11e80 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
11e90 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
11ea0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
11eb0 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
11ec0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
11ed0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
11ee0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
11ef0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
11f00 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
11f10 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
11f20 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
11f30 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
11f40 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
11f50 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
11f60 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
11f70 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
11f80 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
11f90 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
11fa0 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
11fb0 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
11fc0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11fd0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
11fe0 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
11ff0 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
12000 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
12010 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
12020 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
12030 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
12040 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
12050 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
12060 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
12070 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
12080 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
12090 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
120a0 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
120b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
120c0 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
120d0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
120e0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
120f0 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
12100 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f  occurred..    */
12110 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
12120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
12130 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
12140 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
12150 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
12160 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
12170 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
12180 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
12190 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
121a0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
121b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
121c0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
121d0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
121e0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
121f0 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66  E_BUSY );.    if
12200 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12210 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12220 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
12230 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
12240 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
12250 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
12260 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
12270 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
12280 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12290 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
122a0 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
122b0 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
122c0 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
122d0 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
122e0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
122f0 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
12300 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
12310 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
12320 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
12330 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
12340 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
12350 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
12360 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
12370 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
12380 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
12390 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
123a0 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
123b0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
123c0 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
123d0 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
123e0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
123f0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
12400 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
12410 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
12420 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
12430 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
12440 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
12450 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
12460 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
12470 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
12480 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
12490 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
124a0 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
124b0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
124c0 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
124d0 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
124e0 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
124f0 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
12500 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
12510 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
12520 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
12530 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
12540 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
12550 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
12560 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
12570 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
12580 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
12590 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
125a0 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
125b0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
125c0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
125d0 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
125e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
125f0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
12600 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
12610 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
12620 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
12630 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
12640 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
12650 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
12660 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
12670 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
12680 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
12690 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
126a0 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
126b0 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74  sqlite3.nVdbeAct
126c0 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62  ive count variab
126d0 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
126e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
126f0 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
12700 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
12710 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
12720 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
12730 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
12740 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
12750 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
12760 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
12770 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
12780 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
12790 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
127a0 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
127b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
127c0 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
127d0 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
127e0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
127f0 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
12800 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
12810 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
12820 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
12830 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
12840 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ite = 0;.  int n
12850 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20  Read = 0;.  p = 
12860 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
12870 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
12880 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75   sqlite3_stmt_bu
12890 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  sy((sqlite3_stmt
128a0 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e  *)p) ){.      cn
128b0 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t++;.      if( p
128c0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20  ->readOnly==0 ) 
128d0 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20  nWrite++;.      
128e0 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
128f0 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20   ) nRead++;.    
12900 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
12910 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
12920 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65  ( cnt==db->nVdbe
12930 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65  Active );.  asse
12940 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e  rt( nWrite==db->
12950 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
12960 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64  assert( nRead==d
12970 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
12980 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12990 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
129a0 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt(x).#endif../*
129b0 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20  .** If the Vdbe 
129c0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
129d0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65  rst argument ope
129e0 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d  ned a statement-
129f0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
12a00 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72  close it now. Ar
12a10 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20  gument eOp must 
12a20 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  be either SAVEPO
12a30 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a  INT_ROLLBACK or.
12a40 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  ** SAVEPOINT_REL
12a50 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53  EASE. If it is S
12a60 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12a70 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  K, then the stat
12a80 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
12a90 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
12aa0 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53  ack. If eOp is S
12ab0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
12ac0 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73  , then the .** s
12ad0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
12ae0 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
12af0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
12b00 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
12b10 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
12b20 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
12b30 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
12b40 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  Otherwise SQLITE
12b50 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
12b60 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
12b70 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69  ement(Vdbe *p, i
12b80 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74  nt eOp){.  sqlit
12b90 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70  e3 *const db = p
12ba0 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
12bb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
12bc0 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65  * If p->iStateme
12bd0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
12be0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
12bf0 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61  is Vdbe opened a
12c00 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74   .  ** statement
12c10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
12c20 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73  t should be clos
12c30 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c  ed here. The onl
12c40 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a  y exception.  **
12c50 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65   is that an IO e
12c60 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63  rror may have oc
12c70 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67 20  curred, causing 
12c80 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c  an emergency rol
12c90 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74  lback..  ** In t
12ca0 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53  his case (db->nS
12cb0 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e  tatement==0), an
12cc0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  d there is nothi
12cd0 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20  ng to do..  */. 
12ce0 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d   if( db->nStatem
12cf0 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65  ent && p->iState
12d00 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ment ){.    int 
12d10 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  i;.    const int
12d20 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   iSavepoint = p-
12d30 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a  >iStatement-1;..
12d40 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d      assert( eOp=
12d50 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
12d60 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45  ACK || eOp==SAVE
12d70 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a  POINT_RELEASE);.
12d80 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12d90 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  nStatement>0 );.
12da0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
12db0 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e  Statement==(db->
12dc0 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e  nStatement+db->n
12dd0 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20  Savepoint) );.. 
12de0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
12df0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
12e00 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51      int rc2 = SQ
12e10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42  LITE_OK;.      B
12e20 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
12e30 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
12e40 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
12e50 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
12e60 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12e70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
12e80 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
12e90 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
12ea0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12eb0 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
12ec0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12ed0 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
12ee0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12ef0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
12f00 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
12f10 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  t, SAVEPOINT_REL
12f20 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
12f30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12f40 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
12f50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12f60 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
12f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12f80 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53      }.    db->nS
12f90 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20  tatement--;.    
12fa0 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
12fb0 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0;..    if( rc==
12fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12fd0 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
12fe0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
12ff0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
13000 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
13010 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
13020 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
13030 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d  epoint);.      }
13040 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
13050 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13060 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13070 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
13080 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
13090 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
130a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
130b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
130c0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
130d0 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f  tion is being ro
130e0 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20  lled back, also 
130f0 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20  restore the .   
13100 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e   ** database han
13110 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f  dles deferred co
13120 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72  nstraint counter
13130 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
13140 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a   had when .    *
13150 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
13160 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
13170 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20  opened.  */.    
13180 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
13190 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
131a0 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
131b0 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  edCons = p->nStm
131c0 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20  tDefCons;.      
131d0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
131e0 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
131f0 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d  efImmCons;.    }
13200 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
13210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
13220 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
13230 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
13240 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20  ction opened by 
13250 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
13260 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74   handle associat
13270 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70  ed with the VM p
13280 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
13290 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f  ment is about to
132a0 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   be .** committe
132b0 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  d. If there are 
132c0 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65  outstanding defe
132d0 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
132e0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76   constraint.** v
132f0 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72  iolations, retur
13300 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
13310 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
13320 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
13330 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
13340 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f  ding FK violatio
13350 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ns and this func
13360 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
13370 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73   SQLITE_ERROR, s
13380 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
13390 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54   the VM to SQLIT
133a0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
133b0 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77  EIGNKEY.** and w
133c0 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rite an error me
133d0 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  ssage to it. The
133e0 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
133f0 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ERROR..*/.#ifnde
13400 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
13410 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71  REIGN_KEY.int sq
13420 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
13430 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65  (Vdbe *p, int de
13440 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74  ferred){.  sqlit
13450 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
13460 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20    if( (deferred 
13470 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65  && (db->nDeferre
13480 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72  dCons+db->nDefer
13490 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a  redImmCons)>0) .
134a0 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64     || (!deferred
134b0 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72   && p->nFkConstr
134c0 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20  aint>0) .  ){.  
134d0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
134e0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
134f0 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65  IGNKEY;.    p->e
13500 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
13510 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74  Abort;.    sqlit
13520 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
13530 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
13540 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b  traint failed");
13550 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13560 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
13570 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13580 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
13590 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
135a0 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
135b0 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
135c0 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
135d0 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
135e0 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
135f0 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
13600 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
13610 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
13620 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
13630 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
13640 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
13650 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
13660 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
13670 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
13680 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
13690 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
136a0 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
136b0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49  E_MAGIC_HALT.  I
136c0 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f  t is harmless to
136d0 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e  .** call this on
136e0 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e   a VM that is in
136f0 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49   the SQLITE_MAGI
13700 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a  C_HALT state..**
13710 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
13720 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
13730 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
13740 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
13750 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
13760 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
13770 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
13780 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
13790 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
137a0 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
137b0 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
137c0 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
137d0 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
137e0 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
137f0 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  t(Vdbe *p){.  in
13800 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13820 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   Used to store t
13830 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20  ransient return 
13840 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  codes */.  sqlit
13850 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
13860 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
13870 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
13880 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
13890 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
138a0 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
138b0 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
138c0 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
138d0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
138e0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
138f0 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
13900 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
13910 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
13920 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
13930 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
13940 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
13950 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
13960 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
13970 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
13980 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
13990 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
139a0 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
139b0 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
139c0 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
139d0 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
139e0 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
139f0 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
13a00 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
13a10 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
13a20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
13a30 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
13a40 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
13a50 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
13a60 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
13a70 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
13a80 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
13a90 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
13aa0 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
13ab0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
13ac0 50 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  PT;.  }.  closeA
13ad0 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20  llCursors(p);.  
13ae0 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
13af0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a  BE_MAGIC_RUN ){.
13b00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13b10 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63  E_OK;.  }.  chec
13b20 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
13b30 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d  b);..  /* No com
13b40 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
13b50 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72  needed if the pr
13b60 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72  ogram never star
13b70 74 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20  ted or if the.  
13b80 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
13b90 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f   does not read o
13ba0 72 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61  r write a databa
13bb0 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69  se file.  */.  i
13bc0 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70  f( p->pc>=0 && p
13bd0 2d 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20  ->bIsReader ){. 
13be0 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a     int mrc;   /*
13bf0 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63   Primary error c
13c00 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a  ode from p->rc *
13c10 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65  /.    int eState
13c20 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20  mentOp = 0;.    
13c30 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72  int isSpecialErr
13c40 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  or;            /
13c50 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
13c60 20 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72   a 'special' err
13c70 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f  or */..    /* Lo
13c80 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73  ck all btrees us
13c90 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d  ed by the statem
13ca0 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ent */.    sqlit
13cb0 65 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a  e3VdbeEnter(p);.
13cc0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
13cd0 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  r one of the spe
13ce0 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  cial errors */. 
13cf0 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26     mrc = p->rc &
13d00 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65   0xff;.    isSpe
13d10 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d  cialError = mrc=
13d20 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
13d30 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   mrc==SQLITE_IOE
13d40 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR.             
13d50 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d          || mrc==
13d60 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
13d70 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
13d80 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73  FULL;.    if( is
13d90 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
13da0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
13db0 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
13dc0 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f  nly and the erro
13dd0 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
13de0 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20  _INTERRUPT, .   
13df0 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63     ** no rollbac
13e00 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20  k is necessary. 
13e10 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65  Otherwise, at le
13e20 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20  ast a savepoint 
13e30 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
13e40 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
13e50 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73  lled back to res
13e60 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
13e70 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a  e to a .      **
13e80 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
13e90 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
13ea0 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65    ** Even if the
13eb0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65   statement is re
13ec0 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69  ad-only, it is i
13ed0 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66  mportant to perf
13ee0 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  orm.      ** a s
13ef0 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e  tatement or tran
13f00 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
13f10 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74   operation. If t
13f20 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20  he error .      
13f30 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  ** occurred whil
13f40 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
13f50 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f   journal, sub-jo
13f60 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73  urnal or databas
13f70 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  e.      ** file 
13f80 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66  as part of an ef
13f90 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20  fort to free up 
13fa0 63 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65  cache space (see
13fb0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
13fc0 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29  ** pagerStress()
13fd0 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68   in pager.c), th
13fe0 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65  e rollback is re
13ff0 71 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72  quired to restor
14000 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e .      ** the 
14010 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69  pager to a consi
14020 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
14030 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
14040 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20  !p->readOnly || 
14050 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc!=SQLITE_INTE
14060 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20  RRUPT ){.       
14070 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54   if( (mrc==SQLIT
14080 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
14090 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20  SQLITE_FULL) && 
140a0 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
140b0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
140c0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
140d0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
140e0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
140f0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
14100 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
14110 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
14120 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
14130 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
14140 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
14150 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
14160 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
14170 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
14180 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
14190 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
141a0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
141b0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
141c0 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
141d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
141e0 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
141f0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
14200 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
14210 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
14220 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
14230 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14240 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
14250 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64   Check for immed
14260 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
14270 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a   violations. */.
14280 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
14290 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
142a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65    sqlite3VdbeChe
142b0 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20  ckFk(p, 0);.    
142c0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
142d0 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
142e0 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
142f0 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
14300 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20  active writer . 
14310 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77     ** VM, then w
14320 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f  e do either a co
14330 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
14340 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
14350 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20  transaction. .  
14360 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
14370 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73  : This block als
14380 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66  o runs if one of
14390 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
143a0 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20  ors handled .   
143b0 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63   ** above has oc
143c0 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a  curred. .    */.
143d0 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
143e0 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a  VtabInSync(db) .
143f0 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f       && db->auto
14400 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20  Commit .     && 
14410 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d  db->nVdbeWrite==
14420 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29  (p->readOnly==0)
14430 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69   .    ){.      i
14440 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
14450 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72  _OK || (p->error
14460 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
14470 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72  && !isSpecialErr
14480 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  or) ){.        r
14490 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
144a0 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20  heckFk(p, 1);.  
144b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
144c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
144d0 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70       if( NEVER(p
144e0 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
144f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14500 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
14510 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
14520 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
14530 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14540 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
14550 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
14560 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20  REIGNKEY;.      
14570 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20    }else{ .      
14580 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d      /* The auto-
14590 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74  commit flag is t
145a0 72 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72  rue, the vdbe pr
145b0 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73  ogram was succes
145c0 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20  sful .          
145d0 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52  ** or hit an 'OR
145e0 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e   FAIL' constrain
145f0 74 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  t and there are 
14600 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  no deferred fore
14610 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ign.          **
14620 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
14630 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20   to hold up the 
14640 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
14650 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74  s means a commit
14660 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
14670 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  s required. */. 
14680 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64           rc = vd
14690 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b  beCommit(db, p);
146a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
146b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
146c0 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61  E_BUSY && p->rea
146d0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
146e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
146f0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
14700 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14710 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  BUSY;.        }e
14720 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
14730 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14740 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
14750 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14760 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
14770 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20  SQLITE_OK);.    
14780 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
14790 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
147a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64  lse{.          d
147b0 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
147c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
147d0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
147e0 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
147f0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
14800 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b   ~SQLITE_DeferFK
14810 73 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  s;.          sql
14820 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
14830 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20  alChanges(db);. 
14840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14850 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
14860 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
14870 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
14880 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
14890 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
148a0 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74  .      db->nStat
148b0 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ement = 0;.    }
148c0 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d  else if( eStatem
148d0 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  entOp==0 ){.    
148e0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
148f0 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72  ITE_OK || p->err
14900 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
14910 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  l ){.        eSt
14920 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
14930 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20  POINT_RELEASE;. 
14940 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
14950 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
14960 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
14970 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
14980 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
14990 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BACK;.      }els
149a0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
149b0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
149c0 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
149d0 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
149e0 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
149f0 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
14a00 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
14a10 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
14a20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
14a30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14a40 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74    .    /* If eSt
14a50 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e  atementOp is non
14a60 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74  -zero, then a st
14a70 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
14a80 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ion needs to.   
14a90 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64   ** be committed
14aa0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   or rolled back.
14ab0 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   Call sqlite3Vdb
14ac0 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
14ad0 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73  ) to.    ** do s
14ae0 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61  o. If this opera
14af0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
14b00 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63  error, and the c
14b10 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
14b20 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f  .    ** error co
14b30 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20  de is SQLITE_OK 
14b40 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  or SQLITE_CONSTR
14b50 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f  AINT, then promo
14b60 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  te the.    ** cu
14b70 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
14b80 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20  error code..    
14b90 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74  */.    if( eStat
14ba0 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20  ementOp ){.     
14bb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
14bc0 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
14bd0 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29  p, eStatementOp)
14be0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
14bf0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
14c00 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
14c10 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d  | (p->rc&0xff)==
14c20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
14c30 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  T ){.          p
14c40 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
14c50 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
14c60 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
14c70 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  g);.          p-
14c80 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
14c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14ca0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
14cb0 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
14cc0 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
14cd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
14ce0 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
14cf0 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
14d00 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
14d10 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
14d20 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
14d30 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
14d40 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e  f this was an IN
14d50 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
14d60 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74  DELETE and no st
14d70 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
14d80 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62  ion.    ** has b
14d90 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  een rolled back,
14da0 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61   update the data
14db0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
14dc0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20  change-counter. 
14dd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14de0 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29  p->changeCntOn )
14df0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61  {.      if( eSta
14e00 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f  tementOp!=SAVEPO
14e10 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
14e20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14e30 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
14e40 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20  , p->nChange);. 
14e50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14e60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
14e70 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29  etChanges(db, 0)
14e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14e90 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
14ea0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
14eb0 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20  lease the locks 
14ec0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
14ed0 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  beLeave(p);.  }.
14ee0 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
14ef0 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
14f00 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
14f10 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
14f20 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
14f30 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
14f40 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
14f50 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  --;.    if( !p->
14f60 72 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e  readOnly ) db->n
14f70 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20  VdbeWrite--;.   
14f80 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65   if( p->bIsReade
14f90 72 20 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  r ) db->nVdbeRea
14fa0 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d--;.    assert(
14fb0 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
14fc0 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20  >=db->nVdbeRead 
14fd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
14fe0 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62  b->nVdbeRead>=db
14ff0 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a  ->nVdbeWrite );.
15000 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
15010 6e 56 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b  nVdbeWrite>=0 );
15020 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
15030 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  = VDBE_MAGIC_HAL
15040 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  T;.  checkActive
15050 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69  VdbeCnt(db);.  i
15060 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
15070 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
15080 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
15090 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
150a0 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
150b0 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  it flag is set t
150c0 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79  o true, then any
150d0 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65   locks that were
150e0 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f   held.  ** by co
150f0 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65  nnection db have
15100 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73   now been releas
15110 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ed. Call sqlite3
15120 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b  ConnectionUnlock
15130 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e  ed() .  ** to in
15140 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65  voke any require
15150 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20  d unlock-notify 
15160 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a  callbacks..  */.
15170 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f    if( db->autoCo
15180 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  mmit ){.    sqli
15190 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c  te3ConnectionUnl
151a0 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a  ocked(db);.  }..
151b0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
151c0 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64  dbeActive>0 || d
151d0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
151e0 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65   || db->nStateme
151f0 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  nt==0 );.  retur
15200 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  n (p->rc==SQLITE
15210 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42  _BUSY ? SQLITE_B
15220 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29  USY : SQLITE_OK)
15230 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ;.}.../*.** Each
15240 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20   VDBE holds the 
15250 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f  result of the mo
15260 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
15270 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a  3_step() call.**
15280 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73   in p->rc.  This
15290 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
152a0 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74  at result back t
152b0 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
152c0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
152d0 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28  ResetStepResult(
152e0 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
152f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  c = SQLITE_OK;.}
15300 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
15310 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
15320 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65  error message be
15330 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56  longing to the V
15340 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  DBE passed.** as
15350 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
15360 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61 62  ent to its datab
15370 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74  ase handle (so t
15380 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65  hat they will be
15390 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79   .** returned by
153a0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
153b0 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20  3_errcode() and 
153c0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
153d0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
153e0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
153f0 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 20 65  clear the VDBE e
15400 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73  rror code or mes
15410 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f  sage, just.** co
15420 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65  pies them to the
15430 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
15440 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15450 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
15460 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  r(Vdbe *p){.  sq
15470 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
15480 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d  b;.  int rc = p-
15490 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45  >rc;.  if( p->zE
154a0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 64 62 2d  rrMsg ){.    db-
154b0 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b  >bBenignMalloc++
154c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
154d0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
154e0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45  ;.    if( db->pE
154f0 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72  rr==0 ) db->pErr
15500 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
15510 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ew(db);.    sqli
15520 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
15530 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
15540 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
15550 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  UTF8, SQLITE_TRA
15560 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
15570 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
15580 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 62  loc();.    db->b
15590 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a  BenignMalloc--;.
155a0 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20      db->errCode 
155b0 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = rc;.  }else{. 
155c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
155d0 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72  db, rc);.  }.  r
155e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
155f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15600 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49  E_SQLLOG./*.** I
15610 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46  f an SQLITE_CONF
15620 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69  IG_SQLLOG hook i
15630 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64  s registered and
15640 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
15650 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65   run, .** invoke
15660 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   it..*/.static v
15670 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  oid vdbeInvokeSq
15680 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20  llog(Vdbe *v){. 
15690 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
156a0 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
156b0 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54   && v->rc==SQLIT
156c0 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20  E_OK && v->zSql 
156d0 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && v->pc>=0 ){. 
156e0 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64     char *zExpand
156f0 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ed = sqlite3Vdbe
15700 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e  ExpandSql(v, v->
15710 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  zSql);.    asser
15720 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  t( v->db->init.b
15730 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  usy==0 );.    if
15740 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20  ( zExpanded ){. 
15750 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
15760 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
15770 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  (.          sqli
15780 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
15790 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64  pSqllogArg, v->d
157a0 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a  b, zExpanded, 1.
157b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
157c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
157d0 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a  db, zExpanded);.
157e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
157f0 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49  e.# define vdbeI
15800 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23  nvokeSqllog(x).#
15810 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  endif../*.** Cle
15820 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
15830 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
15840 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
15850 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
15860 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
15870 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
15880 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
15890 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
158a0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
158b0 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
158c0 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
158d0 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
158e0 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
158f0 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ** again..**.** 
15900 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e  To look at it an
15910 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20  other way, this 
15920 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74  routine resets t
15930 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  he state of the.
15940 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
15950 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  ne from VDBE_MAG
15960 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d  IC_RUN or VDBE_M
15970 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74  AGIC_HALT back t
15980 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
15990 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  INIT..*/.int sql
159a0 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
159b0 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
159c0 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d  3 *db;.  db = p-
159d0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  >db;..  /* If th
159e0 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e  e VM did not run
159f0 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f   to completion o
15a00 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65  r if it encounte
15a10 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f  red an.  ** erro
15a20 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  r, then it might
15a30 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68   not have been h
15a40 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20  alted properly. 
15a50 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74   So halt.  ** it
15a60 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c   now..  */.  sql
15a70 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b  ite3VdbeHalt(p);
15a80 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44  ..  /* If the VD
15a90 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76  BE has be run ev
15aa0 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68  en partially, th
15ab0 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
15ac0 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
15ad0 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
15ae0 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20  e from the VDBE 
15af0 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
15b00 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
15b10 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74  .  But.  ** if t
15b20 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74  he VDBE has just
15b30 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e   been set to run
15b40 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74   but has not act
15b50 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61  ually executed a
15b60 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  ny.  ** instruct
15b70 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20  ions yet, leave 
15b80 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
15b90 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74  e error informat
15ba0 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20  ion unchanged.. 
15bb0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
15bc0 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e  =0 ){.    vdbeIn
15bd0 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20  vokeSqllog(p);. 
15be0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72     sqlite3VdbeTr
15bf0 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a  ansferError(p);.
15c00 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15c10 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
15c20 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
15c30 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  g = 0;.    if( p
15c40 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20  ->runOnlyOnce ) 
15c50 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a  p->expired = 1;.
15c60 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
15c70 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20  c && p->expired 
15c80 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ){.    /* The ex
15c90 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73  pired flag was s
15ca0 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62  et on the VDBE b
15cb0 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
15cc0 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
15cd0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46  qlite3_step(). F
15ce0 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28  or consistency (
15cf0 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74  since sqlite3_st
15d00 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20  ep() was.    ** 
15d10 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65  called), set the
15d20 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
15d30 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20  in this case as 
15d40 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  well..    */.   
15d50 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
15d60 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20  hMsg(db, p->rc, 
15d70 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73  p->zErrMsg ? "%s
15d80 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73  " : 0, p->zErrMs
15d90 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
15da0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
15db0 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
15dc0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a  rrMsg = 0;.  }..
15dd0 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c    /* Reclaim all
15de0 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
15df0 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20  the VDBE.  */.  
15e00 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f  Cleanup(p);..  /
15e10 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67  * Save profiling
15e20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
15e30 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e  m this VDBE run.
15e40 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42  .  */.#ifdef VDB
15e50 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
15e60 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
15e70 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
15e80 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
15e90 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
15ea0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
15eb0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
15ec0 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
15ed0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
15ee0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
15ef0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
15f00 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
15f10 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
15f20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
15f30 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66   "\n");.      if
15f40 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20  ( p->zSql ){.   
15f50 20 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20       char c, pc 
15f60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72  = 0;.        fpr
15f70 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29  intf(out, "-- ")
15f80 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
15f90 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b  0; (c = p->zSql[
15fa0 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
15fb0 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d          if( pc==
15fc0 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f  '\n' ) fprintf(o
15fd0 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20  ut, "-- ");.    
15fe0 20 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75        putc(c, ou
15ff0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63  t);.          pc
16000 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = c;.        }.
16010 20 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d          if( pc!=
16020 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f  '\n' ) fprintf(o
16030 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
16040 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
16050 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
16060 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a  {.        char z
16070 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20  Hdr[100];.      
16080 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
16090 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c  tf(sizeof(zHdr),
160a0 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c   zHdr, "%6u %12l
160b0 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20  lu %8llu ",.    
160c0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
160d0 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .cnt,.          
160e0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
160f0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  s,.           p-
16100 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20  >aOp[i].cnt>0 ? 
16110 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
16120 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a  /p->aOp[i].cnt :
16130 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
16140 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
16150 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a  t, "%s", zHdr);.
16160 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16170 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20  dbePrintOp(out, 
16180 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
16190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63        }.      fc
161a0 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d  lose(out);.    }
161b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
161c0 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20  >iCurrentTime = 
161d0 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  0;.  p->magic = 
161e0 56 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54  VDBE_MAGIC_RESET
161f0 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
16200 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
16210 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  }. ./*.** Clean 
16220 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20  up and delete a 
16230 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
16240 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  tion.  Return an
16250 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
16260 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
16270 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79  code.  Write any
16280 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
16290 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ext into *pzErrM
162a0 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sg..*/.int sqlit
162b0 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56  e3VdbeFinalize(V
162c0 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
162d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
162e0 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
162f0 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c  DBE_MAGIC_RUN ||
16300 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
16310 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20  MAGIC_HALT ){.  
16320 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
16330 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  beReset(p);.    
16340 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
16350 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
16360 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  c );.  }.  sqlit
16370 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b  e3VdbeDelete(p);
16380 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16390 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  ./*.** If parame
163a0 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20  ter iOp is less 
163b0 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
163c0 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  invoke the destr
163d0 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c  uctor for.** all
163e0 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20   auxiliary data 
163f0 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74  pointers current
16400 6c 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65  ly cached by the
16410 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a   VM passed as.**
16420 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
16430 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ent..**.** Or, i
16440 66 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72  f iOp is greater
16450 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
16460 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
16470 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a   destructor is.*
16480 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66  * only invoked f
16490 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61  or those auxilia
164a0 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73  ry data pointers
164b0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
164c0 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  user .** functio
164d0 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65  n invoked by the
164e0 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63   OP_Function opc
164f0 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69  ode at instructi
16500 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d  on iOp of .** VM
16510 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79   pVdbe, and only
16520 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   then if:.**.** 
16530 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61     * the associa
16540 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  ted function par
16550 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32  ameter is the 32
16560 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75  nd or later (cou
16570 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72  nting.**      fr
16580 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
16590 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ), or.**.**    *
165a0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
165b0 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65  ng bit in argume
165c0 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  nt mask is clear
165d0 20 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73   (where the firs
165e0 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69  t.**      functi
165f0 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72  on parameter cor
16600 72 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20  responds to bit 
16610 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64  0 etc.)..*/.void
16620 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
16630 74 65 41 75 78 44 61 74 61 28 73 71 6c 69 74 65  teAuxData(sqlite
16640 33 20 2a 64 62 2c 20 41 75 78 44 61 74 61 20 2a  3 *db, AuxData *
16650 2a 70 70 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e  *pp, int iOp, in
16660 74 20 6d 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65  t mask){.  while
16670 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78  ( *pp ){.    Aux
16680 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70  Data *pAux = *pp
16690 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30  ;.    if( (iOp<0
166a0 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d  ).     || (pAux-
166b0 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41  >iOp==iOp && (pA
166c0 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21  ux->iArg>31 || !
166d0 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33  (mask & MASKBIT3
166e0 32 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29  2(pAux->iArg))))
166f0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65  .    ){.      te
16700 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41  stcase( pAux->iA
16710 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20  rg==31 );.      
16720 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74  if( pAux->xDelet
16730 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75  e ){.        pAu
16740 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d  x->xDelete(pAux-
16750 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a  >pAux);.      }.
16760 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78        *pp = pAux
16770 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
16780 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16790 20 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73   pAux);.    }els
167a0 65 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41  e{.      pp= &pA
167b0 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ux->pNext;.    }
167c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
167d0 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  ee all memory as
167e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
167f0 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
16800 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
16810 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20  ment,.** except 
16820 66 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c  for object itsel
16830 66 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73  f, which is pres
16840 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  erved..**.** The
16850 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
16860 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
16870 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62  n and sqlite3Vdb
16880 65 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61  eDelete() is tha
16890 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28  t.** VdbeDelete(
168a0 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74  ) also unlinks t
168b0 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
168c0 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73   list of VMs ass
168d0 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
168e0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
168f0 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  nection and free
16900 73 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73  s the object its
16910 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  elf..*/.void sql
16920 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a  ite3VdbeClearObj
16930 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
16940 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62   Vdbe *p){.  Sub
16950 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a  Program *pSub, *
16960 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  pNext;.  int i;.
16970 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d    assert( p->db=
16980 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20  =0 || p->db==db 
16990 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
169a0 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
169b0 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
169c0 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f  COLNAME_N);.  fo
169d0 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72  r(pSub=p->pProgr
169e0 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  am; pSub; pSub=p
169f0 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
16a00 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a   = pSub->pNext;.
16a10 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72      vdbeFreeOpAr
16a20 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f  ray(db, pSub->aO
16a30 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20  p, pSub->nOp);. 
16a40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16a50 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a  (db, pSub);.  }.
16a60 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
16a70 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
16a80 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
16a90 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20  mArray(p->aVar, 
16aa0 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 20 20 66 6f  p->nVar);.    fo
16ab0 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20  r(i=p->nzVar-1; 
16ac0 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74  i>=0; i--) sqlit
16ad0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16ae0 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 20 20 73  azVar[i]);.    s
16af0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16b00 20 70 2d 3e 61 7a 56 61 72 29 3b 0a 20 20 20 20   p->azVar);.    
16b10 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16b20 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 7d  , p->pFree);.  }
16b30 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  .  vdbeFreeOpArr
16b40 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70  ay(db, p->aOp, p
16b50 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65  ->nOp);.  sqlite
16b60 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
16b70 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ColName);.  sqli
16b80 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16b90 3e 7a 53 71 6c 29 3b 0a 23 69 66 64 65 66 20 53  >zSql);.#ifdef S
16ba0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
16bb0 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 66  T_SCANSTATUS.  f
16bc0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63  or(i=0; i<p->nSc
16bd0 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  an; i++){.    sq
16be0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16bf0 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d  p->aScan[i].zNam
16c00 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
16c10 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
16c20 53 63 61 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  Scan);.#endif.}.
16c30 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
16c40 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
16c50 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
16c60 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
16c70 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
16c80 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ..  if( NEVER(p=
16c90 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
16ca0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
16cb0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16cc0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
16cd0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
16ce0 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
16cf0 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d  db, p);.  if( p-
16d00 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
16d10 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
16d20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
16d30 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
16d40 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
16d50 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70     db->pVdbe = p
16d60 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
16d70 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
16d80 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
16d90 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
16da0 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
16db0 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b  VDBE_MAGIC_DEAD;
16dc0 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20  .  p->db = 0;.  
16dd0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16de0 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , p);.}../*.** T
16df0 68 65 20 63 75 72 73 6f 72 20 22 70 22 20 68 61  he cursor "p" ha
16e00 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b  s a pending seek
16e10 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20   operation that 
16e20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
16e30 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e  .** carried out.
16e40 20 20 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f    Seek the curso
16e50 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72  r now.  If an er
16e60 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
16e70 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70  rn.** the approp
16e80 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
16e90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16ea0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
16eb0 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f  handleDeferredMo
16ec0 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
16ed0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20  *p){.  int res, 
16ee0 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
16ef0 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20  E_TEST.  extern 
16f00 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
16f10 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
16f20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65  .  assert( p->de
16f30 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a  ferredMoveto );.
16f40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54    assert( p->isT
16f50 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  able );.  assert
16f60 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
16f70 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
16f80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
16f90 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
16fa0 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  d(p->uc.pCursor,
16fb0 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72   0, p->movetoTar
16fc0 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  get, 0, &res);. 
16fd0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
16fe0 20 72 63 3b 0a 20 20 69 66 28 20 72 65 73 21 3d   rc;.  if( res!=
16ff0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
17000 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
17010 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
17020 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61  ST.  sqlite3_sea
17030 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  rch_count++;.#en
17040 64 69 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65  dif.  p->deferre
17050 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70  dMoveto = 0;.  p
17060 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
17070 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72  CACHE_STALE;.  r
17080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68  .}../*.** Someth
170a0 69 6e 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75  ing has moved cu
170b0 72 73 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20  rsor "p" out of 
170c0 70 6c 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68  place.  Maybe th
170d0 65 20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20  e row it was.** 
170e0 70 6f 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64  pointed to was d
170f0 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
17100 75 6e 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61  under it.  Or ma
17110 79 62 65 20 74 68 65 20 62 74 72 65 65 20 77 61  ybe the btree wa
17120 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e  s.** rebalanced.
17130 20 20 57 68 61 74 65 76 65 72 20 74 68 65 20 63    Whatever the c
17140 61 75 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73  ause, try to res
17150 74 6f 72 65 20 22 70 22 20 74 6f 20 74 68 65 20  tore "p" to the 
17160 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73  place it.** is s
17170 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f  upposed to be po
17180 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20  inting.  If the 
17190 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65 64 20  row was deleted 
171a0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
171b0 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65  he.** cursor, se
171c0 74 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  t the cursor to 
171d0 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20  point to a NULL 
171e0 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
171f0 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  nt SQLITE_NOINLI
17200 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75  NE handleMovedCu
17210 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20  rsor(VdbeCursor 
17220 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66  *p){.  int isDif
17230 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20  ferentRow, rc;. 
17240 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
17250 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
17260 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  REE );.  assert(
17270 20 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d   p->uc.pCursor!=
17280 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
17290 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
172a0 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
172b0 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63  pCursor) );.  rc
172c0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
172d0 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e  ursorRestore(p->
172e0 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 69 73 44  uc.pCursor, &isD
172f0 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20  ifferentRow);.  
17300 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
17310 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
17320 69 66 28 20 69 73 44 69 66 66 65 72 65 6e 74 52  if( isDifferentR
17330 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20  ow ) p->nullRow 
17340 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 1;.  return rc
17350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
17360 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
17370 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61  the cursor is va
17380 6c 69 64 2e 20 20 52 65 73 74 6f 72 65 20 74 68  lid.  Restore th
17390 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e  e cursor.** if n
173a0 65 65 64 20 62 65 2e 20 20 52 65 74 75 72 6e 20  eed be.  Return 
173b0 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 72  any I/O error fr
173c0 6f 6d 20 74 68 65 20 72 65 73 74 6f 72 65 20 6f  om the restore o
173d0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  peration..*/.int
173e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
173f0 6f 72 52 65 73 74 6f 72 65 28 56 64 62 65 43 75  orRestore(VdbeCu
17400 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65  rsor *p){.  asse
17410 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d  rt( p->eCurType=
17420 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
17430 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42  ;.  if( sqlite3B
17440 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
17450 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
17460 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
17470 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
17480 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  r(p);.  }.  retu
17490 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
174a0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
174b0 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73   the cursor p is
174c0 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f   ready to read o
174d0 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20  r write the row 
174e0 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77  to which it.** w
174f0 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e  as last position
17500 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ed.  Return an e
17510 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
17520 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f  OOM fault or I/O
17530 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e   error.** preven
17540 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74  ts us from posit
17550 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  ioning the curso
17560 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74  r to its correct
17570 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   position..**.**
17580 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65   If a MoveTo ope
17590 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e  ration is pendin
175a0 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63  g on the given c
175b0 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74  ursor, then do t
175c0 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f  hat.** MoveTo no
175d0 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69  w.  If no move i
175e0 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b  s pending, check
175f0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
17600 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64  ow has been.** d
17610 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
17620 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
17630 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20   and if it has, 
17640 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a  mark the row as.
17650 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  ** a NULL row..*
17660 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73  *.** If the curs
17670 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
17680 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f  inting to the co
17690 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68  rrect row and th
176a0 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f  at row has.** no
176b0 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f  t been deleted o
176c0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
176d0 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74  e cursor, then t
176e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
176f0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
17700 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
17710 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f  Moveto(VdbeCurso
17720 72 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 69 43  r **pp, int *piC
17730 6f 6c 29 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  ol){.  VdbeCurso
17740 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 69 66  r *p = *pp;.  if
17750 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
17760 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 7b 0a  URTYPE_BTREE ){.
17770 20 20 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72      if( p->defer
17780 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20  redMoveto ){.   
17790 20 20 20 69 6e 74 20 69 4d 61 70 3b 0a 20 20 20     int iMap;.   
177a0 20 20 20 69 66 28 20 70 2d 3e 61 41 6c 74 4d 61     if( p->aAltMa
177b0 70 20 26 26 20 28 69 4d 61 70 20 3d 20 70 2d 3e  p && (iMap = p->
177c0 61 41 6c 74 4d 61 70 5b 31 2b 2a 70 69 43 6f 6c  aAltMap[1+*piCol
177d0 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ])>0 ){.        
177e0 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43 75 72  *pp = p->pAltCur
177f0 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 2a 70 69  sor;.        *pi
17800 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a  Col = iMap - 1;.
17810 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
17820 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
17830 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 68  }.      return h
17840 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76  andleDeferredMov
17850 65 74 6f 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  eto(p);.    }.  
17860 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
17870 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
17880 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
17890 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
178a0 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
178b0 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  r(p);.    }.  }.
178c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
178d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
178e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
178f0 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
17900 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17910 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
17920 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
17930 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
17940 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
17950 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17960 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Put().** sqlite3
17970 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a  VdbeSerialGet().
17980 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
17990 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
179a0 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
179b0 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
179c0 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
179d0 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
179e0 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
179f0 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
17a00 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
17a10 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
17a20 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
17a30 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
17a40 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
17a50 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
17a60 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
17a70 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
17a80 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
17a90 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
17aa0 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
17ab0 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
17ac0 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
17ad0 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
17ae0 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
17af0 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
17b00 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
17b10 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
17b20 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
17b30 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
17b40 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
17b50 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
17b60 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
17b70 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
17b80 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
17b90 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
17ba0 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
17bb0 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  parately..**.** 
17bc0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
17bd0 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
17be0 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
17bf0 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
17c00 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
17c10 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
17c20 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
17c30 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
17c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
17c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
17c60 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
17c70 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
17c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c90 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
17ca0 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cc0 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
17cd0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17ce0 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
17cf0 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
17d00 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17d10 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
17d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d30 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
17d40 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
17d50 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
17d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
17d70 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
17d80 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
17d90 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
17da0 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
17db0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
17dc0 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
17df0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
17e00 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
17e10 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
17e20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
17e30 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e50 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
17e60 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
17e70 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e90 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
17ea0 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
17eb0 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20  **     10,11    
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ed0 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72             reser
17ee0 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
17ef0 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
17f00 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
17f10 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
17f20 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
17f30 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
17f40 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
17f50 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
17f60 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
17f70 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
17f80 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
17f90 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
17fa0 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
17fb0 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
17fc0 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
17fd0 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
17fe0 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
17ff0 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
18000 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
18010 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
18020 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
18030 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
18040 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a  le_format, u32 *
18050 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61  pLen){.  int fla
18060 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  gs = pMem->flags
18070 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73  ;.  u32 n;..  as
18080 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b  sert( pLen!=0 );
18090 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
180a0 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c  _Null ){.    *pL
180b0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  en = 0;.    retu
180c0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
180d0 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
180e0 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
180f0 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
18100 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
18110 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
18120 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
18130 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38   ((((i64)0x00008
18140 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
18150 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75   i64 i = pMem->u
18160 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20  .i;.    u64 u;. 
18170 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20     if( i<0 ){.  
18180 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20      u = ~i;.    
18190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d  }else{.      u =
181a0 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
181b0 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20  ( u<=127 ){.    
181c0 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26    if( (i&1)==i &
181d0 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  & file_format>=4
181e0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65   ){.        *pLe
181f0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  n = 0;.        r
18200 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a  eturn 8+(u32)u;.
18210 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18220 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a       *pLen = 1;.
18230 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
18240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18250 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37      if( u<=32767
18260 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72   ){ *pLen = 2; r
18270 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69  eturn 2; }.    i
18280 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b  f( u<=8388607 ){
18290 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75   *pLen = 3; retu
182a0 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20  rn 3; }.    if( 
182b0 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b  u<=2147483647 ){
182c0 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75   *pLen = 4; retu
182d0 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20  rn 4; }.    if( 
182e0 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20  u<=MAX_6BYTE ){ 
182f0 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72  *pLen = 6; retur
18300 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e  n 5; }.    *pLen
18310 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 8;.    return
18320 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
18330 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
18340 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20      *pLen = 8;. 
18350 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d     return 7;.  }
18360 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
18370 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
18380 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f  d || flags&(MEM_
18390 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b  Str|MEM_Blob) );
183a0 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
183b0 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28  >n>=0 );.  n = (
183c0 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69  u32)pMem->n;.  i
183d0 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  f( flags & MEM_Z
183e0 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ero ){.    n += 
183f0 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pMem->u.nZero;. 
18400 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a   }.  *pLen = n;.
18410 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
18420 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
18430 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
18440 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73  ./*.** The sizes
18450 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65   for serial type
18460 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a  s less than 128.
18470 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
18480 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  u8 sqlite3SmallT
18490 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20  ypeSizes[] = {. 
184a0 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31         /*  0   1
184b0 20 20 20 32 20 20 20 33 20 20 20 34 20 20 20 35     2   3   4   5
184c0 20 20 20 36 20 20 20 37 20 20 20 38 20 20 20 39     6   7   8   9
184d0 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f   */   ./*   0 */
184e0 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33     0,  1,  2,  3
184f0 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38  ,  4,  6,  8,  8
18500 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30  ,  0,  0,./*  10
18510 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c   */   0,  0,  0,
18520 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c    0,  1,  1,  2,
18530 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20    2,  3,  3,./* 
18540 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20   20 */   4,  4, 
18550 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20   5,  5,  6,  6, 
18560 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a   7,  7,  8,  8,.
18570 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20  /*  30 */   9,  
18580 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31  9, 10, 10, 11, 1
18590 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31  1, 12, 12, 13, 1
185a0 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34  3,./*  40 */  14
185b0 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36  , 14, 15, 15, 16
185c0 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38  , 16, 17, 17, 18
185d0 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20  , 18,./*  50 */ 
185e0 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c   19, 19, 20, 20,
185f0 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c   21, 21, 22, 22,
18600 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20   23, 23,./*  60 
18610 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20  */  24, 24, 25, 
18620 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20  25, 26, 26, 27, 
18630 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20  27, 28, 28,./*  
18640 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33  70 */  29, 29, 3
18650 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33  0, 30, 31, 31, 3
18660 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f  2, 32, 33, 33,./
18670 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34  *  80 */  34, 34
18680 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36  , 35, 35, 36, 36
18690 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38  , 37, 37, 38, 38
186a0 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c  ,./*  90 */  39,
186b0 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c   39, 40, 40, 41,
186c0 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c   41, 42, 42, 43,
186d0 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20   43,./* 100 */  
186e0 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20  44, 44, 45, 45, 
186f0 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20  46, 46, 47, 47, 
18700 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a  48, 48,./* 110 *
18710 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35  /  49, 49, 50, 5
18720 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35  0, 51, 51, 52, 5
18730 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32  2, 53, 53,./* 12
18740 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35  0 */  54, 54, 55
18750 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37  , 55, 56, 56, 57
18760 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  , 57.};../*.** R
18770 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68  eturn the length
18780 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72   of the data cor
18790 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
187a0 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61  e supplied seria
187b0 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73  l-type..*/.u32 s
187c0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
187d0 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69  TypeLen(u32 seri
187e0 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20  al_type){.  if( 
187f0 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38  serial_type>=128
18800 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
18810 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
18820 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
18830 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74  assert( serial_t
18840 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20  ype<12 .        
18850 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d      || sqlite3Sm
18860 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
18870 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69  ial_type]==(seri
18880 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20  al_type - 12)/2 
18890 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
188a0 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
188b0 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
188c0 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74  ;.  }.}.u8 sqlit
188d0 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72  e3VdbeOneByteSer
188e0 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65  ialTypeLen(u8 se
188f0 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73  rial_type){.  as
18900 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
18910 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72  e<128 );.  retur
18920 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  n sqlite3SmallTy
18930 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
18940 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ype];  .}../*.**
18950 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e   If we are on an
18960 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69   architecture wi
18970 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  th mixed-endian 
18980 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69  floating .** poi
18990 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74  nts (ex: ARM7) t
189a0 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77  hen swap the low
189b0 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20  er 4 bytes with 
189c0 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20  the .** upper 4 
189d0 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74  bytes.  Return t
189e0 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
189f0 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74   For most archit
18a00 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73  ectures, this is
18a10 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
18a20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20  (later):  It is 
18a30 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74  reported to me t
18a40 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e  hat the mixed-en
18a50 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  dian problem.** 
18a60 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73  on ARM7 is an is
18a70 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f  sue with GCC, no
18a80 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20  t with the ARM7 
18a90 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a  chip.  It seems.
18aa0 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65  ** that early ve
18ab0 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74  rsions of GCC st
18ac0 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72  ored the two wor
18ad0 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a  ds of a 64-bit.*
18ae0 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77  * float in the w
18af0 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64  rong order.  And
18b00 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20   that error has 
18b10 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a  been propagated.
18b20 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20  ** ever since.  
18b30 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74  The blame is not
18b40 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74   necessarily wit
18b50 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a  h GCC, though..*
18b60 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65  * GCC might have
18b70 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68   just copying th
18b80 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61  e problem from a
18b90 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e   prior compiler.
18ba0 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f  .** I am also to
18bb0 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65  ld that newer ve
18bc0 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68  rsions of GCC th
18bd0 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66  at follow a diff
18be0 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74  erent.** ABI get
18bf0 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
18c00 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76  right..**.** Dev
18c10 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51  elopers using SQ
18c20 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20  Lite on an ARM7 
18c30 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61  should compile a
18c40 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20  nd run their.** 
18c50 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e  application usin
18c60 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47  g -DSQLITE_DEBUG
18c70 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  =1 at least once
18c80 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a  .  With DEBUG.**
18c90 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61   enabled, some a
18ca0 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c  sserts below wil
18cb0 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  l ensure that th
18cc0 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a  e byte order of.
18cd0 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
18ce0 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72  t values is corr
18cf0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37  ect..**.** (2007
18d00 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76  -08-30)  Frank v
18d10 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64  an Vugt has stud
18d20 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  ied this problem
18d30 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20   closely.** and 
18d40 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e  has send his fin
18d50 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c  dings to the SQL
18d60 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20  ite developers. 
18d70 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73   Frank.** writes
18d80 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78   that some Linux
18d90 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66   kernels offer f
18da0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61  loating point ha
18db0 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74  rdware.** emulat
18dc0 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e  ion that uses on
18dd0 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73  ly 32-bit mantis
18de0 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61  sas instead of a
18df0 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74   full .** 48-bit
18e00 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79  s as required by
18e10 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61   the IEEE standa
18e20 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  rd.  (This is th
18e30 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f  e.** CONFIG_FPE_
18e40 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29  FASTFPE option.)
18e50 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d    On such system
18e60 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  s, floating poin
18e70 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69  t.** byte swappi
18e80 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20  ng becomes very 
18e90 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f  complicated.  To
18ea0 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c   avoid problems,
18eb0 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72  .** the necessar
18ec0 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  y byte swapping 
18ed0 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75  is carried out u
18ee0 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e  sing a 64-bit in
18ef0 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20  teger.** rather 
18f00 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c  than a 64-bit fl
18f10 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75  oat.  Frank assu
18f20 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20  res us that the 
18f30 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72  code here.** wor
18f40 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c  ks for him.  We,
18f50 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c   the developers,
18f60 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20   have no way to 
18f70 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a  independently.**
18f80 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75   verify this, bu
18f90 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f  t Frank seems to
18fa0 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73   know what he is
18fb0 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a   talking about.*
18fc0 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69  * so we trust hi
18fd0 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
18fe0 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
18ff0 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61  _64BIT_FLOAT.sta
19000 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61  tic u64 floatSwa
19010 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69  p(u64 in){.  uni
19020 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a  on {.    u64 r;.
19030 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20      u32 i[2];.  
19040 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20  } u;.  u32 t;.. 
19050 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d   u.r = in;.  t =
19060 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30   u.i[0];.  u.i[0
19070 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e  ] = u.i[1];.  u.
19080 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75  i[1] = t;.  retu
19090 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69  rn u.r;.}.# defi
190a0 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
190b0 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20  anFloat(X)  X = 
190c0 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c  floatSwap(X).#el
190d0 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  se.# define swap
190e0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
190f0 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
19100 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69  * Write the seri
19110 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62  alized data blob
19120 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
19130 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e  tored in pMem in
19140 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69  to .** buf. It i
19150 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
19160 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
19170 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65  located sufficie
19180 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74  nt space..** Ret
19190 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
191a0 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e  f bytes written.
191b0 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74  .**.** nBuf is t
191c0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61  he amount of spa
191d0 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d  ce left in buf[]
191e0 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  .  The caller is
191f0 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20   responsible.** 
19200 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65  for allocating e
19210 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62  nough space to b
19220 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65  uf[] to hold the
19230 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65   entire field, e
19240 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74  xclusive.** of t
19250 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  he pMem->u.nZero
19260 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d   bytes for a MEM
19270 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a  _Zero value..**.
19280 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
19290 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
192a0 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
192b0 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
192c0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
192d0 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
192e0 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
192f0 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
19300 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
19310 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
19320 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
19330 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20   buf[]..*/ .u32 
19340 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
19350 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65  lPut(u8 *buf, Me
19360 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72  m *pMem, u32 ser
19370 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32  ial_type){.  u32
19380 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
19390 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
193a0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
193b0 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
193c0 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
193d0 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20   v;.    u32 i;. 
193e0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
193f0 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61  pe==7 ){.      a
19400 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29  ssert( sizeof(v)
19410 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  ==sizeof(pMem->u
19420 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  .r) );.      mem
19430 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75  cpy(&v, &pMem->u
19440 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  .r, sizeof(v));.
19450 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
19460 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
19470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19480 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
19490 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
194a0 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54   = sqlite3SmallT
194b0 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
194c0 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72  type];.    asser
194d0 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f  t( i>0 );.    do
194e0 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d  {.      buf[--i]
194f0 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b   = (u8)(v&0xFF);
19500 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a  .      v >>= 8;.
19510 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b      }while( i );
19520 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
19530 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e  .  }..  /* Strin
19540 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69  g or blob */.  i
19550 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
19560 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  12 ){.    assert
19570 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d  ( pMem->n + ((pM
19580 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
19590 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a  Zero)?pMem->u.nZ
195a0 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20  ero:0).         
195b0 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69      == (int)sqli
195c0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
195d0 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
195e0 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  ) );.    len = p
195f0 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20  Mem->n;.    if( 
19600 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62  len>0 ) memcpy(b
19610 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e  uf, pMem->z, len
19620 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65  );.    return le
19630 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c  n;.  }..  /* NUL
19640 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30  L or constants 0
19650 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72   or 1 */.  retur
19660 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74  n 0;.}../* Input
19670 20 22 78 22 20 69 73 20 61 20 73 65 71 75 65 6e   "x" is a sequen
19680 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63  ce of unsigned c
19690 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20 72  haracters that r
196a0 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69  epresent a.** bi
196b0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
196c0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 71  .  Return the eq
196d0 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20  uivalent native 
196e0 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69  integer.*/.#defi
196f0 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28  ne ONE_BYTE_INT(
19700 78 29 20 20 20 20 28 28 69 38 29 28 78 29 5b 30  x)    ((i8)(x)[0
19710 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42  ]).#define TWO_B
19720 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32  YTE_INT(x)    (2
19730 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  56*(i8)((x)[0])|
19740 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[1]).#define 
19750 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78  THREE_BYTE_INT(x
19760 29 20 20 28 36 35 35 33 36 2a 28 69 38 29 28 28  )  (65536*(i8)((
19770 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c  x)[0])|((x)[1]<<
19780 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69  8)|(x)[2]).#defi
19790 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e  ne FOUR_BYTE_UIN
197a0 54 28 78 29 20 20 28 28 28 75 33 32 29 28 78 29  T(x)  (((u32)(x)
197b0 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d  [0]<<24)|((x)[1]
197c0 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38  <<16)|((x)[2]<<8
197d0 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e  )|(x)[3]).#defin
197e0 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28  e FOUR_BYTE_INT(
197f0 78 29 20 28 31 36 37 37 37 32 31 36 2a 28 69 38  x) (16777216*(i8
19800 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31  )((x)[0])|((x)[1
19810 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c  ]<<16)|((x)[2]<<
19820 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a  8)|(x)[3])../*.*
19830 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * Deserialize th
19840 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e  e data blob poin
19850 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73  ted to by buf as
19860 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72   serial type ser
19870 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20  ial_type.** and 
19880 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
19890 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72   in pMem.  Retur
198a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
198b0 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a  bytes read..**.*
198c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
198d0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
198e0 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 72  s two separate r
198f0 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66  outines for perf
19900 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
19910 66 65 77 20 63 61 73 65 73 20 74 68 61 74 20 72  few cases that r
19920 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72  equire local var
19930 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65  iables are broke
19940 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70  n out into a sep
19950 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65  arate.** routine
19960 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74   so that in most
19970 20 63 61 73 65 73 20 74 68 65 20 6f 76 65 72 68   cases the overh
19980 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68  ead of moving th
19990 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a  e stack pointer.
199a0 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a  ** is avoided..*
199b0 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20 53 51  / .static u32 SQ
199c0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65  LITE_NOINLINE se
199d0 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
199e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
199f0 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
19a00 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
19a10 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
19a20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
19a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
19a40 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
19a50 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
19a60 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
19a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
19a80 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
19a90 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
19aa0 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f  .){.  u64 x = FO
19ab0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
19ac0 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55  );.  u32 y = FOU
19ad0 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b  R_BYTE_UINT(buf+
19ae0 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32  4);.  x = (x<<32
19af0 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72  ) + y;.  if( ser
19b00 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20  ial_type==6 ){. 
19b10 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19b20 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32  F: R-29851-52272
19b30 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
19b40 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20  endian 64-bit.  
19b50 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
19b60 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
19b70 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
19b80 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
19b90 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
19ba0 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63  M_Int;.    testc
19bb0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
19bc0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
19bd0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19be0 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56   R-57343-49114 V
19bf0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
19c00 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30  dian IEEE 754-20
19c10 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  08 64-bit.    **
19c20 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
19c30 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21  number. */.#if !
19c40 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
19c50 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
19c60 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
19c70 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56  _POINT).    /* V
19c80 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
19c90 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
19ca0 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
19cb0 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a  e the same.    *
19cc0 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f  * byte order.  O
19cd0 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54  r, that if SQLIT
19ce0 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
19cf0 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20  4BIT_FLOAT is.  
19d00 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61    ** defined tha
19d10 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  t 64-bit floatin
19d20 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72  g point values r
19d30 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a  eally are mixed.
19d40 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20      ** endian.. 
19d50 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63     */.    static
19d60 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20   const u64 t1 = 
19d70 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30  ((u64)0x3ff00000
19d80 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69  )<<32;.    stati
19d90 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72  c const double r
19da0 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34  1 = 1.0;.    u64
19db0 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77   t2 = t1;.    sw
19dc0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
19dd0 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65  at(t2);.    asse
19de0 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d  rt( sizeof(r1)==
19df0 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65  sizeof(t2) && me
19e00 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73  mcmp(&r1, &t2, s
19e10 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b  izeof(r1))==0 );
19e20 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
19e30 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
19e40 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d   && sizeof(pMem-
19e50 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20  >u.r)==8 );.    
19e60 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
19e70 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d  loat(x);.    mem
19e80 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20  cpy(&pMem->u.r, 
19e90 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
19ea0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
19eb0 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70  = sqlite3IsNaN(p
19ec0 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f  Mem->u.r) ? MEM_
19ed0 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b  Null : MEM_Real;
19ee0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b  .  }.  return 8;
19ef0 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  .}.u32 sqlite3Vd
19f00 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63  beSerialGet(.  c
19f10 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
19f20 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
19f30 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
19f40 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
19f50 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19f70 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
19f80 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
19f90 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19fb0 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
19fc0 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
19fd0 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68  o */.){.  switch
19fe0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
19ff0 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20  .    case 10:   
1a000 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
1a010 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
1a020 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20    case 11:   /* 
1a030 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
1a040 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
1a050 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c  ase 0: {  /* Nul
1a060 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  l */.      /* EV
1a070 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30  IDENCE-OF: R-240
1a080 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65 20 69  78-09375 Value i
1a090 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20  s a NULL. */.   
1a0a0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1a0b0 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
1a0c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a0d0 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20    case 1: {.    
1a0e0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1a0f0 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39 36 20  : R-44885-25196 
1a100 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 62 69  Value is an 8-bi
1a110 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  t twos-complemen
1a120 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67  t.      ** integ
1a130 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1a140 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54  m->u.i = ONE_BYT
1a150 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
1a160 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1a170 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
1a180 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1a190 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1a1a0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1a1b0 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
1a1c0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1a1d0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
1a1e0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a1f0 34 39 37 39 34 2d 33 35 30 32 36 20 56 61 6c 75  49794-35026 Valu
1a200 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1a210 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 16-bit.      *
1a220 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1a230 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1a240 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1a250 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  TWO_BYTE_INT(buf
1a260 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
1a270 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1a280 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a290 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
1a2a0 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
1a2b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
1a2c0 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
1a2d0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1a2e0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1a2f0 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 34 33  -OF: R-37839-543
1a300 30 31 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  01 Value is a bi
1a310 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a  g-endian 24-bit.
1a320 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
1a330 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
1a340 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1a350 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54  >u.i = THREE_BYT
1a360 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
1a370 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1a380 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
1a390 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1a3a0 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1a3b0 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20  turn 3;.    }.  
1a3c0 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
1a3d0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1a3e0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
1a3f0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a400 30 31 38 34 39 2d 32 36 30 37 39 20 56 61 6c 75  01849-26079 Valu
1a410 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1a420 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 32-bit.      *
1a430 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1a440 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1a450 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1a460 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62 75  FOUR_BYTE_INT(bu
1a470 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48 50 5f  f);.#ifdef __HP_
1a480 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57 6f 72  cc .      /* Wor
1a490 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67 6e 2d  k around a sign-
1a4a0 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20 69 6e  extension bug in
1a4b0 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c 65 72   the HP compiler
1a4c0 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a 20 20   for HP/UX */.  
1a4d0 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d 26 30      if( buf[0]&0
1a4e0 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e 69 20  x80 ) pMem->u.i 
1a4f0 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38 30 30  |= 0xffffffff800
1a500 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a  00000LL;.#endif.
1a510 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1a520 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1a530 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1a540 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1a550 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
1a560 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
1a570 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
1a580 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1a590 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1a5a0 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20  : R-50385-09674 
1a5b0 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1a5c0 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20  ndian 48-bit.   
1a5d0 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
1a5e0 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
1a5f0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1a600 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  i = FOUR_BYTE_UI
1a610 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69  NT(buf+2) + (((i
1a620 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
1a630 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
1a640 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1a650 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1a660 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1a670 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1a680 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a  return 6;.    }.
1a690 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a      case 6:   /*
1a6a0 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
1a6b0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61  nteger */.    ca
1a6c0 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20  se 7: { /* IEEE 
1a6d0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a  floating point *
1a6e0 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65  /.      /* These
1a6f0 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61   use local varia
1a700 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d  bles, so do them
1a710 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 72   in a separate r
1a720 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
1a730 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20  to avoid having 
1a740 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d  to move the fram
1a750 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  e pointer in the
1a760 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
1a770 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 72        return ser
1a780 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61  ialGet(buf,seria
1a790 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20  l_type,pMem);.  
1a7a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
1a7b0 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
1a7c0 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
1a7d0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
1a7e0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1a7f0 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d  NCE-OF: R-12976-
1a800 32 32 38 39 33 20 56 61 6c 75 65 20 69 73 20 74  22893 Value is t
1a810 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f  he integer 0. */
1a820 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1a830 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31  CE-OF: R-18143-1
1a840 32 31 32 31 20 56 61 6c 75 65 20 69 73 20 74 68  2121 Value is th
1a850 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a  e integer 1. */.
1a860 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1a870 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
1a880 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1a890 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1a8a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a8b0 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
1a8c0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
1a8d0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36  ENCE-OF: R-14606
1a8e0 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69 73 20  -31564 Value is 
1a8f0 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28  a BLOB that is (
1a900 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e  N-12)/2 bytes in
1a910 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68  .      ** length
1a920 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  ..      ** EVIDE
1a930 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d  NCE-OF: R-28401-
1a940 30 30 31 34 30 20 56 61 6c 75 65 20 69 73 20 61  00140 Value is a
1a950 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74   string in the t
1a960 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64  ext encoding and
1a970 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29  .      ** (N-13)
1a980 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  /2 bytes in leng
1a990 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61  th. */.      sta
1a9a0 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46  tic const u16 aF
1a9b0 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c  lag[] = { MEM_Bl
1a9c0 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45  ob|MEM_Ephem, ME
1a9d0 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20  M_Str|MEM_Ephem 
1a9e0 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  };.      pMem->z
1a9f0 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
1aa00 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
1aa10 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
1aa20 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
1aa30 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65  flags = aFlag[se
1aa40 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20  rial_type&1];.  
1aa50 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d      return pMem-
1aa60 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  >n;.    }.  }.  
1aa70 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a  return 0;.}./*.*
1aa80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1aa90 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
1aaa0 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  te sufficient sp
1aab0 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63  ace for an Unpac
1aac0 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
1aad0 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f  ucture large eno
1aae0 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77  ugh to be used w
1aaf0 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52  ith sqlite3VdbeR
1ab00 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66  ecordUnpack() if
1ab10 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
1ab20 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
1ab30 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73  ter to KeyInfo s
1ab40 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66  tructure pKeyInf
1ab50 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61  o..**.** The spa
1ab60 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c  ce is either all
1ab70 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ocated using sql
1ab80 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1ab90 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e  ) or from within
1aba0 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65  .** the unaligne
1abb0 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  d buffer passed 
1abc0 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61  via the second a
1abd0 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  nd third argumen
1abe0 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a  ts (presumably.*
1abf0 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20  * stack space). 
1ac00 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74  If the former, t
1ac10 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73  hen *ppFree is s
1ac20 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20  et to a pointer 
1ac30 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
1ac40 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
1ac50 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1ac60 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
1ac70 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74  Free(). Or, if t
1ac80 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  he .** allocatio
1ac90 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65  n comes from the
1aca0 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20   pSpace/szSpace 
1acb0 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20  buffer, *ppFree 
1acc0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
1acd0 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
1ace0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
1acf0 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
1ad00 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
1ad10 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52  ed..*/.UnpackedR
1ad20 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64  ecord *sqlite3Vd
1ad30 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
1ad40 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f  ecord(.  KeyInfo
1ad50 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1ad60 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63           /* Desc
1ad70 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ription of the r
1ad80 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20  ecord */.  char 
1ad90 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  *pSpace,        
1ada0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1adb0 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76  aligned space av
1adc0 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ailable */.  int
1add0 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20   szSpace,       
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1adf0 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d  Size of pSpace[]
1ae00 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
1ae10 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20  har **ppFree    
1ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ae30 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68  * OUT: Caller sh
1ae40 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70  ould free this p
1ae50 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55  ointer */.){.  U
1ae60 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1ae70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1ae80 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  * Unpacked recor
1ae90 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  d to return */. 
1aea0 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20   int nOff;      
1aeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aec0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53   /* Increment pS
1aed0 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20  pace by nOff to 
1aee0 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e  align it */.  in
1aef0 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
1af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1af10 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1af20 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70   required for *p
1af30 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e   */..  /* We wan
1af40 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70  t to shift the p
1af50 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70  ointer pSpace up
1af60 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73   such that it is
1af70 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e   8-byte aligned.
1af80 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e  .  ** Thus, we n
1af90 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  eed to calculate
1afa0 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20   a value, nOff, 
1afb0 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c  between 0 and 7,
1afc0 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20   to shift .  ** 
1afd0 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63  it by.  If pSpac
1afe0 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62  e is already 8-b
1aff0 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66  yte aligned, nOf
1b000 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f  f should be zero
1b010 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20  ..  */.  nOff = 
1b020 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52  (8 - (SQLITE_PTR
1b030 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20  _TO_INT(pSpace) 
1b040 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79  & 7)) & 7;.  nBy
1b050 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
1b060 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
1b070 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
1b080 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
1b090 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42  eld+1);.  if( nB
1b0a0 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66  yte>szSpace+nOff
1b0b0 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70   ){.    p = (Unp
1b0c0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71  ackedRecord *)sq
1b0d0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1b0e0 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
1b0f0 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72  Byte);.    *ppFr
1b100 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a  ee = (char *)p;.
1b110 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74      if( !p ) ret
1b120 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
1b130 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
1b140 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65  dRecord*)&pSpace
1b150 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46  [nOff];.    *ppF
1b160 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ree = 0;.  }..  
1b170 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29  p->aMem = (Mem*)
1b180 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
1b190 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
1b1a0 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
1b1b0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1b1c0 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1b1d0 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20  ;.  p->pKeyInfo 
1b1e0 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d  = pKeyInfo;.  p-
1b1f0 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e  >nField = pKeyIn
1b200 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a  fo->nField + 1;.
1b210 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1b220 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
1b230 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e  Key-byte encodin
1b240 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e  g of a record in
1b250 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74   pKey[], populat
1b260 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b  e the .** Unpack
1b270 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
1b280 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  re indicated by 
1b290 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
1b2a0 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ent with the.** 
1b2b0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1b2c0 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a  decoded record..
1b2d0 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
1b2e0 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
1b2f0 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
1b300 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e  yInfo,     /* In
1b310 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1b320 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  the record forma
1b330 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
1b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b350 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e   Size of the bin
1b360 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
1b370 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1b380 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69  ,      /* The bi
1b390 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
1b3a0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1b3b0 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c  *p      /* Popul
1b3c0 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ate this structu
1b3d0 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  re before return
1b3e0 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ing. */.){.  con
1b3f0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1b400 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
1b410 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1b420 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a  pKey;.  int d; .
1b430 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20    u32 idx;      
1b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b450 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61    /* Offset in a
1b460 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72  Key[] to read fr
1b470 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20  om */.  u16 u;  
1b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b490 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
1b4a0 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
1b4b0 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
1b4c0 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70  .  Mem *pMem = p
1b4d0 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65  ->aMem;..  p->de
1b4e0 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20  fault_rc = 0;.  
1b4f0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
1b500 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65  TE_ALIGNMENT(pMe
1b510 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65  m) );.  idx = ge
1b520 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
1b530 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
1b540 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20  Hdr;.  u = 0;.  
1b550 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
1b560 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20   && d<=nKey ){. 
1b570 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
1b580 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20  pe;..    idx += 
1b590 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1b5a0 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74  y[idx], serial_t
1b5b0 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ype);.    pMem->
1b5c0 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
1b5d0 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64  enc;.    pMem->d
1b5e0 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
1b5f0 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66  ;.    /* pMem->f
1b600 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c  lags = 0; // sql
1b610 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1b620 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69  t() will set thi
1b630 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  s for us */.    
1b640 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d  pMem->szMalloc =
1b650 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20   0;.    pMem->z 
1b660 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71  = 0;.    d += sq
1b670 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1b680 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72  et(&aKey[d], ser
1b690 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b  ial_type, pMem);
1b6a0 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20  .    pMem++;.   
1b6b0 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e   if( (++u)>=p->n
1b6c0 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20  Field ) break;. 
1b6d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d   }.  assert( u<=
1b6e0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1b6f0 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69   + 1 );.  p->nFi
1b700 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20  eld = u;.}..#if 
1b710 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1b720 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1b730 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e   compares two in
1b740 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63  dex or table rec
1b750 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20  ord keys in the 
1b760 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74  same way.** as t
1b770 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
1b780 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f  cordCompare() ro
1b790 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64  utine. Unlike Vd
1b7a0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1b7b0 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  ),.** this funct
1b7c0 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73  ion deserializes
1b7d0 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61   and compares va
1b7e0 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a  lues using the.*
1b7f0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
1b800 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c  ialGet() and sql
1b810 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29  ite3MemCompare()
1b820 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69   functions. It i
1b830 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73  s used.** in ass
1b840 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1b850 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
1b860 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f  the optimized co
1b870 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  de in.** sqlite3
1b880 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1b890 65 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75  e() returns resu
1b8a0 6c 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74  lts with these t
1b8b0 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a  wo primitives..*
1b8c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1b8d0 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f   if the result o
1b8e0 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  f comparison is 
1b8f0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65  equivalent to de
1b900 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20  siredResult..** 
1b910 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
1b920 74 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67  there is a disag
1b930 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  reement..*/.stat
1b940 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1b950 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20  dCompareDebug(. 
1b960 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1b970 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
1b980 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1b990 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65  const UnpackedRe
1b9a0 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a  cord *pPKey2, /*
1b9b0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
1b9c0 69 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c  int desiredResul
1b9d0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
1b9e0 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   Correct answer 
1b9f0 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
1ba00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1ba10 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1ba20 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
1ba30 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69  ement */.  u32 i
1ba40 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dx1;          /*
1ba50 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
1ba60 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64  y[] of next head
1ba70 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  er element */.  
1ba80 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
1ba90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1baa0 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20  bytes in header 
1bab0 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  */.  int i = 0;.
1bac0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
1bad0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1bae0 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
1baf0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1bb00 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
1bb10 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
1bb20 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
1bb30 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
1bb40 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66  ->pKeyInfo;.  if
1bb50 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d  ( pKeyInfo->db==
1bb60 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1bb70 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
1bb80 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
1bb90 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
1bba0 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c  db;.  /* mem1.fl
1bbb0 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c  ags = 0;  // Wil
1bbc0 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
1bbd0 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53   by sqlite3VdbeS
1bbe0 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20  erialGet() */.  
1bbf0 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73  VVA_ONLY( mem1.s
1bc00 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
1bc10 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
1bc20 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1bc30 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  ents */..  /* Co
1bc40 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70  mpilers may comp
1bc50 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75  lain that mem1.u
1bc60 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  .i is potentiall
1bc70 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  y uninitialized.
1bc80 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69  .  ** We could i
1bc90 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73  nitialize it, as
1bca0 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20   shown here, to 
1bcb0 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f  silence those co
1bcc0 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42  mplaints..  ** B
1bcd0 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31  ut in fact, mem1
1bce0 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20  .u.i will never 
1bcf0 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64  actually be used
1bd00 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20   uninitialized, 
1bd10 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20  and doing .  ** 
1bd20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  the unnecessary 
1bd30 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  initialization h
1bd40 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20  as a measurable 
1bd50 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d  negative perform
1bd60 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74  ance.  ** impact
1bd70 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  , since this rou
1bd80 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68  tine is a very h
1bd90 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64  igh runner.  And
1bda0 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20   so, we choose. 
1bdb0 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68   ** to ignore th
1bdc0 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
1bdd0 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ngs and leave th
1bde0 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e  is variable unin
1bdf0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
1be00 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d    /*  mem1.u.i =
1be10 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64   0;  // not need
1be20 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
1be30 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
1be40 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78  ning */.  .  idx
1be50 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
1be60 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
1be70 20 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33    if( szHdr1>983
1be80 30 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  07 ) return SQLI
1be90 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31  TE_CORRUPT;.  d1
1bea0 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73   = szHdr1;.  ass
1beb0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ert( pKeyInfo->n
1bec0 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e  Field+pKeyInfo->
1bed0 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  nXField>=pPKey2-
1bee0 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55  >nField || CORRU
1bef0 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
1bf00 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
1bf10 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1bf20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1bf30 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  ->nField>0 );.  
1bf40 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a  assert( idx1<=sz
1bf50 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Hdr1 || CORRUPT_
1bf60 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  DB );.  do{.    
1bf70 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
1bf80 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
1bf90 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
1bfa0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
1bfb0 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
1bfc0 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
1bfd0 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b   getVarint32( aK
1bfe0 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
1bff0 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f  _type1 );..    /
1c000 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
1c010 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65  ere is enough ke
1c020 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e  y space remainin
1c030 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a  g to avoid.    *
1c040 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72  * a buffer overr
1c050 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65  ead.  The "d1+se
1c060 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75  rial_type1+2" su
1c070 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c  bexpression will
1c080 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62  .    ** always b
1c090 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
1c0a0 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
1c0b0 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65  mount of require
1c0c0 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20  d key space..   
1c0d0 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70   ** Use that app
1c0e0 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76  roximation to av
1c0f0 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70  oid the more exp
1c100 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20  ensive call to. 
1c110 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62     ** sqlite3Vdb
1c120 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
1c130 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
1c140 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1c150 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79  if( d1+serial_ty
1c160 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31  pe1+2>(u32)nKey1
1c170 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69  .     && d1+sqli
1c180 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1c190 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
1c1a0 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20  1)>(u32)nKey1 . 
1c1b0 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
1c1c0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1c1d0 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
1c1e0 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
1c1f0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
1c200 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
1c210 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1c220 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1c230 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20  e1, &mem1);..   
1c240 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
1c250 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
1c260 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
1c270 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
1c280 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c  pPKey2->aMem[i],
1c290 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1c2a0 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
1c2b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
1c2c0 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1c2d0 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
1c2e0 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
1c2f0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  /.      if( pKey
1c300 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1c310 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [i] ){.        r
1c320 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76  c = -rc;  /* Inv
1c330 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66  ert the result f
1c340 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64  or DESC sort ord
1c350 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  er. */.      }. 
1c360 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43       goto debugC
1c370 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d  ompareEnd;.    }
1c380 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69  .    i++;.  }whi
1c390 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
1c3a0 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
1c3b0 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  eld );..  /* No 
1c3c0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1c3d0 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
1c3e0 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
1c3f0 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
1c400 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1c410 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
1c420 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
1c430 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
1c440 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
1c450 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
1c460 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
1c470 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a  Release(&mem1)..
1c480 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
1c490 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
1c4a0 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68  );..  /* rc==0 h
1c4b0 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
1c4c0 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  ne of the keys r
1c4d0 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
1c4e0 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68   and.  ** all th
1c4f0 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
1c500 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
1c510 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65  qual. Return the
1c520 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a   default_rc.  **
1c530 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63   value.  */.  rc
1c540 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
1c550 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d  lt_rc;..debugCom
1c560 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64  pareEnd:.  if( d
1c570 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20  esiredResult==0 
1c580 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72  && rc==0 ) retur
1c590 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72  n 1;.  if( desir
1c5a0 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63  edResult<0 && rc
1c5b0 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
1c5c0 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75   if( desiredResu
1c5d0 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72  lt>0 && rc>0 ) r
1c5e0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43  eturn 1;.  if( C
1c5f0 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
1c600 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79  rn 1;.  if( pKey
1c610 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
1c620 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
1c630 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
1c640 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1c650 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
1c660 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
1c670 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e   of fields (a.k.
1c680 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74  a. columns) in t
1c690 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20  he record given 
1c6a0 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e  by.** pKey,nKey.
1c6b0 20 20 54 68 65 20 76 65 72 69 66 79 20 74 68 61    The verify tha
1c6c0 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73 20  t this count is 
1c6d0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1c6e0 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d  al to the.** lim
1c6f0 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65 79  it given by pKey
1c700 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70  Info->nField + p
1c710 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1c720 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
1c730 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f  constraint is no
1c740 74 20 73 61 74 69 73 66 69 65 64 2c 20 69 74 20  t satisfied, it 
1c750 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 68  means that the h
1c760 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62  igh-speed.** vdb
1c770 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1c780 74 28 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f  t() and vdbeReco
1c790 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
1c7a0 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a  ) routines will.
1c7b0 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ** not work corr
1c7c0 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20  ectly.  If this 
1c7d0 61 73 73 65 72 74 28 29 20 65 76 65 72 20 66 69  assert() ever fi
1c7e0 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79  res, it probably
1c7f0 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74   means.** that t
1c800 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c  he KeyInfo.nFiel
1c810 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 58 46  d or KeyInfo.nXF
1c820 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65  ield values were
1c830 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63   computed.** inc
1c840 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61  orrectly..*/.sta
1c850 74 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 73  tic void vdbeAss
1c860 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
1c870 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74  hinLimits(.  int
1c880 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69   nKey, const voi
1c890 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68  d *pKey,   /* Th
1c8a0 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69  e record to veri
1c8b0 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b  fy */ .  const K
1c8c0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1c8d0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
1c8e0 65 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 73  e size with this
1c8f0 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20   KeyInfo */.){. 
1c900 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b   int nField = 0;
1c910 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20  .  u32 szHdr;.  
1c920 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e  u32 idx;.  u32 n
1c930 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20  otUsed;.  const 
1c940 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1c950 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  Key = (const uns
1c960 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79  igned char*)pKey
1c970 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54  ;..  if( CORRUPT
1c980 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  _DB ) return;.  
1c990 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33  idx = getVarint3
1c9a0 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a  2(aKey, szHdr);.
1c9b0 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d    assert( nKey>=
1c9c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
1c9d0 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20  zHdr<=(u32)nKey 
1c9e0 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  );.  while( idx<
1c9f0 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78  szHdr ){.    idx
1ca00 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1ca10 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65  aKey+idx, notUse
1ca20 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b  d);.    nField++
1ca30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1ca40 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e  nField <= pKeyIn
1ca50 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49  fo->nField+pKeyI
1ca60 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29 3b 0a  nfo->nXField );.
1ca70 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1ca80 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
1ca90 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
1caa0 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a  s(A,B,C).#endif.
1cab0 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65  ./*.** Both *pMe
1cac0 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f  m1 and *pMem2 co
1cad0 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c  ntain string val
1cae0 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65  ues. Compare the
1caf0 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75   two values.** u
1cb00 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
1cb10 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
1cb20 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74  l. As usual, ret
1cb30 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c  urn a negative ,
1cb40 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
1cb50 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70  tive value if *p
1cb60 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61  Mem1 is less tha
1cb70 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67  n, equal to or g
1cb80 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20  reater than .** 
1cb90 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69  *pMem2, respecti
1cba0 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e  vely. Similar in
1cbb0 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d   spirit to "rc =
1cbc0 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d   (*pMem1) - (*pM
1cbd0 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69  em2);"..*/.stati
1cbe0 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72  c int vdbeCompar
1cbf0 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f  eMemString(.  co
1cc00 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a  nst Mem *pMem1,.
1cc10 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
1cc20 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c  m2,.  const Coll
1cc30 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38  Seq *pColl,.  u8
1cc40 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 20   *prcErr        
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cc60 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72   If an OOM occur
1cc70 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  s, set to SQLITE
1cc80 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69  _NOMEM */.){.  i
1cc90 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  f( pMem1->enc==p
1cca0 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20  Coll->enc ){.   
1ccb0 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20   /* The strings 
1ccc0 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74  are already in t
1ccd0 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64  he correct encod
1cce0 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20  ing.  Call the. 
1ccf0 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
1cd00 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63  n function direc
1cd10 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  tly */.    retur
1cd20 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  n pColl->xCmp(pC
1cd30 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31  oll->pUser,pMem1
1cd40 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65  ->n,pMem1->z,pMe
1cd50 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b  m2->n,pMem2->z);
1cd60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1cd70 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20  t rc;.    const 
1cd80 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20  void *v1, *v2;. 
1cd90 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20     int n1, n2;. 
1cda0 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d     Mem c1;.    M
1cdb0 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74  em c2;.    sqlit
1cdc0 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63  e3VdbeMemInit(&c
1cdd0 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45  1, pMem1->db, ME
1cde0 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c  M_Null);.    sql
1cdf0 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1ce00 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20  &c2, pMem1->db, 
1ce10 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  MEM_Null);.    s
1ce20 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
1ce30 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d  llowCopy(&c1, pM
1ce40 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  em1, MEM_Ephem);
1ce50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ce60 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26  MemShallowCopy(&
1ce70 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45  c2, pMem2, MEM_E
1ce80 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20  phem);.    v1 = 
1ce90 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
1cea0 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
1ceb0 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c1, pColl->enc
1cec0 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d  );.    n1 = v1==
1ced0 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20  0 ? 0 : c1.n;.  
1cee0 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61    v2 = sqlite3Va
1cef0 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1cf00 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f  _value*)&c2, pCo
1cf10 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 32  ll->enc);.    n2
1cf20 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20 63   = v2==0 ? 0 : c
1cf30 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70 43  2.n;.    rc = pC
1cf40 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
1cf50 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20  >pUser, n1, v1, 
1cf60 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 69 66 28  n2, v2);.    if(
1cf70 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30   (v1==0 || v2==0
1cf80 29 20 26 26 20 70 72 63 45 72 72 20 29 20 2a 70  ) && prcErr ) *p
1cf90 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e  rcErr = SQLITE_N
1cfa0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73  OMEM_BKPT;.    s
1cfb0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1cfc0 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73  ease(&c1);.    s
1cfd0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1cfe0 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72  ease(&c2);.    r
1cff0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a  eturn rc;.  }.}.
1d000 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
1d010 20 70 42 6c 6f 62 20 69 73 20 67 75 61 72 61 6e   pBlob is guaran
1d020 74 65 65 64 20 74 6f 20 62 65 20 61 20 42 6c 6f  teed to be a Blo
1d030 62 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6d 61  b that is not ma
1d040 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d 45 4d  rked.** with MEM
1d050 5f 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 74  _Zero.  Return t
1d060 72 75 65 20 69 66 20 69 74 20 63 6f 75 6c 64 20  rue if it could 
1d070 62 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a  be a zero-blob..
1d080 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
1d090 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20 63 68  AllZero(const ch
1d0a0 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
1d0b0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1d0c0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
1d0d0 20 20 69 66 28 20 7a 5b 69 5d 20 29 20 72 65 74    if( z[i] ) ret
1d0e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
1d0f0 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
1d100 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62  Compare two blob
1d110 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74  s.  Return negat
1d120 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
1d130 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
1d140 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74  rst.** is less t
1d150 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
1d160 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1d170 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65  he second, respe
1d180 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f  ctively..** If o
1d190 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65  ne blob is a pre
1d1a0 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72  fix of the other
1d1b0 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74  , then the short
1d1c0 65 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72  er is the lessor
1d1d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
1d1e0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
1d1f0 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61  sqlite3BlobCompa
1d200 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42  re(const Mem *pB
1d210 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42  1, const Mem *pB
1d220 32 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69  2){.  int c;.  i
1d230 6e 74 20 6e 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a  nt n1 = pB1->n;.
1d240 20 20 69 6e 74 20 6e 32 20 3d 20 70 42 32 2d 3e    int n2 = pB2->
1d250 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 70  n;..  /* It is p
1d260 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20  ossible to have 
1d270 61 20 42 6c 6f 62 20 76 61 6c 75 65 20 74 68 61  a Blob value tha
1d280 74 20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a  t has some non-z
1d290 65 72 6f 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a  ero content.  **
1d2a0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72   followed by zer
1d2b0 6f 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 20  o content.  But 
1d2c0 74 68 61 74 20 6f 6e 6c 79 20 63 6f 6d 65 73 20  that only comes 
1d2d0 75 70 20 66 6f 72 20 42 6c 6f 62 73 20 66 6f 72  up for Blobs for
1d2e0 6d 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  med.  ** by the 
1d2f0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
1d300 63 6f 64 65 2c 20 61 6e 64 20 73 75 63 68 20 42  code, and such B
1d310 6c 6f 62 73 20 6e 65 76 65 72 20 67 65 74 20 70  lobs never get p
1d320 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  assed into.  ** 
1d330 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
1d340 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  e(). */.  assert
1d350 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 20 26 20  ( (pB1->flags & 
1d360 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20  MEM_Zero)==0 || 
1d370 6e 31 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  n1==0 );.  asser
1d380 74 28 20 28 70 42 32 2d 3e 66 6c 61 67 73 20 26  t( (pB2->flags &
1d390 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c   MEM_Zero)==0 ||
1d3a0 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28   n2==0 );..  if(
1d3b0 20 28 70 42 31 2d 3e 66 6c 61 67 73 7c 70 42 32   (pB1->flags|pB2
1d3c0 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 5a  ->flags) & MEM_Z
1d3d0 65 72 6f 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ero ){.    if( p
1d3e0 42 31 2d 3e 66 6c 61 67 73 20 26 20 70 42 32 2d  B1->flags & pB2-
1d3f0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1d400 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  o ){.      retur
1d410 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d  n pB1->u.nZero -
1d420 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20   pB2->u.nZero;. 
1d430 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 31     }else if( pB1
1d440 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
1d450 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ro ){.      if( 
1d460 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e  !isAllZero(pB2->
1d470 7a 2c 20 70 42 32 2d 3e 6e 29 20 29 20 72 65 74  z, pB2->n) ) ret
1d480 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  urn -1;.      re
1d490 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72  turn pB1->u.nZer
1d4a0 6f 20 2d 20 6e 32 3b 0a 20 20 20 20 7d 65 6c 73  o - n2;.    }els
1d4b0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  e{.      if( !is
1d4c0 41 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a 2c 20  AllZero(pB1->z, 
1d4d0 70 42 31 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e  pB1->n) ) return
1d4e0 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   +1;.      retur
1d4f0 6e 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a  n n1 - pB2->u.nZ
1d500 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ero;.    }.  }. 
1d510 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d   c = memcmp(pB1-
1d520 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e  >z, pB2->z, n1>n
1d530 32 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a 20 20  2 ? n2 : n1);.  
1d540 69 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63  if( c ) return c
1d550 3b 0a 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20  ;.  return n1 - 
1d560 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  n2;.}../*.** Do 
1d570 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74  a comparison bet
1d580 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20 73 69  ween a 64-bit si
1d590 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64  gned integer and
1d5a0 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69   a 64-bit floati
1d5b0 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62  ng-point.** numb
1d5c0 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61  er.  Return nega
1d5d0 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
1d5e0 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66  ositive if the f
1d5f0 69 72 73 74 20 28 69 36 34 29 20 69 73 20 6c 65  irst (i64) is le
1d600 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61  ss than,.** equa
1d610 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
1d620 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64   than the second
1d630 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74   (double)..*/.st
1d640 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
1d650 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
1d660 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20 72 29  i64 i, double r)
1d670 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c  {.  if( sizeof(L
1d680 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e  ONGDOUBLE_TYPE)>
1d690 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55  8 ){.    LONGDOU
1d6a0 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f  BLE_TYPE x = (LO
1d6b0 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b  NGDOUBLE_TYPE)i;
1d6c0 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29 20 72  .    if( x<r ) r
1d6d0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66  eturn -1;.    if
1d6e0 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e 20 2b  ( x>r ) return +
1d6f0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
1d700 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36  .  }else{.    i6
1d710 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  4 y;.    double 
1d720 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d 39 32  s;.    if( r<-92
1d730 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
1d740 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  8.0 ) return +1;
1d750 0a 20 20 20 20 69 66 28 20 72 3e 39 32 32 33 33  .    if( r>92233
1d760 37 32 30 33 36 38 35 34 37 37 35 38 30 37 2e 30  72036854775807.0
1d770 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1d780 20 20 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20    y = (i64)r;.  
1d790 20 20 69 66 28 20 69 3c 79 20 29 20 72 65 74 75    if( i<y ) retu
1d7a0 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69  rn -1;.    if( i
1d7b0 3e 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >y ){.      if( 
1d7c0 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36  y==SMALLEST_INT6
1d7d0 34 20 26 26 20 72 3e 30 2e 30 20 29 20 72 65 74  4 && r>0.0 ) ret
1d7e0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  urn -1;.      re
1d7f0 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 7d 0a 20  turn +1;.    }. 
1d800 20 20 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69     s = (double)i
1d810 3b 0a 20 20 20 20 69 66 28 20 73 3c 72 20 29 20  ;.    if( s<r ) 
1d820 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69  return -1;.    i
1d830 66 28 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20  f( s>r ) return 
1d840 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  +1;.    return 0
1d850 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1d860 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65  ompare the value
1d870 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74  s contained by t
1d880 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65  he two memory ce
1d890 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a  lls, returning.*
1d8a0 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  * negative, zero
1d8b0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
1d8c0 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68  pMem1 is less th
1d8d0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
1d8e0 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e   greater.** than
1d8f0 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20   pMem2. Sorting 
1d900 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20  order is NULL's 
1d910 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20  first, followed 
1d920 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65  by numbers (inte
1d930 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c  gers.** and real
1d940 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69  s) sorted numeri
1d950 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20  cally, followed 
1d960 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64 20  by text ordered 
1d970 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  by the collating
1d980 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f  .** sequence pCo
1d990 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62  ll and finally b
1d9a0 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62 79  lob's ordered by
1d9b0 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a   memcmp()..**.**
1d9c0 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73   Two NULL values
1d9d0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
1d9e0 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66 75  equal by this fu
1d9f0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
1da00 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1da10 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d  (const Mem *pMem
1da20 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  1, const Mem *pM
1da30 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  em2, const CollS
1da40 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e  eq *pColl){.  in
1da50 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20  t f1, f2;.  int 
1da60 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a  combined_flags;.
1da70 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66  .  f1 = pMem1->f
1da80 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65  lags;.  f2 = pMe
1da90 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d  m2->flags;.  com
1daa0 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31  bined_flags = f1
1dab0 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28  |f2;.  assert( (
1dac0 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26  combined_flags &
1dad0 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20   MEM_RowSet)==0 
1dae0 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65  );. .  /* If one
1daf0 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20   value is NULL, 
1db00 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
1db10 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f  the other. If bo
1db20 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61  th values.  ** a
1db30 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  re NULL, return 
1db40 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  0..  */.  if( co
1db50 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d  mbined_flags&MEM
1db60 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
1db70 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c  urn (f2&MEM_Null
1db80 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c  ) - (f1&MEM_Null
1db90 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  );.  }..  /* At 
1dba0 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
1dbb0 20 74 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61   two values is a
1dbc0 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69   number.  */.  i
1dbd0 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
1dbe0 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  s&(MEM_Int|MEM_R
1dbf0 65 61 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20  eal) ){.    if( 
1dc00 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49  (f1 & f2 & MEM_I
1dc10 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
1dc20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c  if( pMem1->u.i <
1dc30 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65   pMem2->u.i ) re
1dc40 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69  turn -1;.      i
1dc50 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20  f( pMem1->u.i > 
1dc60 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
1dc70 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65  urn +1;.      re
1dc80 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1dc90 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26    if( (f1 & f2 &
1dca0 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b   MEM_Real)!=0 ){
1dcb0 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1dcc0 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75  ->u.r < pMem2->u
1dcd0 2e 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .r ) return -1;.
1dce0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1dcf0 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e  >u.r > pMem2->u.
1dd00 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
1dd10 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1dd20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
1dd30 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a  &MEM_Int)!=0 ){.
1dd40 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45        if( (f2&ME
1dd50 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Real)!=0 ){.  
1dd60 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1dd70 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
1dd80 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20  are(pMem1->u.i, 
1dd90 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20  pMem2->u.r);.   
1dda0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ddb0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1ddc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1ddd0 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29  f( (f1&MEM_Real)
1dde0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1ddf0 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f2&MEM_Int)!=0
1de00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1de10 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c  rn -sqlite3IntFl
1de20 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32  oatCompare(pMem2
1de30 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e  ->u.i, pMem1->u.
1de40 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
1de50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1de60 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
1de70 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b  }.    return +1;
1de80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  .  }..  /* If on
1de90 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72  e value is a str
1dea0 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65  ing and the othe
1deb0 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65  r is a blob, the
1dec0 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e   string is less.
1ded0 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72  .  ** If both ar
1dee0 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61  e strings, compa
1def0 72 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  re using the col
1df00 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lating functions
1df10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
1df20 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f  bined_flags&MEM_
1df30 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28  Str ){.    if( (
1df40 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30  f1 & MEM_Str)==0
1df50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1df60 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
1df70 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29  ( (f2 & MEM_Str)
1df80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
1df90 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20  urn -1;.    }.. 
1dfa0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31     assert( pMem1
1dfb0 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e  ->enc==pMem2->en
1dfc0 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e  c || pMem1->db->
1dfd0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1dfe0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
1dff0 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1e000 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  TF8 || .        
1e010 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d      pMem1->enc==
1e020 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c  SQLITE_UTF16LE |
1e030 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51  | pMem1->enc==SQ
1e040 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a  LITE_UTF16BE );.
1e050 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c  .    /* The coll
1e060 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d  ation sequence m
1e070 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61  ust be defined a
1e080 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76  t this point, ev
1e090 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65  en if.    ** the
1e0a0 20 75 73 65 72 20 64 65 6c 65 74 65 73 20 74 68   user deletes th
1e0b0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1e0c0 65 6e 63 65 20 61 66 74 65 72 20 74 68 65 20 76  ence after the v
1e0d0 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20  dbe program is. 
1e0e0 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28     ** compiled (
1e0f0 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77  this was not alw
1e100 61 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20  ays the case).. 
1e110 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1e120 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c  ( !pColl || pCol
1e130 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20  l->xCmp );..    
1e140 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
1e150 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f     return vdbeCo
1e160 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70  mpareMemString(p
1e170 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f  Mem1, pMem2, pCo
1e180 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 0);.    }.  
1e190 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70    /* If a NULL p
1e1a0 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65  ointer was passe
1e1b0 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65  d as the collate
1e1c0 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20   function, fall 
1e1d0 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74  through.    ** t
1e1e0 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20  o the blob case 
1e1f0 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29  and use memcmp()
1e200 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a  .  */.  }. .  /*
1e210 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73   Both values mus
1e220 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d  t be blobs.  Com
1e230 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d  pare using memcm
1e240 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  p().  */.  retur
1e250 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d  n sqlite3BlobCom
1e260 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d  pare(pMem1, pMem
1e270 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  2);.}.../*.** Th
1e280 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1e290 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1e2a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65  function is a se
1e2b0 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a  rial-type that.*
1e2c0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  * corresponds to
1e2d0 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c   an integer - al
1e2e0 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  l values between
1e2f0 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69   1 and 9 inclusi
1e300 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e  ve .** except 7.
1e310 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e   The second poin
1e320 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
1e330 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74  ontaining an int
1e340 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65  eger value.** se
1e350 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69  rialized accordi
1e360 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70  ng to serial_typ
1e370 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
1e380 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a   deserializes.**
1e390 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
1e3a0 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
1e3b0 63 20 69 36 34 20 76 64 62 65 52 65 63 6f 72 64  c i64 vdbeRecord
1e3c0 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65  DecodeInt(u32 se
1e3d0 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74  rial_type, const
1e3e0 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33   u8 *aKey){.  u3
1e3f0 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43  2 y;.  assert( C
1e400 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65  ORRUPT_DB || (se
1e410 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20  rial_type>=1 && 
1e420 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26  serial_type<=9 &
1e430 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37  & serial_type!=7
1e440 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  ) );.  switch( s
1e450 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
1e460 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61    case 0:.    ca
1e470 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74  se 1:.      test
1e480 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1e490 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1e4a0 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28  rn ONE_BYTE_INT(
1e4b0 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
1e4c0 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  2:.      testcas
1e4d0 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1e4e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e4f0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1e500 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a  y);.    case 3:.
1e510 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e520 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1e530 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 52        return THR
1e540 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  EE_BYTE_INT(aKey
1e550 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b  );.    case 4: {
1e560 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e570 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1e580 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f  .      y = FOUR_
1e590 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1e5a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69  .      return (i
1e5b0 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20  64)*(int*)&y;.  
1e5c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
1e5d0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1e5e0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1e5f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 46  ;.      return F
1e600 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1e610 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  ey+2) + (((i64)1
1e620 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
1e630 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d  INT(aKey);.    }
1e640 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20  .    case 6: {. 
1e650 20 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55       u64 x = FOU
1e660 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1e670 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e680 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1e690 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
1e6a0 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45  <32) | FOUR_BYTE
1e6b0 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20  _UINT(aKey+4);. 
1e6c0 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34       return (i64
1e6d0 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20  )*(i64*)&x;.    
1e6e0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1e6f0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38  (serial_type - 8
1e700 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1e710 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
1e720 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
1e730 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
1e740 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66  ecords.** specif
1e750 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70  ied by {nKey1, p
1e760 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32  Key1} and pPKey2
1e770 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20  .  It returns a 
1e780 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a  negative, zero.*
1e790 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e  * or positive in
1e7a0 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73  teger if key1 is
1e7b0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1e7c0 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61  l to or .** grea
1e7d0 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20  ter than key2.  
1e7e0 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79  The {nKey1, pKey
1e7f0 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  1} key must be a
1e800 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64   blob.** created
1e810 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
1e820 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
1e830 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70  the VDBE.  The p
1e840 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73  PKey2.** key mus
1e850 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65  t be a parsed ke
1e860 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e  y such as obtain
1e870 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
1e880 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72  e3VdbeParseRecor
1e890 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
1e8a0 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f  ment bSkip is no
1e8b0 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73  n-zero, it is as
1e8c0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
1e8d0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1e8e0 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20  y.** determined 
1e8f0 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 66  that the first f
1e900 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79  ields of the key
1e910 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a  s are equal..**.
1e920 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32  ** Key1 and Key2
1e930 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
1e940 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65  contain the same
1e950 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1e960 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69  s. If all .** fi
1e970 65 6c 64 73 20 74 68 61 74 20 61 70 70 65 61 72  elds that appear
1e980 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72   in both keys ar
1e990 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50  e equal, then pP
1e9a0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1e9b0 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
1e9c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62  ..**.** If datab
1e9d0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
1e9e0 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65  s discovered, se
1e9f0 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64  t pPKey2->errCod
1ea00 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  e to .** SQLITE_
1ea10 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74 75  CORRUPT and retu
1ea20 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  rn 0. If an OOM 
1ea30 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1ea40 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32  ered, .** pPKey2
1ea50 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  ->errCode is set
1ea60 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   to SQLITE_NOMEM
1ea70 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e   and, if it is n
1ea80 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20  ot NULL, the.** 
1ea90 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c  malloc-failed fl
1eaa0 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61  ag set on databa
1eab0 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79  se handle (pPKey
1eac0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29  2->pKeyInfo->db)
1ead0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1eae0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1eaf0 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74  eWithSkip(.  int
1eb00 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1eb10 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20  id *pKey1,   /* 
1eb20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
1eb30 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1eb40 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a  Key2,         /*
1eb50 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
1eb60 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20  int bSkip       
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb80 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70  /* If true, skip
1eb90 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1eba0 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b   */.){.  u32 d1;
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1ebd0 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
1ebe0 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
1ebf0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ent */.  int i; 
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1ec20 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20  x of next field 
1ec30 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
1ec40 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec60 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72  /* Size of recor
1ec70 64 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65  d header in byte
1ec80 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  s */.  u32 idx1;
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eca0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1ecb0 20 6f 66 20 66 69 72 73 74 20 74 79 70 65 20 69   of first type i
1ecc0 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
1ecd0 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
1ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ecf0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
1ed00 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70  .  Mem *pRhs = p
1ed10 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20  PKey2->aMem;    
1ed20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64     /* Next field
1ed30 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f   of pPKey2 to co
1ed40 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e  mpare */.  KeyIn
1ed50 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
1ed60 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b  PKey2->pKeyInfo;
1ed70 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1ed80 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
1ed90 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1eda0 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
1edb0 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20  Mem mem1;..  /* 
1edc0 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65  If bSkip is true
1edd0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
1ede0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65  r has already de
1edf0 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68  termined that th
1ee00 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f  e first.  ** two
1ee10 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
1ee20 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
1ee30 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73   Fix the various
1ee40 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73   stack variables
1ee50 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68   so.  ** that th
1ee60 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e  is routine begin
1ee70 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74  s comparing at t
1ee80 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e  he second field.
1ee90 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20   */.  if( bSkip 
1eea0 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20  ){.    u32 s1;. 
1eeb0 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65     idx1 = 1 + ge
1eec0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1eed0 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a  [1], s1);.    sz
1eee0 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b  Hdr1 = aKey1[0];
1eef0 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
1ef00 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   + sqlite3VdbeSe
1ef10 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b  rialTypeLen(s1);
1ef20 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20  .    i = 1;.    
1ef30 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  pRhs++;.  }else{
1ef40 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56  .    idx1 = getV
1ef50 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
1ef60 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d  zHdr1);.    d1 =
1ef70 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28   szHdr1;.    if(
1ef80 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b   d1>(unsigned)nK
1ef90 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50  ey1 ){ .      pP
1efa0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
1efb0 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
1efc0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72  PT_BKPT;.      r
1efd0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72  eturn 0;  /* Cor
1efe0 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d  ruption */.    }
1eff0 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a  .    i = 0;.  }.
1f000 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d  .  VVA_ONLY( mem
1f010 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20  1.szMalloc = 0; 
1f020 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64  ) /* Only needed
1f030 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61   by assert() sta
1f040 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73  tements */.  ass
1f050 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1f060 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50  yInfo->nField+pP
1f070 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1f080 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  nXField>=pPKey2-
1f090 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20  >nField .       
1f0a0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1f0b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
1f0c0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  2->pKeyInfo->aSo
1f0d0 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1f0e0 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
1f0f0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1f100 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1f110 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20  idx1<=szHdr1 || 
1f120 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1f130 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69  do{.    u32 seri
1f140 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a  al_type;..    /*
1f150 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67   RHS is an integ
1f160 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52  er */.    if( pR
1f170 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1f180 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72  Int ){.      ser
1f190 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1f1a0 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65  [idx1];.      te
1f1b0 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1f1c0 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1f1d0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1f1e0 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >=10 ){.        
1f1f0 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d  rc = +1;.      }
1f200 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1f210 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  type==0 ){.     
1f220 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1f230 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
1f240 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
1f250 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f260 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1f270 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
1f280 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  pe, &mem1);.    
1f290 20 20 20 20 72 63 20 3d 20 2d 73 71 6c 69 74 65      rc = -sqlite
1f2a0 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1f2b0 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31  (pRhs->u.i, mem1
1f2c0 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  .u.r);.      }el
1f2d0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  se{.        i64 
1f2e0 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64  lhs = vdbeRecord
1f2f0 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c  DecodeInt(serial
1f300 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31  _type, &aKey1[d1
1f310 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20  ]);.        i64 
1f320 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b  rhs = pRhs->u.i;
1f330 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73  .        if( lhs
1f340 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  <rhs ){.        
1f350 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1f360 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73     }else if( lhs
1f370 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  >rhs ){.        
1f380 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1f390 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1f3a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1f3b0 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c  s real */.    el
1f3c0 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1f3d0 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
1f3e0 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1f3f0 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1f400 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1f410 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20  al_type>=10 ){. 
1f420 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
1f430 20 74 79 70 65 73 20 31 32 20 6f 72 20 67 72 65   types 12 or gre
1f440 61 74 65 72 20 61 72 65 20 73 74 72 69 6e 67 73  ater are strings
1f450 20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72 65 61   and blobs (grea
1f460 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 20  ter than.       
1f470 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54 79   ** numbers). Ty
1f480 70 65 73 20 31 30 20 61 6e 64 20 31 31 20 61 72  pes 10 and 11 ar
1f490 65 20 63 75 72 72 65 6e 74 6c 79 20 22 72 65 73  e currently "res
1f4a0 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
1f4b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65   .        ** use
1f4c0 22 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  ", so it doesn't
1f4d0 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 20 77   really matter w
1f4e0 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20  hat the results 
1f4f0 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20  of comparing.   
1f500 20 20 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20       ** them to 
1f510 6e 75 6d 62 65 72 69 63 20 76 61 6c 75 65 73 20  numberic values 
1f520 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  are.  */.       
1f530 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1f540 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
1f550 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _type==0 ){.    
1f560 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1f570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f580 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
1f590 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1f5a0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1f5b0 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20  &mem1);.        
1f5c0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1f5d0 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =7 ){.          
1f5e0 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68  if( mem1.u.r<pRh
1f5f0 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20  s->u.r ){.      
1f600 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1f610 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
1f620 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73  f( mem1.u.r>pRhs
1f630 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20  ->u.r ){.       
1f640 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1f650 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f670 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49     rc = sqlite3I
1f680 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d  ntFloatCompare(m
1f690 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75  em1.u.i, pRhs->u
1f6a0 2e 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  .r);.        }. 
1f6b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f6c0 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74    /* RHS is a st
1f6d0 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65  ring */.    else
1f6e0 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1f6f0 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
1f700 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28      getVarint32(
1f710 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65  &aKey1[idx1], se
1f720 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1f730 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1f740 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1f750 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1f760 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20  type<12 ){.     
1f770 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1f780 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65    }else if( !(se
1f790 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
1f7a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1f7b0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1f7c0 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  e{.        mem1.
1f7d0 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
1f7e0 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20   - 12) / 2;.    
1f7f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1f800 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69  1+mem1.n)==(unsi
1f810 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1f820 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f830 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28  (d1+mem1.n+1)==(
1f840 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1f850 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64  ;.        if( (d
1f860 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73  1+mem1.n) > (uns
1f870 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20  igned)nKey1 ){. 
1f880 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
1f890 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1f8a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1f8b0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  PT;.          re
1f8c0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1f8d0 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70         /* Corrup
1f8e0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1f8f0 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e  }else if( pKeyIn
1f900 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a  fo->aColl[i] ){.
1f910 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65            mem1.e
1f920 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
1f930 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  nc;.          me
1f940 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
1f950 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20  ->db;.          
1f960 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  mem1.flags = MEM
1f970 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20  _Str;.          
1f980 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29  mem1.z = (char*)
1f990 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20  &aKey1[d1];.    
1f9a0 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43        rc = vdbeC
1f9b0 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
1f9c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
1f9d0 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79  mem1, pRhs, pKey
1f9e0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20  Info->aColl[i], 
1f9f0 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65  &pPKey2->errCode
1fa00 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
1fa10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fa20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20         int nCmp 
1fa30 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52  = MIN(mem1.n, pR
1fa40 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  hs->n);.        
1fa50 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61    rc = memcmp(&a
1fa60 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e  Key1[d1], pRhs->
1fa70 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20  z, nCmp);.      
1fa80 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
1fa90 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52  rc = mem1.n - pR
1faa0 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20  hs->n; .        
1fab0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1fac0 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61  .    /* RHS is a
1fad0 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73   blob */.    els
1fae0 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1faf0 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  s & MEM_Blob ){.
1fb00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1fb10 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1fb20 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 70 52 68  _Zero)==0 || pRh
1fb30 73 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  s->n==0 );.     
1fb40 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
1fb50 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61  ey1[idx1], seria
1fb60 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74  l_type);.      t
1fb70 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
1fb80 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
1fb90 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1fba0 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f  e<12 || (serial_
1fbb0 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a  type & 0x01) ){.
1fbc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1fbd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1fbe0 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d        int nStr =
1fbf0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
1fc00 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20  12) / 2;.       
1fc10 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e   testcase( (d1+n
1fc20 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  Str)==(unsigned)
1fc30 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1fc40 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e   testcase( (d1+n
1fc50 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65  Str+1)==(unsigne
1fc60 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1fc70 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29     if( (d1+nStr)
1fc80 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65   > (unsigned)nKe
1fc90 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y1 ){.          
1fca0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1fcb0 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
1fcc0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1fcd0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fcf0 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
1fd00 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1fd10 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1fd20 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
1fd30 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a       if( !isAllZ
1fd40 65 72 6f 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  ero((const char*
1fd50 29 26 61 4b 65 79 31 5b 64 31 5d 2c 6e 53 74 72  )&aKey1[d1],nStr
1fd60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1fd70 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
1fd80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fd90 20 20 20 20 20 20 72 63 20 3d 20 6e 53 74 72 20        rc = nStr 
1fda0 2d 20 70 52 68 73 2d 3e 75 2e 6e 5a 65 72 6f 3b  - pRhs->u.nZero;
1fdb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1fdc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fdd0 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d        int nCmp =
1fde0 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d   MIN(nStr, pRhs-
1fdf0 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  >n);.          r
1fe00 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  c = memcmp(&aKey
1fe10 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20  1[d1], pRhs->z, 
1fe20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nCmp);.         
1fe30 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
1fe40 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e  = nStr - pRhs->n
1fe50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fe60 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1fe70 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f  * RHS is null */
1fe80 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
1fe90 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1fea0 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1feb0 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74    rc = (serial_t
1fec0 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a  ype!=0);.    }..
1fed0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
1fee0 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
1fef0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
1ff00 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
1ff10 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = -rc;.      }.
1ff20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 64        assert( vd
1ff30 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1ff40 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1ff50 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20 29  1, pPKey2, rc) )
1ff60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ff70 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1ff80 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
1ff90 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ent below */.   
1ffa0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ffb0 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20    }..    i++;.  
1ffc0 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31    pRhs++;.    d1
1ffd0 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
1ffe0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
1fff0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69  ial_type);.    i
20000 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61  dx1 += sqlite3Va
20010 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74  rintLen(serial_t
20020 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
20030 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73  idx1<(unsigned)s
20040 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79  zHdr1 && i<pPKey
20050 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c  2->nField && d1<
20060 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
20070 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d   );..  /* No mem
20080 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ory allocation i
20090 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d  s ever used on m
200a0 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73  em1.  Prove this
200b0 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20   using.  ** the 
200c0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
200d0 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65  ().  If the asse
200e0 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69  rt() fails, it i
200f0 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20  ndicates a.  ** 
20100 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20  memory leak and 
20110 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73  a need to call s
20120 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
20130 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f  ease(&mem1).  */
20140 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
20150 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  szMalloc==0 );..
20160 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
20170 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
20180 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65  r both of the ke
20190 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
201a0 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  elds and.  ** al
201b0 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
201c0 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
201d0 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e  re equal. Return
201e0 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a   the default_rc.
201f0 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a    ** value.  */.
20200 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
20210 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  T_DB .       || 
20220 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
20230 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
20240 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b  ey1, pPKey2, pPK
20250 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29  ey2->default_rc)
20260 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79   .       || pKey
20270 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
20280 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70 50  Failed.  );.  pP
20290 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31  Key2->eqSeen = 1
202a0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79  ;.  return pPKey
202b0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d  2->default_rc;.}
202c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
202d0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20  RecordCompare(. 
202e0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
202f0 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20  t void *pKey1,  
20300 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
20310 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
20320 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
20330 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
20340 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  /.){.  return sq
20350 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20360 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
20370 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
20380 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ey2, 0);.}.../*.
20390 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
203a0 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
203b0 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
203c0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
203d0 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20  pare() .** that 
203e0 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (a) the first fi
203f0 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73  eld of pPKey2 is
20400 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64   an integer, and
20410 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a   (b) the .** siz
20420 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
20430 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
20440 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  of (pKey1/nKey1)
20450 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
20460 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20  e.** byte (i.e. 
20470 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38  is less than 128
20480 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  )..**.** To avoi
20490 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74  d concerns about
204a0 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64   buffer overread
204b0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
204c0 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20  is only used.** 
204d0 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72 65  on schemas where
204e0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c   the maximum val
204f0 69 64 20 68 65 61 64 65 72 20 73 69 7a 65 20 69  id header size i
20500 73 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65  s 63 bytes or le
20510 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ss..*/.static in
20520 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
20530 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b  areInt(.  int nK
20540 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
20550 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
20560 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
20570 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
20580 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
20590 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  key */.){.  cons
205a0 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28  t u8 *aKey = &((
205b0 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29  const u8*)pKey1)
205c0 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  [*(const u8*)pKe
205d0 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e  y1 & 0x3F];.  in
205e0 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  t serial_type = 
205f0 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  ((const u8*)pKey
20600 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73  1)[1];.  int res
20610 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34  ;.  u32 y;.  u64
20620 20 78 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 69   x;.  i64 v;.  i
20630 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41  64 lhs;..  vdbeA
20640 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
20650 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79  ithinLimits(nKey
20660 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
20670 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61  ->pKeyInfo);.  a
20680 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b  ssert( (*(u8*)pK
20690 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f  ey1)<=0x3F || CO
206a0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77  RRUPT_DB );.  sw
206b0 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
206c0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a  e ){.    case 1:
206d0 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
206e0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
206f0 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42       lhs = ONE_B
20700 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
20710 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
20720 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
20730 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20740 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
20750 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
20760 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
20770 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b   TWO_BYTE_INT(aK
20780 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
20790 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
207a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
207b0 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
207c0 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
207d0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
207e0 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54   lhs = THREE_BYT
207f0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
20800 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
20810 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
20820 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
20830 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
20840 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
20850 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  */.      y = FOU
20860 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
20870 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28  );.      lhs = (
20880 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20  i64)*(int*)&y;. 
20890 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
208a0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
208b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
208c0 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
208d0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
208e0 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
208f0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
20900 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34  aKey+2) + (((i64
20910 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
20920 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
20930 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
20940 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
20950 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
20960 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65  e 6: { /* 8-byte
20970 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
20980 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55  */.      x = FOU
20990 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
209a0 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
209b0 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45  <32) | FOUR_BYTE
209c0 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20  _UINT(aKey+4);. 
209d0 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34       lhs = *(i64
209e0 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&x;.      test
209f0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
20a00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20a10 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20  }.    case 8: . 
20a20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20       lhs = 0;.  
20a30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
20a40 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73  ase 9:.      lhs
20a50 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
20a60 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  k;..    /* This 
20a70 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65  case could be re
20a80 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68  moved without ch
20a90 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c  anging the resul
20aa0 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20  ts of running.  
20ab0 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20    ** this code. 
20ac0 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75  Including it cau
20ad0 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72  ses gcc to gener
20ae0 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69  ate a faster swi
20af0 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74  tch .    ** stat
20b00 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65  ement (since the
20b10 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68   range of switch
20b20 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61   targets now sta
20b30 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a  rts at zero and.
20b40 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67      ** is contig
20b50 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e  uous) but does n
20b60 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70  ot cause any dup
20b70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62  licate code to b
20b80 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20  e generated.    
20b90 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c  ** (as gcc is cl
20ba0 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63  ever enough to c
20bb0 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c  ombine the two l
20bc0 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65  ike cases). Othe
20bd0 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  r .    ** compil
20be0 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d  ers might be sim
20bf0 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63  ilar.  */ .    c
20c00 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20  ase 0: case 7:. 
20c10 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
20c20 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
20c30 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79  pare(nKey1, pKey
20c40 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20  1, pPKey2);..   
20c50 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
20c60 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
20c70 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
20c80 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
20c90 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 76 20  Key2);.  }..  v 
20ca0 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  = pPKey2->aMem[0
20cb0 5d 2e 75 2e 69 3b 0a 20 20 69 66 28 20 76 3e 6c  ].u.i;.  if( v>l
20cc0 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  hs ){.    res = 
20cd0 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65  pPKey2->r1;.  }e
20ce0 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b  lse if( v<lhs ){
20cf0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
20d00 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69  2->r2;.  }else i
20d10 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  f( pPKey2->nFiel
20d20 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  d>1 ){.    /* Th
20d30 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
20d40 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61  f the two keys a
20d50 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72  re equal. Compar
20d60 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a  e the trailing .
20d70 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20      ** fields.  
20d80 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c  */.    res = sql
20d90 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
20da0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
20db0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
20dc0 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  y2, 1);.  }else{
20dd0 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
20de0 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
20df0 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
20e00 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  al and there are
20e10 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20   no trailing.   
20e20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75   ** fields. Retu
20e30 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  rn pPKey2->defau
20e40 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61  lt_rc in this ca
20e50 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  se. */.    res =
20e60 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
20e70 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d  _rc;.    pPKey2-
20e80 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d  >eqSeen = 1;.  }
20e90 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
20ea0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
20eb0 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
20ec0 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b   pPKey2, res) );
20ed0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
20ee0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20ef0 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
20f00 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
20f10 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20f20 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
20f30 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
20f40 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
20f50 79 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  y2 is a string, 
20f60 74 68 61 74 20 28 62 29 20 74 68 65 20 66 69 72  that (b) the fir
20f70 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73  st field.** uses
20f80 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
20f90 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61  equence BINARY a
20fa0 6e 64 20 28 63 29 20 74 68 61 74 20 74 68 65 20  nd (c) that the 
20fb0 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
20fc0 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65  arint .** at the
20fd0 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
20fe0 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
20ff0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a  a single byte..*
21000 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
21010 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
21020 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ring(.  int nKey
21030 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
21040 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
21050 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
21060 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
21070 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
21080 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  y */.){.  const 
21090 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  u8 *aKey1 = (con
210a0 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20  st u8*)pKey1;.  
210b0 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  int serial_type;
210c0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61  .  int res;..  a
210d0 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 61  ssert( pPKey2->a
210e0 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d  Mem[0].flags & M
210f0 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 65  EM_Str );.  vdbe
21100 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
21110 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65  WithinLimits(nKe
21120 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
21130 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  2->pKeyInfo);.  
21140 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
21150 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  y1[1], serial_ty
21160 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61  pe);.  if( seria
21170 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
21180 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
21190 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79  1;      /* (pKey
211a0 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75  1/nKey1) is a nu
211b0 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a  mber or a null *
211c0 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28  /.  }else if( !(
211d0 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
211e0 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20  01) ){ .    res 
211f0 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20  = pPKey2->r2;   
21200 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65     /* (pKey1/nKe
21210 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  y1) is a blob */
21220 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
21230 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20  t nCmp;.    int 
21240 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a  nStr;.    int sz
21250 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  Hdr = aKey1[0];.
21260 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72  .    nStr = (ser
21270 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32  ial_type-12) / 2
21280 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72  ;.    if( (szHdr
21290 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31   + nStr) > nKey1
212a0 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32   ){.      pPKey2
212b0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
212c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
212d0 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
212e0 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75  n 0;    /* Corru
212f0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ption */.    }. 
21300 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70     nCmp = MIN( p
21310 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e  PKey2->aMem[0].n
21320 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65  , nStr );.    re
21330 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  s = memcmp(&aKey
21340 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32  1[szHdr], pPKey2
21350 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d  ->aMem[0].z, nCm
21360 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73  p);..    if( res
21370 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  ==0 ){.      res
21380 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32   = nStr - pPKey2
21390 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20  ->aMem[0].n;.   
213a0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
213b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b  .        if( pPK
213c0 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
213d0 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d  .          res =
213e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
213f0 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
21400 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
21410 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20  pPKey2, 1);.    
21420 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21430 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
21440 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
21450 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
21460 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20  >eqSeen = 1;.   
21470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
21480 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
21490 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
214a0 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20  Key2->r2;.      
214b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
214c0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
214d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
214e0 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a  se if( res>0 ){.
214f0 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
21500 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73  y2->r2;.    }els
21510 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  e{.      res = p
21520 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d  PKey2->r1;.    }
21530 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
21540 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
21550 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
21560 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73  ey1, pPKey2, res
21570 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52  ).       || CORR
21580 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c  UPT_DB.       ||
21590 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
215a0 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  o->db->mallocFai
215b0 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72  led.  );.  retur
215c0 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
215d0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
215e0 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64   to an sqlite3Vd
215f0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
21600 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e  ) compatible fun
21610 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c  ction.** suitabl
21620 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  e for comparing 
21630 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72  serialized recor
21640 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b  ds to the unpack
21650 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64  ed record passed
21660 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  .** as the only 
21670 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63  argument..*/.Rec
21680 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74  ordCompare sqlit
21690 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
216a0 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  e(UnpackedRecord
216b0 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e   *p){.  /* varin
216c0 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
216d0 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65  t() and varintRe
216e0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
216f0 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a  g() both assume.
21700 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69    ** that the si
21710 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
21720 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20  int that occurs 
21730 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
21740 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a  each record.  **
21750 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c   fits in a singl
21760 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20  e byte (i.e. is 
21770 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61  127 or less). va
21780 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
21790 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f  eInt().  ** also
217a0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
217b0 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72   is safe to over
217c0 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79  read a buffer by
217d0 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20   at least the . 
217e0 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73   ** maximum poss
217f0 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65  ible legal heade
21800 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79  r size plus 8 by
21810 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65  tes. Because the
21820 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61  re is.  ** guara
21830 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c  nteed to be at l
21840 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74  east 74 (but not
21850 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70   136) bytes of p
21860 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67  adding following
21870 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65   each.  ** buffe
21880 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69  r passed to vari
21890 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
218a0 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20  nt() this makes 
218b0 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f  it convenient to
218c0 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20  .  ** limit the 
218d0 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
218e0 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69  er to 64 bytes i
218f0 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  n cases where th
21900 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20  e first field.  
21910 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ** is an integer
21920 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
21930 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65  easiest way to e
21940 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69  nforce this limi
21950 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72  t is to consider
21960 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69   only records wi
21970 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64  th.  ** 13 field
21980 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68  s or less. If th
21990 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73  e first field is
219a0 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65   an integer, the
219b0 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20   maximum legal. 
219c0 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20   ** header size 
219d0 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31  is (12*5 + 1 + 1
219e0 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69  ) bytes.  */.  i
219f0 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  f( (p->pKeyInfo-
21a00 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65  >nField + p->pKe
21a10 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c  yInfo->nXField)<
21a20 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  =13 ){.    int f
21a30 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30  lags = p->aMem[0
21a40 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28  ].flags;.    if(
21a50 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   p->pKeyInfo->aS
21a60 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20  ortOrder[0] ){. 
21a70 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a       p->r1 = 1;.
21a80 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31        p->r2 = -1
21a90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21aa0 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20     p->r1 = -1;. 
21ab0 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a       p->r2 = 1;.
21ac0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
21ad0 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20  lags & MEM_Int) 
21ae0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
21af0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
21b00 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eInt;.    }.    
21b10 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
21b20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20  & MEM_Real );.  
21b30 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
21b40 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a  s & MEM_Null );.
21b50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
21b60 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
21b70 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  ;.    if( (flags
21b80 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d   & (MEM_Real|MEM
21b90 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29  _Null|MEM_Blob))
21ba0 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e  ==0 && p->pKeyIn
21bb0 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20  fo->aColl[0]==0 
21bc0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21bd0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72   flags & MEM_Str
21be0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
21bf0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
21c00 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a  reString;.    }.
21c10 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71    }..  return sq
21c20 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
21c30 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ompare;.}../*.**
21c40 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
21c50 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63  an index entry c
21c60 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
21c70 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
21c80 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74  pcode..** Read t
21c90 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61  he rowid (the la
21ca0 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  st field in the 
21cb0 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72  record) and stor
21cc0 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a  e it in *rowid..
21cd0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
21ce0 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
21cf0 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65  g works, or an e
21d00 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
21d10 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20  ise..**.** pCur 
21d20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e  might be pointin
21d30 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e  g to text obtain
21d40 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70  ed from a corrup
21d50 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  t database file.
21d60 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65  .** So the conte
21d70 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  nt cannot be tru
21d80 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70  sted.  Do approp
21d90 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20  riate checks on 
21da0 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  the content..*/.
21db0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
21dc0 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20  dxRowid(sqlite3 
21dd0 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  *db, BtCursor *p
21de0 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29  Cur, i64 *rowid)
21df0 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
21e00 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
21e10 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20    u32 szHdr;    
21e20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
21e30 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  he header */.  u
21e40 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20  32 typeRowid;   
21e50 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
21e60 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
21e70 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20    u32 lenRowid; 
21e80 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
21e90 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65  he rowid */.  Me
21ea0 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65  m m, v;..  /* Ge
21eb0 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
21ec0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20  e index entry.  
21ed0 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74  Only indices ent
21ee0 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a  ries of less.  *
21ef0 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20  * than 2GiB are 
21f00 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69  support - anythi
21f10 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65  ng large must be
21f20 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
21f30 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63  tion..  ** Any c
21f40 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
21f50 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33  ected in sqlite3
21f60 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
21f70 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a  r(), though, so.
21f80 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63    ** this code c
21f90 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65  an safely assume
21fa0 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69   that nCellKey i
21fb0 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f  s 32-bits  .  */
21fc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21fd0 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
21fe0 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
21ff0 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  nCellKey = sqlit
22000 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69  e3BtreePayloadSi
22010 7a 65 28 70 43 75 72 29 3b 0a 20 20 61 73 73 65  ze(pCur);.  asse
22020 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20  rt( (nCellKey & 
22030 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d  SQLITE_MAX_U32)=
22040 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29  =(u64)nCellKey )
22050 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20  ;..  /* Read in 
22060 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e  the complete con
22070 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65  tent of the inde
22080 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c  x entry */.  sql
22090 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
220a0 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63  &m, db, 0);.  rc
220b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
220c0 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
220d0 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65   0, (u32)nCellKe
220e0 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  y, &m);.  if( rc
220f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
22100 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  c;.  }..  /* The
22110 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73   index entry mus
22120 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68  t begin with a h
22130 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20  eader size */.  
22140 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
22150 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64  2((u8*)m.z, szHd
22160 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  r);.  testcase( 
22170 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65  szHdr==3 );.  te
22180 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d  stcase( szHdr==m
22190 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  .n );.  if( unli
221a0 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20  kely(szHdr<3 || 
221b0 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20  (int)szHdr>m.n) 
221c0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
221d0 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
221e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
221f0 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68  last field of th
22200 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62  e index should b
22210 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74  e an integer - t
22220 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56  he ROWID..  ** V
22230 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c  erify that the l
22240 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79  ast entry really
22250 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   is an integer. 
22260 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61  */.  (void)getVa
22270 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a  rint32((u8*)&m.z
22280 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52  [szHdr-1], typeR
22290 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73  owid);.  testcas
222a0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20  e( typeRowid==1 
222b0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
222c0 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20  ypeRowid==2 );. 
222d0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
222e0 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73  owid==3 );.  tes
222f0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
22300 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==4 );.  testcas
22310 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20  e( typeRowid==5 
22320 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
22330 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20  ypeRowid==6 );. 
22340 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
22350 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73  owid==8 );.  tes
22360 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
22370 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  ==9 );.  if( unl
22380 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c  ikely(typeRowid<
22390 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39  1 || typeRowid>9
223a0 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37   || typeRowid==7
223b0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
223c0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
223d0 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77  on;.  }.  lenRow
223e0 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c  id = sqlite3Smal
223f0 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65 52  lTypeSizes[typeR
22400 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61 73  owid];.  testcas
22410 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48  e( (u32)m.n==szH
22420 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20  dr+lenRowid );. 
22430 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75   if( unlikely((u
22440 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e  32)m.n<szHdr+len
22450 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f  Rowid) ){.    go
22460 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
22470 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
22480 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74  /* Fetch the int
22490 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64  eger off the end
224a0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65   of the index re
224b0 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
224c0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28  3VdbeSerialGet((
224d0 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e  u8*)&m.z[m.n-len
224e0 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69  Rowid], typeRowi
224f0 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64  d, &v);.  *rowid
22500 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69   = v.u.i;.  sqli
22510 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
22520 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
22530 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
22540 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61   Jump here if da
22550 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
22560 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66  n is detected af
22570 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20  ter m has been. 
22580 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20   ** allocated.  
22590 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63  Free the m objec
225a0 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  t and return SQL
225b0 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a  ITE_CORRUPT. */.
225c0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
225d0 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65  tion:.  testcase
225e0 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20  ( m.szMalloc!=0 
225f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
22600 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
22610 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22620 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a  CORRUPT_BKPT;.}.
22630 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
22640 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e  he key of the in
22650 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63  dex entry that c
22660 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e  ursor pC is poin
22670 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a  ting to against.
22680 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e  ** the key strin
22690 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  g in pUnpacked. 
226a0 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65   Write into *pRe
226b0 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68  s a number.** th
226c0 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  at is negative, 
226d0 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
226e0 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20  e if pC is less 
226f0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a  than, equal to,.
22700 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  ** or greater th
22710 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52  an pUnpacked.  R
22720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
22730 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a  on success..**.*
22740 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65  * pUnpacked is e
22750 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69  ither created wi
22760 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72  thout a rowid or
22770 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f   is truncated so
22780 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74   that it.** omit
22790 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  s the rowid at t
227a0 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77  he end.  The row
227b0 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
227c0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
227d0 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61  .** is ignored a
227e0 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20  s well.  Hence, 
227f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  this routine onl
22800 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70  y compares the p
22810 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74  refixes .** of t
22820 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f  he keys prior to
22830 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
22840 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65  , not the entire
22850 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
22860 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f  ite3VdbeIdxKeyCo
22870 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33  mpare(.  sqlite3
22880 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
22890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
228a0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
228b0 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
228c0 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20   *pC,           
228d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
228e0 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20  rsor to compare 
228f0 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70  against */.  Unp
22900 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e  ackedRecord *pUn
22910 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a  packed,       /*
22920 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f   Unpacked versio
22930 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  n of key */.  in
22940 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20  t *res          
22950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22960 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
22970 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
22980 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
22990 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
229a0 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
229b0 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d  r *pCur;.  Mem m
229c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  ;..  assert( pC-
229d0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
229e0 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43  PE_BTREE );.  pC
229f0 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72  ur = pC->uc.pCur
22a00 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73  sor;.  assert( s
22a10 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
22a20 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
22a30 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73  ;.  nCellKey = s
22a40 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
22a50 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
22a60 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c  /* nCellKey will
22a70 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 65   always be betwe
22a80 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 66  en 0 and 0xfffff
22a90 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 74  fff because of t
22aa0 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61 74  he way.  ** that
22ab0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
22ac0 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  tr() and sqlite3
22ad0 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 72  GetVarint32() ar
22ae0 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f  e implemented */
22af0 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
22b00 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30  =0 || nCellKey>0
22b10 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  x7fffffff ){.   
22b20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72   *res = 0;.    r
22b30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
22b40 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
22b50 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
22b60 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a  nit(&m, db, 0);.
22b70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
22b80 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
22b90 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65  Cur, 0, (u32)nCe
22ba0 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66  llKey, &m);.  if
22bb0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
22bc0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65  rn rc;.  }.  *re
22bd0 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
22be0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e  ecordCompare(m.n
22bf0 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64  , m.z, pUnpacked
22c00 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
22c10 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
22c20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22c30 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
22c40 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
22c50 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72  he value to be r
22c60 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65  eturned by subse
22c70 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a  quent calls to.*
22c80 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  * sqlite3_change
22c90 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62  s() on the datab
22ca0 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e  ase handle 'db'.
22cb0 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
22cc0 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
22cd0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
22ce0 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73   nChange){.  ass
22cf0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
22d00 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
22d10 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61  x) );.  db->nCha
22d20 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  nge = nChange;. 
22d30 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67   db->nTotalChang
22d40 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a  e += nChange;.}.
22d50 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61  ./*.** Set a fla
22d60 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f  g in the vdbe to
22d70 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
22d80 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20  ge counter when 
22d90 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a  it is finalised.
22da0 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a  ** or reset..*/.
22db0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
22dc0 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62  CountChanges(Vdb
22dd0 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e  e *v){.  v->chan
22de0 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a  geCntOn = 1;.}..
22df0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79  /*.** Mark every
22e00 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
22e10 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
22e20 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
22e30 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20  onnection.** as 
22e40 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  expired..**.** A
22e50 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d  n expired statem
22e60 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72  ent means that r
22e70 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
22e80 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
22e90 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20  .** recommend.  
22ea0 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72  Statements expir
22eb0 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61  e when things ha
22ec0 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74  ppen that make t
22ed0 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73  heir.** programs
22ee0 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f   obsolete.  Remo
22ef0 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65  ving user-define
22f00 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63  d functions or c
22f10 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
22f20 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69  ences, or changi
22f30 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  ng an authorizat
22f40 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  ion function are
22f50 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a   the types of.**
22f60 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b   things that mak
22f70 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
22f80 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a  ments obsolete..
22f90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
22fa0 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
22fb0 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20  tements(sqlite3 
22fc0 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
22fd0 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70  .  for(p = db->p
22fe0 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Vdbe; p; p=p->pN
22ff0 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70  ext){.    p->exp
23000 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  ired = 1;.  }.}.
23010 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
23020 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
23030 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
23040 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  dbe..*/.sqlite3 
23050 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56  *sqlite3VdbeDb(V
23060 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72  dbe *v){.  retur
23070 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  n v->db;.}../*.*
23080 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
23090 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
230a0 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
230b0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
230c0 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70  value bound.** p
230d0 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66  arameter iVar of
230e0 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69   VM v. Except, i
230f0 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
23100 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75  n SQL NULL, retu
23110 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64  rn .** 0 instead
23120 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e  . Unless it is N
23130 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e  ULL, apply affin
23140 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20  ity aff (one of 
23150 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a  the SQLITE_AFF_*
23160 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74  .** constants) t
23170 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f  o the value befo
23180 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e  re returning it.
23190 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
231a0 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62  ned value must b
231b0 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
231c0 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
231d0 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a  te3ValueFree()..
231e0 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  */.sqlite3_value
231f0 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
23200 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20  BoundValue(Vdbe 
23210 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38  *v, int iVar, u8
23220 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28   aff){.  assert(
23230 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
23240 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   v ){.    Mem *p
23250 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69  Mem = &v->aVar[i
23260 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20  Var-1];.    if( 
23270 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  0==(pMem->flags 
23280 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20  & MEM_Null) ){. 
23290 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
232a0 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  ue *pRet = sqlit
232b0 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62  e3ValueNew(v->db
232c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
232d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
232e0 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28  ite3VdbeMemCopy(
232f0 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65  (Mem *)pRet, pMe
23300 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
23310 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66  te3ValueApplyAff
23320 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c  inity(pRet, aff,
23330 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
23340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
23350 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a  urn pRet;.    }.
23360 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
23370 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
23380 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20  re SQL variable 
23390 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e  iVar so that bin
233a0 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65  ding a new value
233b0 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a   to it signals.*
233c0 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f  * to sqlite3_reo
233d0 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72  ptimize() that r
233e0 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20  e-preparing the 
233f0 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65  statement may re
23400 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74  sult.** in a bet
23410 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  ter query plan..
23420 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
23430 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64  dbeSetVarmask(Vd
23440 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29  be *v, int iVar)
23450 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
23460 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72  >0 );.  if( iVar
23470 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78  >32 ){.    v->ex
23480 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66  pmask = 0xffffff
23490 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ff;.  }else{.   
234a0 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28   v->expmask |= (
234b0 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d  (u32)1 << (iVar-
234c0 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  1));.  }.}..#ifn
234d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
234e0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
234f0 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f  ** Transfer erro
23500 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66  r message text f
23510 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  rom an sqlite3_v
23520 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78  tab.zErrMsg (tex
23530 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d  t stored.** in m
23540 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
23550 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
23560 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e  oc) into a Vdbe.
23570 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
23580 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
23590 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
235a0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29  sqlite3DbMalloc)
235b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
235c0 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73  3VtabImportErrms
235d0 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74  g(Vdbe *p, sqlit
235e0 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b  e3_vtab *pVtab){
235f0 0a 20 20 69 66 28 20 70 56 74 61 62 2d 3e 7a 45  .  if( pVtab->zE
23600 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c  rrMsg ){.    sql
23610 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
23620 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
23630 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
23640 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
23650 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Msg = sqlite3DbS
23660 74 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d  trDup(db, pVtab-
23670 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73  >zErrMsg);.    s
23680 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
23690 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b->zErrMsg);.   
236a0 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
236b0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  = 0;.  }.}.#endi
236c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
236d0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
236e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
236f0 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45  ENABLE_PREUPDATE
23700 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  _HOOK../*.** If 
23710 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
23720 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ent is not NULL,
23730 20 72 65 6c 65 61 73 65 20 61 6e 79 20 61 6c 6c   release any all
23740 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  ocations associa
23750 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 74 68 65  ted .** with the
23760 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e   memory cells in
23770 20 74 68 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61   the p->aMem[] a
23780 72 72 61 79 2e 20 41 6c 73 6f 20 66 72 65 65 20  rray. Also free 
23790 74 68 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  the UnpackedReco
237a0 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  rd.** structure 
237b0 69 74 73 65 6c 66 2c 20 75 73 69 6e 67 20 73 71  itself, using sq
237c0 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a  lite3DbFree()..*
237d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
237e0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 66 72  on is used to fr
237f0 65 65 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  ee UnpackedRecor
23800 64 20 73 74 72 75 63 74 75 72 65 73 20 61 6c 6c  d structures all
23810 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65  ocated by.** the
23820 20 76 64 62 65 55 6e 70 61 63 6b 52 65 63 6f 72   vdbeUnpackRecor
23830 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75  d() function fou
23840 6e 64 20 69 6e 20 76 64 62 65 61 70 69 2e 63 2e  nd in vdbeapi.c.
23850 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
23860 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64  vdbeFreeUnpacked
23870 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 55 6e  (sqlite3 *db, Un
23880 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29  packedRecord *p)
23890 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
238a0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
238b0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64  i=0; i<p->nField
238c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65  ; i++){.      Me
238d0 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d  m *pMem = &p->aM
238e0 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  em[i];.      if(
238f0 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29   pMem->zMalloc )
23900 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
23910 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20  elease(pMem);.  
23920 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
23930 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
23940 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
23950 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
23960 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23  PDATE_HOOK */..#
23970 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
23980 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
23990 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  OK./*.** Invoke 
239a0 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 20 68  the pre-update h
239b0 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20  ook. If this is 
239c0 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
239d0 45 54 45 20 70 72 65 2d 75 70 64 61 74 65 20 63  ETE pre-update c
239e0 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72  all,.** then cur
239f0 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
23a00 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
23a10 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74  t should point t
23a20 6f 20 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a  o the row about.
23a30 2a 2a 20 74 6f 20 62 65 20 75 70 64 61 74 65 20  ** to be update 
23a40 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74  or deleted. If t
23a50 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  he application c
23a60 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65  alls sqlite3_pre
23a70 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a  update_old(),.**
23a80 20 74 68 65 20 72 65 71 75 69 72 65 64 20 76 61   the required va
23a90 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64  lue will be read
23aa0 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68   from the row th
23ab0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
23ac0 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  to..*/.void sqli
23ad0 74 65 33 56 64 62 65 50 72 65 55 70 64 61 74 65  te3VdbePreUpdate
23ae0 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c  Hook(.  Vdbe *v,
23af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b00 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
23b10 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20  pre-update hook 
23b20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f  is invoked by */
23b30 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
23b40 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
23b50 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
23b60 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65  grab old.* value
23b70 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  s from */.  int 
23b80 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
23b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
23ba0 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50  QLITE_INSERT, UP
23bb0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a  DATE or DELETE *
23bc0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23bd0 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  zDb,            
23be0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
23bf0 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20  name */.  Table 
23c00 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
23c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64            /* Mod
23c20 69 66 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20  ified table */. 
23c30 20 69 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20   i64 iKey1,     
23c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c50 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20   /* Initial key 
23c60 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
23c70 52 65 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Reg             
23c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
23c90 67 69 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a  gister for new.*
23ca0 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20   record */.){.  
23cb0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d  sqlite3 *db = v-
23cc0 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32  >db;.  i64 iKey2
23cd0 3b 0a 20 20 50 72 65 55 70 64 61 74 65 20 70 72  ;.  PreUpdate pr
23ce0 65 75 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74  eupdate;.  const
23cf0 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54   char *zTbl = pT
23d00 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61  ab->zName;.  sta
23d10 74 69 63 20 63 6f 6e 73 74 20 75 38 20 66 61 6b  tic const u8 fak
23d20 65 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a  eSortOrder = 0;.
23d30 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
23d40 50 72 65 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a  PreUpdate==0 );.
23d50 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75 70 64    memset(&preupd
23d60 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  ate, 0, sizeof(P
23d70 72 65 55 70 64 61 74 65 29 29 3b 0a 20 20 69 66  reUpdate));.  if
23d80 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44  ( op==SQLITE_UPD
23d90 41 54 45 20 29 7b 0a 20 20 20 20 69 4b 65 79 32  ATE ){.    iKey2
23da0 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d   = v->aMem[iReg]
23db0 2e 75 2e 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  .u.i;.  }else{. 
23dc0 20 20 20 69 4b 65 79 32 20 3d 20 69 4b 65 79 31     iKey2 = iKey1
23dd0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
23de0 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70   pCsr->nField==p
23df0 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20  Tab->nCol .     
23e00 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65    || (pCsr->nFie
23e10 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31  ld==pTab->nCol+1
23e20 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44   && op==SQLITE_D
23e30 45 4c 45 54 45 20 26 26 20 69 52 65 67 3d 3d 2d  ELETE && iReg==-
23e40 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75 70  1).  );..  preup
23e50 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72  date.v = v;.  pr
23e60 65 75 70 64 61 74 65 2e 70 43 73 72 20 3d 20 70  eupdate.pCsr = p
23e70 43 73 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65  Csr;.  preupdate
23e80 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75  .op = op;.  preu
23e90 70 64 61 74 65 2e 69 4e 65 77 52 65 67 20 3d 20  pdate.iNewReg = 
23ea0 69 52 65 67 3b 0a 20 20 70 72 65 75 70 64 61 74  iReg;.  preupdat
23eb0 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64  e.keyinfo.db = d
23ec0 62 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b  b;.  preupdate.k
23ed0 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43  eyinfo.enc = ENC
23ee0 28 64 62 29 3b 0a 20 20 70 72 65 75 70 64 61 74  (db);.  preupdat
23ef0 65 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69 65 6c 64  e.keyinfo.nField
23f00 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20   = pTab->nCol;. 
23f10 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
23f20 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  fo.aSortOrder = 
23f30 28 75 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f 72  (u8*)&fakeSortOr
23f40 64 65 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65  der;.  preupdate
23f50 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a  .iKey1 = iKey1;.
23f60 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79    preupdate.iKey
23f70 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72 65  2 = iKey2;.  pre
23f80 75 70 64 61 74 65 2e 70 54 61 62 20 3d 20 70 54  update.pTab = pT
23f90 61 62 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65 55  ab;..  db->pPreU
23fa0 70 64 61 74 65 20 3d 20 26 70 72 65 75 70 64 61  pdate = &preupda
23fb0 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70  te;.  db->xPreUp
23fc0 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d  dateCallback(db-
23fd0 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 2c 20  >pPreUpdateArg, 
23fe0 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62  db, op, zDb, zTb
23ff0 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32 29  l, iKey1, iKey2)
24000 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61  ;.  db->pPreUpda
24010 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  te = 0;.  sqlite
24020 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65 75  3DbFree(db, preu
24030 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b 0a  pdate.aRecord);.
24040 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b    vdbeFreeUnpack
24050 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65  ed(db, preupdate
24060 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76  .pUnpacked);.  v
24070 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28  dbeFreeUnpacked(
24080 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 70 4e  db, preupdate.pN
24090 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69  ewUnpacked);.  i
240a0 66 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65  f( preupdate.aNe
240b0 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  w ){.    int i;.
240c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
240d0 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b  Csr->nField; i++
240e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
240f0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
24100 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b 69  preupdate.aNew[i
24110 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ]);.    }.    sq
24120 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
24130 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29 3b  preupdate.aNew);
24140 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
24150 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
24160 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f  REUPDATE_HOOK */
24170 0a                                               .