/ Hex Artifact Content
Login

Artifact 12919c5aa354296d6b9ba808bca3e9dda836858c:


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 70 56 4c 69 73 74 20 3d 20 70 50 61   p->pVList = pPa
ec60: 72 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20 20 70  rse->pVList;.  p
ec70: 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d 20  Parse->pVList = 
ec80: 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e   0;.  p->explain
ec90: 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61   = pParse->expla
eca0: 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  in;.  if( db->ma
ecb0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
ecc0: 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20    p->nVar = 0;. 
ecd0: 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20     p->nCursor = 
ece0: 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  0;.    p->nMem =
ecf0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
ed00: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43   p->nCursor = nC
ed10: 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e 56  ursor;.    p->nV
ed20: 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72  ar = (ynVar)nVar
ed30: 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 72  ;.    initMemArr
ed40: 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72  ay(p->aVar, nVar
ed50: 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  , db, MEM_Null);
ed60: 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e  .    p->nMem = n
ed70: 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d  Mem;.    initMem
ed80: 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 6e  Array(p->aMem, n
ed90: 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e 64  Mem, db, MEM_Und
eda0: 65 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d 65 6d  efined);.    mem
edb0: 73 65 74 28 70 2d 3e 61 70 43 73 72 2c 20 30 2c  set(p->apCsr, 0,
edc0: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
edd0: 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23  VdbeCursor*));.#
ede0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
edf0: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
ee00: 54 55 53 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  TUS.    memset(p
ee10: 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70 2d 3e  ->anExec, 0, p->
ee20: 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29  nOp*sizeof(i64))
ee30: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73  ;.#endif.  }.  s
ee40: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
ee50: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  (p);.}../*.** Cl
ee60: 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f  ose a VDBE curso
ee70: 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c  r and release al
ee80: 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  l the resources 
ee90: 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20  that cursor .** 
eea0: 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e  happens to hold.
eeb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
eec0: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56  VdbeFreeCursor(V
eed0: 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73  dbe *p, VdbeCurs
eee0: 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20  or *pCx){.  if( 
eef0: 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pCx==0 ){.    re
ef00: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
ef10: 72 74 28 20 70 43 78 2d 3e 70 42 74 78 3d 3d 30  rt( pCx->pBtx==0
ef20: 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79 70   || pCx->eCurTyp
ef30: 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
ef40: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 43   );.  switch( pC
ef50: 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a 20  x->eCurType ){. 
ef60: 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f     case CURTYPE_
ef70: 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  SORTER: {.      
ef80: 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
ef90: 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43  rClose(p->db, pC
efa0: 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
efb0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
efc0: 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20 7b  CURTYPE_BTREE: {
efd0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 78 2d 3e  .      if( pCx->
efe0: 70 42 74 78 20 29 7b 0a 20 20 20 20 20 20 20 20  pBtx ){.        
eff0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
f000: 65 28 70 43 78 2d 3e 70 42 74 78 29 3b 0a 20 20  e(pCx->pBtx);.  
f010: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78        /* The pCx
f020: 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62  ->pCursor will b
f030: 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69  e close automati
f040: 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69  cally, if it exi
f050: 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20 20  sts, by.        
f060: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  ** the call abov
f070: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  e. */.      }els
f080: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
f090: 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73  t( pCx->uc.pCurs
f0a0: 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  or!=0 );.       
f0b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
f0c0: 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75 63  seCursor(pCx->uc
f0d0: 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .pCursor);.     
f0e0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f0f0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
f100: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
f110: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
f120: 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a  CURTYPE_VTAB: {.
f130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74        sqlite3_vt
f140: 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72  ab_cursor *pVCur
f150: 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75 72   = pCx->uc.pVCur
f160: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71  ;.      const sq
f170: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
f180: 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70  odule = pVCur->p
f190: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
f1a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 56 43       assert( pVC
f1b0: 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e  ur->pVtab->nRef>
f1c0: 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75 72  0 );.      pVCur
f1d0: 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b  ->pVtab->nRef--;
f1e0: 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e  .      pModule->
f1f0: 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20  xClose(pVCur);. 
f200: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f210: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
f220: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
f230: 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63  cursors in the c
f240: 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f  urrent frame..*/
f250: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
f260: 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65  seCursorsInFrame
f270: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
f280: 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20   p->apCsr ){.   
f290: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
f2a0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
f2b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56  r; i++){.      V
f2c0: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20  dbeCursor *pC = 
f2d0: 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20  p->apCsr[i];.   
f2e0: 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20     if( pC ){.   
f2f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f300: 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43  FreeCursor(p, pC
f310: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
f320: 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Csr[i] = 0;.    
f330: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
f340: 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
f350: 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
f360: 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73   the VdbeFrame s
f370: 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
f380: 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73  Vdbe. This.** is
f390: 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70   used, for examp
f3a0: 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67  le, when a trigg
f3b0: 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69  er sub-program i
f3c0: 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74  s halted to rest
f3d0: 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74  ore.** control t
f3e0: 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  o the main progr
f3f0: 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  am..*/.int sqlit
f400: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
f410: 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46  re(VdbeFrame *pF
f420: 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  rame){.  Vdbe *v
f430: 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20   = pFrame->v;.  
f440: 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72  closeCursorsInFr
f450: 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53  ame(v);.#ifdef S
f460: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
f470: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76  T_SCANSTATUS.  v
f480: 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d  ->anExec = pFram
f490: 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69  e->anExec;.#endi
f4a0: 66 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72  f.  v->aOp = pFr
f4b0: 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e  ame->aOp;.  v->n
f4c0: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70  Op = pFrame->nOp
f4d0: 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46  ;.  v->aMem = pF
f4e0: 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d  rame->aMem;.  v-
f4f0: 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >nMem = pFrame->
f500: 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72  nMem;.  v->apCsr
f510: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72   = pFrame->apCsr
f520: 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d  ;.  v->nCursor =
f530: 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72   pFrame->nCursor
f540: 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52  ;.  v->db->lastR
f550: 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c  owid = pFrame->l
f560: 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e  astRowid;.  v->n
f570: 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
f580: 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64  >nChange;.  v->d
f590: 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  b->nChange = pFr
f5a0: 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a  ame->nDbChange;.
f5b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
f5c0: 65 74 65 41 75 78 44 61 74 61 28 76 2d 3e 64 62  eteAuxData(v->db
f5d0: 2c 20 26 76 2d 3e 70 41 75 78 44 61 74 61 2c 20  , &v->pAuxData, 
f5e0: 2d 31 2c 20 30 29 3b 0a 20 20 76 2d 3e 70 41 75  -1, 0);.  v->pAu
f5f0: 78 44 61 74 61 20 3d 20 70 46 72 61 6d 65 2d 3e  xData = pFrame->
f600: 70 41 75 78 44 61 74 61 3b 0a 20 20 70 46 72 61  pAuxData;.  pFra
f610: 6d 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 30  me->pAuxData = 0
f620: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
f630: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
f640: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
f650: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
f660: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
f670: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
f680: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
f690: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
f6a0: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
f6b0: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
f6c0: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
f6d0: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
f6e0: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
f6f0: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
f700: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
f710: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
f720: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
f730: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
f740: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
f750: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
f760: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
f770: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
f780: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
f790: 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  e;.    for(pFram
f7a0: 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
f7b0: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46  ame->pParent; pF
f7c0: 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
f7d0: 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rent);.    sqlit
f7e0: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
f7f0: 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20  re(pFrame);.    
f800: 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20  p->pFrame = 0;. 
f810: 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30     p->nFrame = 0
f820: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
f830: 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a  p->nFrame==0 );.
f840: 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e    closeCursorsIn
f850: 46 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20  Frame(p);.  if( 
f860: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72  p->aMem ){.    r
f870: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
f880: 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29  ->aMem, p->nMem)
f890: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
f8a0: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20  ->pDelFrame ){. 
f8b0: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44     VdbeFrame *pD
f8c0: 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d  el = p->pDelFram
f8d0: 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72  e;.    p->pDelFr
f8e0: 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72  ame = pDel->pPar
f8f0: 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
f900: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
f910: 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pDel);.  }..  /*
f920: 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64   Delete any auxd
f930: 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ata allocations 
f940: 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a  made by the VM *
f950: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44  /.  if( p->pAuxD
f960: 61 74 61 20 29 20 73 71 6c 69 74 65 33 56 64 62  ata ) sqlite3Vdb
f970: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70  eDeleteAuxData(p
f980: 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61  ->db, &p->pAuxDa
f990: 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73  ta, -1, 0);.  as
f9a0: 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74  sert( p->pAuxDat
f9b0: 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  a==0 );.}../*.**
f9c0: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
f9d0: 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20   after a single 
f9e0: 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  run..*/.static v
f9f0: 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65  oid Cleanup(Vdbe
fa00: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
fa10: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69  *db = p->db;..#i
fa20: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
fa30: 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61  G.  /* Execute a
fa40: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
fa50: 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
fa60: 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72  t the Vdbe.apCsr
fa70: 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62  [] and .  ** Vdb
fa80: 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20  e.aMem[] arrays 
fa90: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
faa0: 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a  n cleaned up.  *
fab0: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  /.  int i;.  if(
fac0: 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28   p->apCsr ) for(
fad0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
fae0: 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  r; i++) assert( 
faf0: 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29  p->apCsr[i]==0 )
fb00: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
fb10: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
fb20: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20  i<p->nMem; i++) 
fb30: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
fb40: 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e  i].flags==MEM_Un
fb50: 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23  defined );.  }.#
fb60: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
fb70: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
fb80: 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72  rrMsg);.  p->zEr
fb90: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  rMsg = 0;.  p->p
fba0: 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d  ResultSet = 0;.}
fbb0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
fbc0: 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
fbd0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
fbe0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
fbf0: 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74  y this SQL.** st
fc00: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
fc10: 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70   now set at comp
fc20: 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72  ile time, rather
fc30: 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20   than during.** 
fc40: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65  execution of the
fc50: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f   vdbe program so
fc60: 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f   that sqlite3_co
fc70: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e  lumn_count() can
fc80: 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  .** be called on
fc90: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
fca0: 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33  t before sqlite3
fcb0: 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64  _step()..*/.void
fcc0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
fcd0: 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20  umCols(Vdbe *p, 
fce0: 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b  int nResColumn){
fcf0: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65  .  Mem *pColName
fd00: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  ;.  int n;.  sql
fd10: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
fd20: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
fd30: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
fd40: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
fd50: 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71  COLNAME_N);.  sq
fd60: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
fd70: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
fd80: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43  n = nResColumn*C
fd90: 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e  OLNAME_N;.  p->n
fda0: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36  ResColumn = (u16
fdb0: 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70  )nResColumn;.  p
fdc0: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
fdd0: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
fde0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
fdf0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65  NN(db, sizeof(Me
fe00: 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  m)*n );.  if( p-
fe10: 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72  >aColName==0 ) r
fe20: 65 74 75 72 6e 3b 0a 20 20 69 6e 69 74 4d 65 6d  eturn;.  initMem
fe30: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
fe40: 65 2c 20 6e 2c 20 70 2d 3e 64 62 2c 20 4d 45 4d  e, n, p->db, MEM
fe50: 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _Null);.}../*.**
fe60: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
fe70: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
fe80: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
fe90: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
fea0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
feb0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
fec0: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
fed0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
fee0: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
fef0: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
ff00: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
ff10: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
ff20: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  s()..**.** The f
ff30: 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20  inal parameter, 
ff40: 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e  xDel, must be on
ff50: 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41  e of SQLITE_DYNA
ff60: 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  MIC, SQLITE_STAT
ff70: 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  IC.** or SQLITE_
ff80: 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74  TRANSIENT. If it
ff90: 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   is SQLITE_DYNAM
ffa0: 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  IC, then the buf
ffb0: 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  fer pointed.** t
ffc0: 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20  o by zName will 
ffd0: 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69  be freed by sqli
ffe0: 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e  te3DbFree() when
fff0: 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73   the vdbe is des
10000 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  troyed..*/.int s
10010 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
10020 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c  Name(.  Vdbe *p,
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10040 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
10050 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65   being configure
10060 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20  d */.  int idx, 
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10080 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
10090 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65   of column zName
100a0 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20   applies to */. 
100b0 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20   int var,       
100c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100d0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
100e0 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61  COLNAME_* consta
100f0 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
10100 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
10110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
10120 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
10130 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a  ontaining name *
10140 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
10150 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20  (void*)         
10160 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
10170 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65  anagement strate
10180 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a  gy for zName */.
10190 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
101a0 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
101b0 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
101c0 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
101d0 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
101e0 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
101f0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
10200 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
10210 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21   !zName || xDel!
10220 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20  =SQLITE_DYNAMIC 
10230 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
10240 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
10250 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
10260 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b  ->aColName!=0 );
10270 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28  .  pColName = &(
10280 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b  p->aColName[idx+
10290 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  var*p->nResColum
102a0 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n]);.  rc = sqli
102b0 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
102c0 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
102d0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
102e0 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65  8, xDel);.  asse
102f0 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e  rt( rc!=0 || !zN
10300 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65  ame || (pColName
10310 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d  ->flags&MEM_Term
10320 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )!=0 );.  return
10330 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
10340 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
10350 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
10360 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
10370 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
10380 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
10390 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
103a0 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
103b0 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
103c0 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
103d0 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
103e0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
103f0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
10400 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
10410 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
10420 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
10430 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
10440 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
10450 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64  (sqlite3 *db, Vd
10460 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
10470 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20  .  int nTrans = 
10480 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
10490 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
104a0 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 2d  an active write-
104b0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
104d0 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e 64 69  * that are candi
104e0 64 61 74 65 73 20 66 6f 72 20 61 20 74 77 6f 2d  dates for a two-
104f0 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75 73 69  phase commit usi
10500 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20 20 20  ng a.           
10510 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65          ** maste
10520 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  r-journal */.  i
10530 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10540 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f  K;.  int needXco
10550 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65  mmit = 0;..#ifde
10560 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10570 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
10580 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e  With this option
10590 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  , sqlite3VtabSyn
105a0 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74  c() is defined t
105b0 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a  o be simply .  *
105c0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70  * SQLITE_OK so p
105d0 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20   is not used. . 
105e0 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
105f0 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69  AMETER(p);.#endi
10600 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  f..  /* Before d
10610 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
10620 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79  se, call the xSy
10630 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f  nc() callback fo
10640 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75  r any.  ** virtu
10650 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73  al module tables
10660 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73   written in this
10670 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
10680 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62  is has to.  ** b
10690 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65  e done before de
106a0 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65  termining whethe
106b0 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  r a master journ
106c0 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  al file is .  **
106d0 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e   required, as an
106e0 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
106f0 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74  k may add an att
10700 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20  ached database. 
10710 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73   ** to the trans
10720 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
10730 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
10740 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f  ync(db, p);..  /
10750 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65  * This loop dete
10760 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68  rmines (a) if th
10770 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68  e commit hook sh
10780 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
10790 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77  and.  ** (b) how
107a0 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66   many database f
107b0 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77  iles have open w
107c0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
107d0 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63  s, not .  ** inc
107e0 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20  luding the temp 
107f0 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73  database. (b) is
10800 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75   important becau
10810 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20  se if more than 
10820 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61  .  ** one databa
10830 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f  se file has an o
10840 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
10850 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20  ction, a master 
10860 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
10870 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
10880 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d  r an atomic comm
10890 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  it..  */ .  for(
108a0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
108b0 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
108c0 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65   i++){ .    Btre
108d0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
108e0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
108f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
10900 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
10910 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
10920 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73  or not a databas
10930 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 6d  e might need a m
10940 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65  aster journal de
10950 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20 20 20  pends upon.     
10960 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20   ** its journal 
10970 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74 68 65  mode (among othe
10980 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68 69 73  r things).  This
10990 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d 69 6e   matrix determin
109a0 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a  es which.      *
109b0 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 20  * journal modes 
109c0 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  use a master jou
109d0 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68 20 64  rnal and which d
109e0 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 73  o not */.      s
109f0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
10a00 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b 0a 20  MJNeeded[] = {. 
10a10 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54 45         /* DELETE
10a20 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20 20 20     */  1,.      
10a30 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20 20 2a    /* PERSIST   *
10a40 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  / 1,.        /* 
10a50 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a  OFF       */ 0,.
10a60 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 4e 43          /* TRUNC
10a70 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20  ATE  */ 1,.     
10a80 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20 20 20     /* MEMORY    
10a90 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a  */ 0,.        /*
10aa0 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20 30 0a   WAL       */ 0.
10ab0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 50        };.      P
10ac0 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20  ager *pPager;   
10ad0 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69 61  /* Pager associa
10ae0 74 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f 0a  ted with pBt */.
10af0 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69        needXcommi
10b00 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  t = 1;.      sql
10b10 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
10b20 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Bt);.      pPage
10b30 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
10b40 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Pager(pBt);.    
10b50 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
10b60 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d 50  .safety_level!=P
10b70 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
10b80 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26 20 61  _OFF.       && a
10b90 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74 65 33  MJNeeded[sqlite3
10ba0 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d  PagerGetJournalM
10bb0 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20 20 20  ode(pPager)].   
10bc0 20 20 20 29 7b 20 0a 20 20 20 20 20 20 20 20 61     ){ .        a
10bd0 73 73 65 72 74 28 20 69 21 3d 31 20 29 3b 0a 20  ssert( i!=1 );. 
10be0 20 20 20 20 20 20 20 6e 54 72 61 6e 73 2b 2b 3b         nTrans++;
10bf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
10c00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10c10 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
10c20 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
10c30 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
10c40 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Bt);.    }.  }. 
10c50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10c60 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
10c70 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
10c80 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
10c90 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
10ca0 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b  ns at all, invok
10cb0 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  e the commit hoo
10cc0 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58  k */.  if( needX
10cd0 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43  commit && db->xC
10ce0 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b  ommitCallback ){
10cf0 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43  .    rc = db->xC
10d00 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62  ommitCallback(db
10d10 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20  ->pCommitArg);. 
10d20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10d30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10d40 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
10d50 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITHOOK;.    }.  
10d60 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
10d70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
10d80 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
10d90 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
10da0 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
10db0 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
10dc0 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
10dd0 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
10de0 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
10df0 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
10e00 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
10e10 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
10e20 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
10e30 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
10e40 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
10e50 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
10e60 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
10e70 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
10e80 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
10e90 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
10ea0 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
10eb0 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
10ec0 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
10ed0 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
10ee0 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
10ef0 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
10f00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
10f10 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
10f20 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
10f30 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
10f40 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54  ].pBt)).   || nT
10f50 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20  rans<=1.  ){.   
10f60 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
10f70 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
10f80 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
10f90 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
10fa0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
10fb0 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
10fc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
10fd0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
10fe0 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
10ff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
11000 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
11010 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
11020 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
11030 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
11040 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
11050 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
11060 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
11070 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
11080 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
11090 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
110a0 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
110b0 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
110c0 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
110d0 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
110e0 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
110f0 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
11100 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
11110 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
11120 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
11130 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
11140 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
11150 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
11160 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
11170 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
11180 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
11190 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
111a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
111b0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
111c0 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  wo(pBt, 0);.    
111d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
111e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
111f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11200 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
11210 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11220 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
11230 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
11240 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
11250 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
11260 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
11270 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
11280 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
11290 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
112a0 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
112b0 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c  mmitted atomical
112c0 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
112d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
112e0 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
112f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
11300 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
11310 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
11320 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
11330 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
11340 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
11350 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
11360 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
11370 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
11380 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
11390 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
113a0 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30  ile *pMaster = 0
113b0 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
113c0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
113d0 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79  s;.    int retry
113e0 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  Count = 0;.    i
113f0 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20  nt nMainFile;.. 
11400 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d     /* Select a m
11410 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11420 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  le name */.    n
11430 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
11440 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e  e3Strlen30(zMain
11450 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74  File);.    zMast
11460 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  er = sqlite3MPri
11470 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58  ntf(db, "%s-mjXX
11480 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e  XXXX9XXz", zMain
11490 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  File);.    if( z
114a0 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75  Master==0 ) retu
114b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
114c0 42 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a 20  BKPT;.    do {. 
114d0 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d       u32 iRandom
114e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 72  ;.      if( retr
114f0 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  yCount ){.      
11500 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
11510 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >100 ){.        
11520 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
11530 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64  LITE_FULL, "MJ d
11540 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73  elete: %s", zMas
11550 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
11560 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
11570 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
11580 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
11590 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
115a0 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74  e if( retryCount
115b0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==1 ){.         
115c0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
115d0 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f  ITE_FULL, "MJ co
115e0 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73  llide: %s", zMas
115f0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ter);.        }.
11600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
11610 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20  tryCount++;.    
11620 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
11630 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e  ness(sizeof(iRan
11640 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b  dom), &iRandom);
11650 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
11660 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61  nprintf(13, &zMa
11670 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c  ster[nMainFile],
11680 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c   "-mj%06X9%02X",
11690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
116a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116b0 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66  (iRandom>>8)&0xf
116c0 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30  fffff, iRandom&0
116d0 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  xff);.      /* T
116e0 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61  he antipenultima
116f0 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  te character of 
11700 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11710 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20  al name must.   
11720 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20     ** be "9" to 
11730 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69  avoid name colli
11740 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67  sions when using
11750 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20   8+3 filenames. 
11760 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
11770 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33   zMaster[sqlite3
11780 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72  Strlen30(zMaster
11790 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20  )-3]=='9' );.   
117a0 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
117b0 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c  ffix3(zMainFile,
117c0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
117d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
117e0 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
117f0 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
11800 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
11810 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
11820 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
11830 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  es );.    if( rc
11840 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11850 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
11860 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
11870 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
11880 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c  qlite3OsOpenMall
11890 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  oc(pVfs, zMaster
118a0 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20  , &pMaster, .   
118b0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
118c0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
118d0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
118e0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
118f0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
11900 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
11910 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20  TER_JOURNAL, 0. 
11920 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
11930 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11940 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
11950 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
11960 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
11970 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
11980 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
11990 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20  he name of each 
119a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
119b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
119c0 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20   into the new.  
119d0 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
119e0 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20  nal file. If an 
119f0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20  error occurs at 
11a00 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65  this point close
11a10 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65  .    ** and dele
11a20 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
11a30 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20  urnal file. All 
11a40 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  the individual j
11a50 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20  ournal files.   
11a60 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27   ** still have '
11a70 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73  null' as the mas
11a80 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
11a90 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c  ter, so they wil
11aa0 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61  l roll.    ** ba
11ab0 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
11ac0 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
11ad0 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  curs..    */.   
11ae0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
11af0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
11b00 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
11b10 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
11b20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
11b30 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
11b40 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  t) ){.        ch
11b50 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20  ar const *zFile 
11b60 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
11b70 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74  tJournalname(pBt
11b80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
11b90 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
11ba0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
11bb0 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61  /* Ignore TEMP a
11bc0 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  nd :memory: data
11bd0 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
11be0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
11bf0 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29  t( zFile[0]!=0 )
11c00 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
11c10 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d  qlite3OsWrite(pM
11c20 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71  aster, zFile, sq
11c30 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
11c40 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
11c50 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
11c60 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
11c70 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  30(zFile)+1;.   
11c80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11c90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11ca0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11cb0 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
11cc0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11cd0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
11ce0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
11cf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
11d00 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
11d10 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
11d20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
11d30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
11d40 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
11d50 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11d60 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
11d70 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
11d80 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
11d90 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
11da0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
11db0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d     */.    if( 0=
11dc0 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  =(sqlite3OsDevic
11dd0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
11de0 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45  (pMaster)&SQLITE
11df0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
11e00 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54  L).     && SQLIT
11e10 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
11e20 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65  te3OsSync(pMaste
11e30 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  r, SQLITE_SYNC_N
11e40 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20  ORMAL)).    ){. 
11e50 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
11e60 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
11e70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
11e80 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
11e90 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
11ea0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11eb0 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
11ec0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11ed0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
11ee0 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
11ef0 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
11f00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
11f10 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
11f20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
11f30 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
11f40 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
11f50 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
11f60 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
11f70 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
11f80 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
11f90 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11fa0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
11fb0 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
11fc0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
11fd0 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
11fe0 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
11ff0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
12000 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72  One(), then ther
12010 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
12020 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61  at the.    ** ma
12030 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12040 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e  e will be orphan
12050 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
12060 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20  t delete it,.   
12070 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
12080 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
12090 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
120a0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
120b0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
120c0 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
120d0 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
120e0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
120f0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
12100 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
12110 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
12120 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
12130 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
12140 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
12150 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
12160 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
12170 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b  e(pBt, zMaster);
12180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12190 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
121a0 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
121b0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
121c0 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20  SQLITE_BUSY );. 
121d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
121e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
121f0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12200 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
12210 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
12220 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
12230 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
12240 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
12250 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
12260 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
12270 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
12280 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
12290 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
122a0 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
122b0 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
122c0 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
122d0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
122e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
122f0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
12300 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  Master, 1);.    
12310 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12320 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
12330 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
12340 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
12350 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12360 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69  }..    /* All fi
12370 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72  les and director
12380 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ies have already
12390 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f   been synced, so
123a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
123b0 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73     ** calls to s
123c0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
123d0 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20  tPhaseTwo() are 
123e0 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c  only closing fil
123f0 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  es and.    ** de
12400 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
12410 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49  ting journals. I
12420 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
12430 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20   wrong while.   
12440 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
12450 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72  ening we don't r
12460 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20  eally care. The 
12470 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
12480 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
12490 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67  ion is already g
124a0 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73  uaranteed, but s
124b0 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27  ome stray 'cold'
124c0 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a   journals.    **
124d0 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72   may be lying ar
124e0 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20  ound. Returning 
124f0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f  an error code wo
12500 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73  n't help matters
12510 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73  ..    */.    dis
12520 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
12530 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20  o_errors();.    
12540 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
12550 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
12560 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
12570 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
12580 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
12590 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
125a0 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
125b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
125c0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
125d0 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20  o(pBt, 1);.     
125e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
125f0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
12600 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c  loc();.    enabl
12610 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
12620 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
12630 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
12640 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
12650 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12660 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
12670 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
12680 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64   the sqlite3.nVd
12690 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76  beActive count v
126a0 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68  ariable.** match
126b0 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
126c0 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c   vdbe's in the l
126d0 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62  ist sqlite3.pVdb
126e0 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75  e that are.** cu
126f0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20  rrently active. 
12700 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69  An assertion fai
12710 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f  ls if the two co
12720 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  unts do not matc
12730 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  h..** This is an
12740 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63   internal self-c
12750 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69  heck only - it i
12760 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69  s not an essenti
12770 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a  al processing.**
12780 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   step..**.** Thi
12790 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
127a0 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  NDEBUG is define
127b0 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  d..*/.#ifndef ND
127c0 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64  EBUG.static void
127d0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
127e0 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  Cnt(sqlite3 *db)
127f0 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69  {.  Vdbe *p;.  i
12800 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
12810 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20  t nWrite = 0;.  
12820 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20  int nRead = 0;. 
12830 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
12840 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
12850 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
12860 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33  mt_busy((sqlite3
12870 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20  _stmt*)p) ){.   
12880 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
12890 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  if( p->readOnly=
128a0 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20  =0 ) nWrite++;. 
128b0 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52       if( p->bIsR
128c0 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b  eader ) nRead++;
128d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
128e0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61  ->pNext;.  }.  a
128f0 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e  ssert( cnt==db->
12900 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20  nVdbeActive );. 
12910 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d   assert( nWrite=
12920 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20  =db->nVdbeWrite 
12930 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  );.  assert( nRe
12940 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61  ad==db->nVdbeRea
12950 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  d );.}.#else.#de
12960 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65  fine checkActive
12970 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69  VdbeCnt(x).#endi
12980 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
12990 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
129a0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
129b0 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65  t opened a state
129c0 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
129d0 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f  ,.** close it no
129e0 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20  w. Argument eOp 
129f0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
12a00 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12a10 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  K or.** SAVEPOIN
12a20 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74  T_RELEASE. If it
12a30 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
12a40 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65  LLBACK, then the
12a50 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
12a60 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
12a70 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70  led back. If eOp
12a80 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   is SAVEPOINT_RE
12a90 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20  LEASE, then the 
12aa0 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72  .** statement tr
12ab0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
12ac0 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mitted..**.** If
12ad0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
12ae0 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  urs, an SQLITE_I
12af0 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
12b00 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
12b10 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53   .** Otherwise S
12b20 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
12b30 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
12b40 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20  eStatement(Vdbe 
12b50 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20  *p, int eOp){.  
12b60 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64  sqlite3 *const d
12b70 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
12b80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12b90 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74  ..  /* If p->iSt
12ba0 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74  atement is great
12bb0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
12bc0 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70 65  en this Vdbe ope
12bd0 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74  ned a .  ** stat
12be0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
12bf0 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  n that should be
12c00 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68   closed here. Th
12c10 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e  e only exception
12c20 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e  .  ** is that an
12c30 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61   IO error may ha
12c40 76 65 20 6f 63 63 75 72 72 65 64 2c 20 63 61 75  ve occurred, cau
12c50 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63  sing an emergenc
12c60 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a  y rollback..  **
12c70 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64   In this case (d
12c80 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
12c90 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ), and there is 
12ca0 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20  nothing to do.. 
12cb0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53   */.  if( db->nS
12cc0 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69  tatement && p->i
12cd0 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
12ce0 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73   int i;.    cons
12cf0 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  t int iSavepoint
12d00 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74   = p->iStatement
12d10 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  -1;..    assert(
12d20 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
12d30 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d  ROLLBACK || eOp=
12d40 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
12d50 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  SE);.    assert(
12d60 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e   db->nStatement>
12d70 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
12d80 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d   p->iStatement==
12d90 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b  (db->nStatement+
12da0 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20  db->nSavepoint) 
12db0 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  );..    for(i=0;
12dc0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
12dd0 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32  { .      int rc2
12de0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12df0 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
12e00 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
12e10 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
12e20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f  {.        if( eO
12e30 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
12e40 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
12e50 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
12e60 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
12e70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Bt, SAVEPOINT_RO
12e80 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
12e90 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
12ea0 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d         if( rc2==
12eb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12ec0 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
12ed0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
12ee0 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
12ef0 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
12f00 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  point);.        
12f10 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
12f20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12f30 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63           rc = rc
12f40 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
12f50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64     }.    }.    d
12f60 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b  b->nStatement--;
12f70 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  .    p->iStateme
12f80 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  nt = 0;..    if(
12f90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12fa0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d  {.      if( eOp=
12fb0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
12fc0 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ACK ){.        r
12fd0 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
12fe0 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56  avepoint(db, SAV
12ff0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
13000 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
13010 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13020 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13030 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13040 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
13050 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
13060 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
13070 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
13080 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
13090 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
130a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
130b0 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  ng rolled back, 
130c0 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65  also restore the
130d0 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
130e0 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72  e handles deferr
130f0 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f  ed constraint co
13100 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c  unter to the val
13110 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a  ue it had when .
13120 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
13130 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
13140 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f   was opened.  */
13150 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41  .    if( eOp==SA
13160 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
13170 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44   ){.      db->nD
13180 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d  eferredCons = p-
13190 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20  >nStmtDefCons;. 
131a0 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
131b0 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e  edImmCons = p->n
131c0 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a  StmtDefImmCons;.
131d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
131e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
131f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
13200 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74   called when a t
13210 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65  ransaction opene
13220 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73  d by the databas
13230 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73  e .** handle ass
13240 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
13250 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
13260 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f   argument is abo
13270 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d  ut to be .** com
13280 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65  mitted. If there
13290 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
132a0 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
132b0 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
132c0 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20  .** violations, 
132d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
132e0 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ROR. Otherwise, 
132f0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
13300 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
13310 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f  tstanding FK vio
13320 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73  lations and this
13330 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
13340 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  s .** SQLITE_ERR
13350 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75  OR, set the resu
13360 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20  lt of the VM to 
13370 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
13380 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20  T_FOREIGNKEY.** 
13390 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72  and write an err
133a0 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74  or message to it
133b0 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51  . Then return SQ
133c0 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23  LITE_ERROR..*/.#
133d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
133e0 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69  IT_FOREIGN_KEY.i
133f0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  nt sqlite3VdbeCh
13400 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69  eckFk(Vdbe *p, i
13410 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20  nt deferred){.  
13420 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
13430 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65  >db;.  if( (defe
13440 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65  rred && (db->nDe
13450 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e  ferredCons+db->n
13460 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29  DeferredImmCons)
13470 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66  >0) .   || (!def
13480 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43  erred && p->nFkC
13490 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20  onstraint>0) .  
134a0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
134b0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
134c0 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
134d0 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
134e0 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
134f0 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
13500 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59  (p, "FOREIGN KEY
13510 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
13520 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
13530 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
13540 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
13550 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
13560 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13570 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
13580 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
13590 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
135a0 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
135b0 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
135c0 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
135d0 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
135e0 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
135f0 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
13600 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
13610 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
13620 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
13630 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
13640 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
13650 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
13660 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
13670 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
13680 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
13690 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
136a0 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
136b0 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
136c0 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
136d0 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
136e0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
136f0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
13700 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
13710 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
13720 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
13730 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
13740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
13750 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
13760 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
13770 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
13780 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
13790 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
137a0 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
137b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
137c0 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
137d0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137f0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
13800 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
13810 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
13820 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
13830 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
13840 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
13850 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
13860 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
13870 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
13880 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
13890 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
138a0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
138b0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
138c0 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
138d0 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
138e0 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
138f0 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
13900 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
13910 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
13920 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
13930 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
13940 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
13950 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
13960 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
13970 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
13980 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
13990 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
139a0 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
139b0 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
139c0 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
139d0 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
139e0 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
139f0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
13a00 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
13a10 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
13a20 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
13a30 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
13a40 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
13a50 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
13a60 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
13a70 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
13a80 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
13a90 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 63  EM_BKPT;.  }.  c
13aa0 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
13ab0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  );.  if( p->magi
13ac0 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
13ad0 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
13ae0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13af0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
13b00 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
13b10 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
13b20 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
13b30 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
13b40 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74   started or if t
13b50 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  he.  ** SQL stat
13b60 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72  ement does not r
13b70 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64  ead or write a d
13b80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a  atabase file.  *
13b90 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
13ba0 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72   && p->bIsReader
13bb0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
13bc0 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
13bd0 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
13be0 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  >rc */.    int e
13bf0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b  StatementOp = 0;
13c00 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69  .    int isSpeci
13c10 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  alError;        
13c20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
13c30 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c  ue if a 'special
13c40 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20  ' error */..    
13c50 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
13c60 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
13c70 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
13c80 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
13c90 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
13ca0 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
13cb0 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
13cc0 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
13cd0 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
13ce0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
13cf0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
13d00 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
13d10 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
13d20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
13d30 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
13d40 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
13d50 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
13d60 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
13d70 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  r ){.      /* If
13d80 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
13d90 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65  ead-only and the
13da0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
13db0 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c  QLITE_INTERRUPT,
13dc0 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f   .      ** no ro
13dd0 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73  llback is necess
13de0 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ary. Otherwise, 
13df0 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70  at least a savep
13e00 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
13e10 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
13e20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  be rolled back t
13e30 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
13e40 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20  tabase to a .   
13e50 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74     ** consistent
13e60 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
13e70 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69  .      ** Even i
13e80 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
13e90 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74  is read-only, it
13ea0 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
13eb0 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a   perform.      *
13ec0 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  * a statement or
13ed0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
13ee0 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e  lback operation.
13ef0 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20   If the error . 
13f00 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64       ** occurred
13f10 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
13f20 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  o the journal, s
13f30 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61  ub-journal or da
13f40 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
13f50 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  file as part of 
13f60 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65  an effort to fre
13f70 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65  e up cache space
13f80 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20   (see function. 
13f90 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72       ** pagerStr
13fa0 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63  ess() in pager.c
13fb0 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ), the rollback 
13fc0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72  is required to r
13fd0 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  estore .      **
13fe0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20   the pager to a 
13ff0 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
14000 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14010 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
14020 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
14030 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
14040 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d        if( (mrc==
14050 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
14060 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
14070 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  ) && p->usesStmt
14080 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
14090 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
140a0 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
140b0 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
140c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
140d0 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
140e0 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
140f0 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
14100 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
14110 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
14120 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
14130 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
14140 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
14150 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
14160 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
14170 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14180 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
14190 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
141a0 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
141b0 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
141c0 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
141d0 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
141e0 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
141f0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
14200 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
14210 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
14220 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
14230 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
14240 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73  n key violations
14250 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
14260 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14270 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14280 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b  beCheckFk(p, 0);
14290 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
142a0 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
142b0 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
142c0 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
142d0 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74  only active writ
142e0 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74  er .    ** VM, t
142f0 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72  hen we do either
14300 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
14310 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
14320 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
14330 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
14340 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
14350 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
14360 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
14370 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
14380 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
14390 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20  as occurred. .  
143a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71    */.    if( !sq
143b0 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
143c0 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d  db) .     && db-
143d0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20  >autoCommit .   
143e0 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72    && db->nVdbeWr
143f0 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  ite==(p->readOnl
14400 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
14410 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
14420 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
14430 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
14440 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
14450 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
14460 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14470 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
14480 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
14490 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
144a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
144b0 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29  VER(p->readOnly)
144c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
144d0 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
144e0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
144f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
14500 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
14510 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
14520 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
14530 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
14540 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20         }else{ . 
14550 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
14560 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
14570 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64   is true, the vd
14580 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73  be program was s
14590 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20  uccessful .     
145a0 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61       ** or hit a
145b0 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  n 'OR FAIL' cons
145c0 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65  traint and there
145d0 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64   are no deferred
145e0 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20   foreign.       
145f0 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
14600 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
14610 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
14620 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
14630 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20  ommit .         
14640 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
14650 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
14660 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
14670 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , p);.        }.
14680 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
14690 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
146a0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
146b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
146c0 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
146d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
146e0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
146f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
14700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14710 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
14720 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
14730 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
14740 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
14750 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
14760 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
14770 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14780 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
14790 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
147a0 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
147b0 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
147c0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
147d0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65  gs &= ~SQLITE_De
147e0 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20  ferFKs;.        
147f0 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
14800 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
14810 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
14820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14830 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
14840 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
14850 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  _OK);.        p-
14860 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
14870 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e      }.      db->
14880 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
14890 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
148a0 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b  tatementOp==0 ){
148b0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
148c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
148d0 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
148e0 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  E_Fail ){.      
148f0 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
14900 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
14910 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  SE;.      }else 
14920 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
14930 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
14940 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
14950 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
14960 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
14970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14980 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
14990 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
149a0 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
149b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
149c0 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
149d0 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
149e0 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
149f0 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
14a00 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
14a10 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
14a20 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69  f eStatementOp i
14a30 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
14a40 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
14a50 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
14a60 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d  o.    ** be comm
14a70 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
14a80 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74  back. Call sqlit
14a90 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
14aa0 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a  ment() to.    **
14ab0 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20   do so. If this 
14ac0 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e  operation return
14ad0 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  s an error, and 
14ae0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
14af0 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72  ement.    ** err
14b00 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
14b10 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43  E_OK or SQLITE_C
14b20 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20  ONSTRAINT, then 
14b30 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20  promote the.    
14b40 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
14b50 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e  ment error code.
14b60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14b70 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a  eStatementOp ){.
14b80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14b90 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
14ba0 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65  ment(p, eStateme
14bb0 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ntOp);.      if(
14bc0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69   rc ){.        i
14bd0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
14be0 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78  _OK || (p->rc&0x
14bf0 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
14c00 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
14c10 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
14c20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14c30 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
14c40 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
14c50 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
14c60 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
14c70 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
14c80 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
14c90 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
14ca0 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
14cb0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
14cc0 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
14cd0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
14ce0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
14cf0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
14d00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
14d10 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
14d20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  an INSERT, UPDAT
14d30 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20  E or DELETE and 
14d40 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
14d50 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nsaction.    ** 
14d60 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  has been rolled 
14d70 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65  back, update the
14d80 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
14d90 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e  tion change-coun
14da0 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ter. .    */.   
14db0 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e   if( p->changeCn
14dc0 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  tOn ){.      if(
14dd0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53   eStatementOp!=S
14de0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
14df0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
14e00 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
14e10 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
14e20 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
14e30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14e40 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
14e50 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
14e60 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
14e70 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
14e80 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  /* Release the l
14e90 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ocks */.    sqli
14ea0 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
14eb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
14ec0 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
14ed0 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
14ee0 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
14ef0 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
14f00 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
14f10 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41  {.    db->nVdbeA
14f20 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28  ctive--;.    if(
14f30 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20   !p->readOnly ) 
14f40 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d  db->nVdbeWrite--
14f50 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73  ;.    if( p->bIs
14f60 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64  Reader ) db->nVd
14f70 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73  beRead--;.    as
14f80 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
14f90 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65  ctive>=db->nVdbe
14fa0 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65  Read );.    asse
14fb0 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  rt( db->nVdbeRea
14fc0 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  d>=db->nVdbeWrit
14fd0 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
14fe0 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e   db->nVdbeWrite>
14ff0 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  =0 );.  }.  p->m
15000 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
15010 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
15020 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
15030 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
15040 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
15050 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
15060 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  OMEM_BKPT;.  }..
15070 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
15080 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
15090 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65  set to true, the
150a0 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74  n any locks that
150b0 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20   were held.  ** 
150c0 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  by connection db
150d0 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
150e0 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71  eleased. Call sq
150f0 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
15100 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20  nlocked() .  ** 
15110 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65  to invoke any re
15120 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f  quired unlock-no
15130 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  tify callbacks..
15140 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61    */.  if( db->a
15150 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  utoCommit ){.   
15160 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
15170 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a  onUnlocked(db);.
15180 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64    }..  assert( d
15190 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30  b->nVdbeActive>0
151a0 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   || db->autoComm
151b0 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74  it==0 || db->nSt
151c0 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  atement==0 );.  
151d0 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53  return (p->rc==S
151e0 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c  QLITE_BUSY ? SQL
151f0 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54  ITE_BUSY : SQLIT
15200 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  E_OK);.}.../*.**
15210 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73   Each VDBE holds
15220 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
15230 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
15240 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
15250 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20  ll.** in p->rc. 
15260 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
15270 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62  ts that result b
15280 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  ack to SQLITE_OK
15290 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
152a0 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65  3VdbeResetStepRe
152b0 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  sult(Vdbe *p){. 
152c0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
152d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  OK;.}../*.** Cop
152e0 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  y the error code
152f0 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
15300 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
15310 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a  the VDBE passed.
15320 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
15330 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20  argument to its 
15340 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
15350 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69  (so that they wi
15360 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e  ll be .** return
15370 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
15380 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29  qlite3_errcode()
15390 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72   and sqlite3_err
153a0 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  msg())..**.** Th
153b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
153c0 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56   not clear the V
153d0 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  DBE error code o
153e0 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a  r message, just.
153f0 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74  ** copies them t
15400 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
15410 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
15420 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65  lite3VdbeTransfe
15430 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b  rError(Vdbe *p){
15440 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
15450 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
15460 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
15470 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
15480 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c    db->bBenignMal
15490 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  loc++;.    sqlit
154a0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
154b0 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64  loc();.    if( d
154c0 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d  b->pErr==0 ) db-
154d0 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56  >pErr = sqlite3V
154e0 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20  alueNew(db);.   
154f0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
15500 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
15510 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
15520 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
15530 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
15540 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
15550 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
15560 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f  db->bBenignMallo
15570 63 2d 2d 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72  c--;.    db->err
15580 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c  Code = rc;.  }el
15590 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
155a0 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20  rror(db, rc);.  
155b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
155c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
155d0 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a  ENABLE_SQLLOG./*
155e0 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45  .** If an SQLITE
155f0 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68  _CONFIG_SQLLOG h
15600 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65  ook is registere
15610 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73  d and the VM has
15620 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69   been run, .** i
15630 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  nvoke it..*/.sta
15640 74 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76  tic void vdbeInv
15650 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a  okeSqllog(Vdbe *
15660 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  v){.  if( sqlite
15670 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
15680 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d  qllog && v->rc==
15690 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e  SQLITE_OK && v->
156a0 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30  zSql && v->pc>=0
156b0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   ){.    char *zE
156c0 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65  xpanded = sqlite
156d0 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76  3VdbeExpandSql(v
156e0 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20  , v->zSql);.    
156f0 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69  assert( v->db->i
15700 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20  nit.busy==0 );. 
15710 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64     if( zExpanded
15720 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15730 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
15740 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20  qllog(.         
15750 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
15760 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c  nfig.pSqllogArg,
15770 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65   v->db, zExpande
15780 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20  d, 1.      );.  
15790 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
157a0 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64  e(v->db, zExpand
157b0 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ed);.    }.  }.}
157c0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
157d0 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
157e0 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
157f0 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42  * Clean up a VDB
15800 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
15810 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c  n but do not del
15820 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73  ete the VDBE jus
15830 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20  t yet..** Write 
15840 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
15850 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  es into *pzErrMs
15860 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  g.  Return the r
15870 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  esult code..**.*
15880 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
15890 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65  tine is run, the
158a0 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20   VDBE should be 
158b0 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63  ready to be exec
158c0 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a  uted.** again..*
158d0 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20  *.** To look at 
158e0 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20  it another way, 
158f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  this routine res
15900 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
15910 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
15920 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42  machine from VDB
15930 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56  E_MAGIC_RUN or V
15940 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62  DBE_MAGIC_HALT b
15950 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  ack to.** VDBE_M
15960 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e  AGIC_INIT..*/.in
15970 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  t sqlite3VdbeRes
15980 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  et(Vdbe *p){.  s
15990 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62  qlite3 *db;.  db
159a0 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
159b0 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f  If the VM did no
159c0 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74  t run to complet
159d0 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63  ion or if it enc
159e0 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a  ountered an.  **
159f0 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20   error, then it 
15a00 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62  might not have b
15a10 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65  een halted prope
15a20 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20  rly.  So halt.  
15a30 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ** it now..  */.
15a40 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c    sqlite3VdbeHal
15a50 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  t(p);..  /* If t
15a60 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72  he VDBE has be r
15a70 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c  un even partiall
15a80 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  y, then transfer
15a90 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
15aa0 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d    ** and error m
15ab0 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20  essage from the 
15ac0 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61  VDBE into the ma
15ad0 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
15ae0 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a  cture.  But.  **
15af0 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73   if the VDBE has
15b00 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74   just been set t
15b10 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f  o run but has no
15b20 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75  t actually execu
15b30 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73  ted any.  ** ins
15b40 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c  tructions yet, l
15b50 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61  eave the main da
15b60 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66  tabase error inf
15b70 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67  ormation unchang
15b80 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
15b90 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76  ->pc>=0 ){.    v
15ba0 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
15bb0 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
15bc0 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
15bd0 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
15be0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
15bf0 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
15c00 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
15c10 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e  if( p->runOnlyOn
15c20 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20  ce ) p->expired 
15c30 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
15c40 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70   p->rc && p->exp
15c50 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ired ){.    /* T
15c60 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20  he expired flag 
15c70 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56  was set on the V
15c80 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66  DBE before the f
15c90 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  irst call.    **
15ca0 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70   to sqlite3_step
15cb0 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65  (). For consiste
15cc0 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74  ncy (since sqlit
15cd0 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20  e3_step() was.  
15ce0 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65    ** called), se
15cf0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65  t the database e
15d00 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73  rror in this cas
15d10 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a  e as well..    *
15d20 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
15d30 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70 2d  orWithMsg(db, p-
15d40 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20  >rc, p->zErrMsg 
15d50 3f 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a  ? "%s" : 0, p->z
15d60 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
15d70 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
15d80 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
15d90 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
15da0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69    }..  /* Reclai
15db0 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65  m all memory use
15dc0 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20  d by the VDBE.  
15dd0 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  */.  Cleanup(p);
15de0 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66  ..  /* Save prof
15df0 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iling informatio
15e00 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45  n from this VDBE
15e10 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65   run..  */.#ifde
15e20 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
15e30 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
15e40 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
15e50 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
15e60 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
15e70 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
15e80 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
15e90 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
15ea0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
15eb0 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
15ec0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
15ed0 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
15ee0 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
15ef0 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
15f00 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
15f10 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29     if( p->zSql )
15f20 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
15f30 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  , pc = 0;.      
15f40 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
15f50 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66  -- ");.        f
15f60 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e  or(i=0; (c = p->
15f70 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b  zSql[i])!=0; i++
15f80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
15f90 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69   pc=='\n' ) fpri
15fa0 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b  ntf(out, "-- ");
15fb0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28  .          putc(
15fc0 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20  c, out);.       
15fd0 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20     pc = c;.     
15fe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
15ff0 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69   pc!='\n' ) fpri
16000 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
16010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
16020 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
16030 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
16040 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20  har zHdr[100];. 
16050 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
16060 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
16070 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75  Hdr), zHdr, "%6u
16080 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c   %12llu %8llu ",
16090 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
160a0 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
160b0 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
160c0 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
160d0 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
160e0 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
160f0 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
16100 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
16110 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
16120 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48  tf(out, "%s", zH
16130 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  dr);.        sql
16140 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
16150 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
16160 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
16170 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
16180 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
16190 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69  .  p->iCurrentTi
161a0 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67  me = 0;.  p->mag
161b0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
161c0 52 45 53 45 54 3b 0a 20 20 72 65 74 75 72 6e 20  RESET;.  return 
161d0 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d  p->rc & db->errM
161e0 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43  ask;.}. ./*.** C
161f0 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65  lean up and dele
16200 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20  te a VDBE after 
16210 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75  execution.  Retu
16220 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
16230 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65  ich is.** the re
16240 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74  sult code.  Writ
16250 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
16260 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70  age text into *p
16270 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
16280 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
16290 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ize(Vdbe *p){.  
162a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
162b0 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  OK;.  if( p->mag
162c0 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
162d0 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  UN || p->magic==
162e0 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
162f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
16300 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b  te3VdbeReset(p);
16310 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63  .    assert( (rc
16320 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73   & p->db->errMas
16330 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20  k)==rc );.  }.  
16340 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
16350 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
16360 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  c;.}../*.** If p
16370 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20  arameter iOp is 
16380 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
16390 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
163a0 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a  destructor for.*
163b0 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20  * all auxiliary 
163c0 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75  data pointers cu
163d0 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62  rrently cached b
163e0 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  y the VM passed 
163f0 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  as.** the first 
16400 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
16410 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72  Or, if iOp is gr
16420 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
16430 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
16440 6e 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  n the destructor
16450 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f   is.** only invo
16460 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75  ked for those au
16470 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
16480 6e 74 65 72 73 20 63 72 65 61 74 65 64 20 62 79  nters created by
16490 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75   the user .** fu
164a0 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62  nction invoked b
164b0 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f  y the OP_Functio
164c0 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74  n opcode at inst
164d0 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a  ruction iOp of .
164e0 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64  ** VM pVdbe, and
164f0 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a   only then if:.*
16500 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73  *.**    * the as
16510 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f  sociated functio
16520 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  n parameter is t
16530 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72  he 32nd or later
16540 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20   (counting.**   
16550 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20     from left to 
16560 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a  right), or.**.**
16570 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73      * the corres
16580 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61  ponding bit in a
16590 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20  rgument mask is 
165a0 63 6c 65 61 72 20 28 77 68 65 72 65 20 74 68 65  clear (where the
165b0 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66   first.**      f
165c0 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
165d0 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  r corresponds to
165e0 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f   bit 0 etc.)..*/
165f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
16600 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 73  eDeleteAuxData(s
16610 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 75 78 44  qlite3 *db, AuxD
16620 61 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20 69 4f  ata **pp, int iO
16630 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  p, int mask){.  
16640 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20  while( *pp ){.  
16650 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20    AuxData *pAux 
16660 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28  = *pp;.    if( (
16670 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28  iOp<0).     || (
16680 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26  pAux->iOp==iOp &
16690 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31  & (pAux->iArg>31
166a0 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53   || !(mask & MAS
166b0 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72  KBIT32(pAux->iAr
166c0 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  g)))).    ){.   
166d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75     testcase( pAu
166e0 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20  x->iArg==31 );. 
166f0 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78       if( pAux->x
16700 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
16710 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28    pAux->xDelete(
16720 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
16730 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d     }.      *pp =
16740 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20   pAux->pNext;.  
16750 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
16760 65 28 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20  e(db, pAux);.   
16770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
16780 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a  = &pAux->pNext;.
16790 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
167a0 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  ** Free all memo
167b0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
167c0 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73  th the Vdbe pass
167d0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
167e0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78   argument,.** ex
167f0 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20  cept for object 
16800 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73  itself, which is
16810 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a   preserved..**.*
16820 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
16830 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
16840 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74  nction and sqlit
16850 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69  e3VdbeDelete() i
16860 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65  s that.** VdbeDe
16870 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69  lete() also unli
16880 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f  nks the Vdbe fro
16890 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d  m the list of VM
168a0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
168b0 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  h.** the databas
168c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64  e connection and
168d0 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63   frees the objec
168e0 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69  t itself..*/.voi
168f0 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65  d sqlite3VdbeCle
16900 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  arObject(sqlite3
16910 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
16920 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53    SubProgram *pS
16930 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73  ub, *pNext;.  as
16940 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c  sert( p->db==0 |
16950 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20  | p->db==db );. 
16960 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
16970 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
16980 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
16990 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53  AME_N);.  for(pS
169a0 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20  ub=p->pProgram; 
169b0 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74  pSub; pSub=pNext
169c0 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
169d0 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sub->pNext;.    
169e0 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
169f0 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70  db, pSub->aOp, p
16a00 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73  Sub->nOp);.    s
16a10 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16a20 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 69 66   pSub);.  }.  if
16a30 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
16a40 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20  _MAGIC_INIT ){. 
16a50 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
16a60 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e  ay(p->aVar, p->n
16a70 56 61 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Var);.    sqlite
16a80 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70  3DbFree(db, p->p
16a90 56 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  VList);.    sqli
16aa0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16ab0 3e 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 76  >pFree);.  }.  v
16ac0 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
16ad0 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f  b, p->aOp, p->nO
16ae0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
16af0 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
16b00 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
16b10 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71  bFree(db, p->zSq
16b20 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  l);.#ifdef SQLIT
16b30 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
16b40 41 4e 53 54 41 54 55 53 0a 20 20 7b 0a 20 20 20  ANSTATUS.  {.   
16b50 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
16b60 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b  i=0; i<p->nScan;
16b70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
16b80 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16b90 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65  ->aScan[i].zName
16ba0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
16bb0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16bc0 2d 3e 61 53 63 61 6e 29 3b 0a 20 20 7d 0a 23 65  ->aScan);.  }.#e
16bd0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
16be0 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56  lete an entire V
16bf0 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  DBE..*/.void sql
16c00 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56  ite3VdbeDelete(V
16c10 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
16c20 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e  e3 *db;..  if( N
16c30 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
16c40 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  urn;.  db = p->d
16c50 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
16c60 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16c70 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
16c80 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72  sqlite3VdbeClear
16c90 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20  Object(db, p);. 
16ca0 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
16cb0 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
16cc0 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
16cd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
16ce0 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d  sert( db->pVdbe=
16cf0 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56  =p );.    db->pV
16d00 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  dbe = p->pNext;.
16d10 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65    }.  if( p->pNe
16d20 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
16d30 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
16d40 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  Prev;.  }.  p->m
16d50 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
16d60 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20  C_DEAD;.  p->db 
16d70 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  = 0;.  sqlite3Db
16d80 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
16d90 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  /*.** The cursor
16da0 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69   "p" has a pendi
16db0 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  ng seek operatio
16dc0 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79  n that has not y
16dd0 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69  et been.** carri
16de0 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68  ed out.  Seek th
16df0 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49  e cursor now.  I
16e00 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
16e10 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  s, return.** the
16e20 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
16e30 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
16e40 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
16e50 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66  INLINE handleDef
16e60 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65  erredMoveto(Vdbe
16e70 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
16e80 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65  t res, rc;.#ifde
16e90 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
16ea0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
16eb0 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
16ec0 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
16ed0 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
16ee0 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eto );.  assert(
16ef0 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
16f00 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
16f10 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
16f20 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  REE );.  rc = sq
16f30 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
16f40 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70  Unpacked(p->uc.p
16f50 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f  Cursor, 0, p->mo
16f60 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26  vetoTarget, 0, &
16f70 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  res);.  if( rc )
16f80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
16f90 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72  ( res!=0 ) retur
16fa0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
16fb0 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51  _BKPT;.#ifdef SQ
16fc0 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
16fd0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
16fe0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e  ++;.#endif.  p->
16ff0 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
17000 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74   0;.  p->cacheSt
17010 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
17020 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  LE;.  return SQL
17030 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
17040 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d   Something has m
17050 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20  oved cursor "p" 
17060 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d  out of place.  M
17070 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20  aybe the row it 
17080 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74  was.** pointed t
17090 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  o was deleted ou
170a0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e  t from under it.
170b0 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62    Or maybe the b
170c0 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61  tree was.** reba
170d0 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65  lanced.  Whateve
170e0 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79  r the cause, try
170f0 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20   to restore "p" 
17100 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a  to the place it.
17110 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74  ** is supposed t
17120 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20  o be pointing.  
17130 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64  If the row was d
17140 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
17150 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72  under the.** cur
17160 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72  sor, set the cur
17170 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
17180 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73  a NULL row..*/.s
17190 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
171a0 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
171b0 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65  MovedCursor(Vdbe
171c0 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
171d0 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  t isDifferentRow
171e0 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  , rc;.  assert( 
171f0 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
17200 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
17210 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43  assert( p->uc.pC
17220 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73  ursor!=0 );.  as
17230 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
17240 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
17250 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
17260 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
17270 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
17280 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ore(p->uc.pCurso
17290 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52  r, &isDifferentR
172a0 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53  ow);.  p->cacheS
172b0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
172c0 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66  ALE;.  if( isDif
172d0 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e  ferentRow ) p->n
172e0 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65  ullRow = 1;.  re
172f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17300 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72  * Check to ensur
17310 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
17320 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73  r is valid.  Res
17330 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a  tore the cursor.
17340 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20  ** if need be.  
17350 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65  Return any I/O e
17360 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65  rror from the re
17370 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e  store operation.
17380 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
17390 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  dbeCursorRestore
173a0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
173b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
173c0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
173d0 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73  BTREE );.  if( s
173e0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
173f0 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
17400 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20  pCursor) ){.    
17410 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76  return handleMov
17420 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d  edCursor(p);.  }
17430 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17440 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
17450 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73  ke sure the curs
17460 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f  or p is ready to
17470 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
17480 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20  he row to which 
17490 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
174a0 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75  ositioned.  Retu
174b0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
174c0 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74   if an OOM fault
174d0 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a   or I/O error.**
174e0 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f   prevents us fro
174f0 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68  m positioning th
17500 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20  e cursor to its 
17510 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e  correct position
17520 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76  ..**.** If a Mov
17530 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  eTo operation is
17540 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20   pending on the 
17550 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68  given cursor, th
17560 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f  en do that.** Mo
17570 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f  veTo now.  If no
17580 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67   move is pending
17590 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
175a0 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65  f the row has be
175b0 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75  en.** deleted ou
175c0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
175d0 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69   cursor and if i
175e0 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20  t has, mark the 
175f0 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c  row as.** a NULL
17600 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   row..**.** If t
17610 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
17620 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
17630 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77   the correct row
17640 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61   and that row ha
17650 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65  s.** not been de
17660 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
17670 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c  nder the cursor,
17680 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
17690 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
176a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
176b0 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64  eCursorMoveto(Vd
176c0 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69  beCursor **pp, i
176d0 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64  nt *piCol){.  Vd
176e0 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70  beCursor *p = *p
176f0 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 43 75 72  p;.  if( p->eCur
17700 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
17710 52 45 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70  REE ){.    if( p
17720 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
17730 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d   ){.      int iM
17740 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ap;.      if( p-
17750 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69 4d 61  >aAltMap && (iMa
17760 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31  p = p->aAltMap[1
17770 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20  +*piCol])>0 ){. 
17780 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e         *pp = p->
17790 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20 20  pAltCursor;.    
177a0 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61      *piCol = iMa
177b0 70 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  p - 1;.        r
177c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
177d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
177e0 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66 65  eturn handleDefe
177f0 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20  rredMoveto(p);. 
17800 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
17810 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
17820 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43  asMoved(p->uc.pC
17830 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  ursor) ){.      
17840 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76  return handleMov
17850 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  edCursor(p);.   
17860 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17870 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
17880 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
17890 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  g functions:.**.
178a0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
178b0 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71  rialType().** sq
178c0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
178d0 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ypeLen().** sqli
178e0 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e  te3VdbeSerialLen
178f0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
17900 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20  eSerialPut().** 
17910 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17920 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  lGet().**.** enc
17930 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
17940 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
17950 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
17960 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
17970 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
17980 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
17990 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
179a0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
179b0 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
179c0 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
179d0 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
179e0 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
179f0 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
17a00 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
17a10 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
17a20 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
17a30 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
17a40 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
17a50 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
17a60 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
17a70 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
17a80 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
17a90 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
17aa0 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
17ab0 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
17ac0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
17ad0 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
17ae0 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
17af0 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
17b00 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
17b10 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
17b20 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
17b30 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
17b40 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
17b50 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e  blob separately.
17b60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
17b70 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
17b80 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
17b90 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
17ba0 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
17bb0 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
17bc0 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
17bd0 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
17be0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
17bf0 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
17c00 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
17c10 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
17c20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
17c30 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
17c40 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20      NULL.**     
17c50 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
17c60 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
17c70 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
17c80 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20  er.**      2    
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ca0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69   2            si
17cb0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
17cc0 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
17cd0 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20             3    
17ce0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
17cf0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34  nteger.**      4
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d10 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
17d20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
17d30 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20  .**      5      
17d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
17d50 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
17d60 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
17d70 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
17d80 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
17d90 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
17da0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20  eger.**      7  
17db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17dc0 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
17dd0 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20  IEEE float.**   
17de0 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
17df0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
17e00 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
17e10 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20  nstant 0.**     
17e20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20   9              
17e30 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
17e40 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
17e50 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30  tant 1.**     10
17e60 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ,11             
17e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e80 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
17e90 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
17ea0 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
17eb0 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
17ec0 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
17ed0 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
17ee0 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
17ef0 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54      text.**.** T
17f00 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73  he 8 and 9 types
17f10 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33   were added in 3
17f20 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61  .3.0, file forma
17f30 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73  t 4.  Prior vers
17f40 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
17f50 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72  e will not under
17f60 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69  stand those seri
17f70 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a  al types..*/../*
17f80 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
17f90 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
17fa0 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
17fb0 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
17fc0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17fd0 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  lType(Mem *pMem,
17fe0 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
17ff0 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20 20  , u32 *pLen){.  
18000 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d  int flags = pMem
18010 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e  ->flags;.  u32 n
18020 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  ;..  assert( pLe
18030 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 6c  n!=0 );.  if( fl
18040 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
18050 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20      *pLen = 0;. 
18060 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
18070 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
18080 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46  _Int ){.    /* F
18090 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65  igure out whethe
180a0 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34  r to use 1, 2, 4
180b0 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20  , 6 or 8 bytes. 
180c0 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41  */.#   define MA
180d0 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29  X_6BYTE ((((i64)
180e0 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29  0x00008000)<<32)
180f0 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20  -1).    i64 i = 
18100 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75  pMem->u.i;.    u
18110 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c  64 u;.    if( i<
18120 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e  0 ){.      u = ~
18130 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
18140 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d      u = i;.    }
18150 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
18160 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 26  ){.      if( (i&
18170 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f  1)==i && file_fo
18180 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 20  rmat>=4 ){.     
18190 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20     *pLen = 0;.  
181a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28        return 8+(
181b0 75 33 32 29 75 3b 0a 20 20 20 20 20 20 7d 65 6c  u32)u;.      }el
181c0 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65  se{.        *pLe
181d0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  n = 1;.        r
181e0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
181f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
18200 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c 65 6e  <=32767 ){ *pLen
18210 20 3d 20 32 3b 20 72 65 74 75 72 6e 20 32 3b 20   = 2; return 2; 
18220 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38  }.    if( u<=838
18230 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  8607 ){ *pLen = 
18240 33 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a 20  3; return 3; }. 
18250 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
18260 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  3647 ){ *pLen = 
18270 34 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a 20  4; return 4; }. 
18280 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42     if( u<=MAX_6B
18290 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 36  YTE ){ *pLen = 6
182a0 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20 20  ; return 5; }.  
182b0 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20    *pLen = 8;.   
182c0 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20   return 6;.  }. 
182d0 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52   if( flags&MEM_R
182e0 65 61 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e  eal ){.    *pLen
182f0 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 8;.    return
18300 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   7;.  }.  assert
18310 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c  ( pMem->db->mall
18320 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67  ocFailed || flag
18330 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  s&(MEM_Str|MEM_B
18340 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74  lob) );.  assert
18350 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a  ( pMem->n>=0 );.
18360 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d    n = (u32)pMem-
18370 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  >n;.  if( flags 
18380 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
18390 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e    n += pMem->u.n
183a0 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65  Zero;.  }.  *pLe
183b0 6e 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20  n = n;.  return 
183c0 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28  ((n*2) + 12 + ((
183d0 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d  flags&MEM_Str)!=
183e0 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  0));.}../*.** Th
183f0 65 20 73 69 7a 65 73 20 66 6f 72 20 73 65 72 69  e sizes for seri
18400 61 6c 20 74 79 70 65 73 20 6c 65 73 73 20 74 68  al types less th
18410 61 6e 20 31 32 38 0a 2a 2f 0a 73 74 61 74 69 63  an 128.*/.static
18420 20 63 6f 6e 73 74 20 75 38 20 73 71 6c 69 74 65   const u8 sqlite
18430 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
18440 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ] = {.        /*
18450 20 20 30 20 20 20 31 20 20 20 32 20 20 20 33 20    0   1   2   3 
18460 20 20 34 20 20 20 35 20 20 20 36 20 20 20 37 20    4   5   6   7 
18470 20 20 38 20 20 20 39 20 2a 2f 20 20 20 0a 2f 2a    8   9 */   ./*
18480 20 20 20 30 20 2a 2f 20 20 20 30 2c 20 20 31 2c     0 */   0,  1,
18490 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 36 2c    2,  3,  4,  6,
184a0 20 20 38 2c 20 20 38 2c 20 20 30 2c 20 20 30 2c    8,  8,  0,  0,
184b0 0a 2f 2a 20 20 31 30 20 2a 2f 20 20 20 30 2c 20  ./*  10 */   0, 
184c0 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20   0,  0,  0,  1, 
184d0 20 31 2c 20 20 32 2c 20 20 32 2c 20 20 33 2c 20   1,  2,  2,  3, 
184e0 20 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20 20 20   3,./*  20 */   
184f0 34 2c 20 20 34 2c 20 20 35 2c 20 20 35 2c 20 20  4,  4,  5,  5,  
18500 36 2c 20 20 36 2c 20 20 37 2c 20 20 37 2c 20 20  6,  6,  7,  7,  
18510 38 2c 20 20 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f  8,  8,./*  30 */
18520 20 20 20 39 2c 20 20 39 2c 20 31 30 2c 20 31 30     9,  9, 10, 10
18530 2c 20 31 31 2c 20 31 31 2c 20 31 32 2c 20 31 32  , 11, 11, 12, 12
18540 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a 20 20 34 30  , 13, 13,./*  40
18550 20 2a 2f 20 20 31 34 2c 20 31 34 2c 20 31 35 2c   */  14, 14, 15,
18560 20 31 35 2c 20 31 36 2c 20 31 36 2c 20 31 37 2c   15, 16, 16, 17,
18570 20 31 37 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a 20   17, 18, 18,./* 
18580 20 35 30 20 2a 2f 20 20 31 39 2c 20 31 39 2c 20   50 */  19, 19, 
18590 32 30 2c 20 32 30 2c 20 32 31 2c 20 32 31 2c 20  20, 20, 21, 21, 
185a0 32 32 2c 20 32 32 2c 20 32 33 2c 20 32 33 2c 0a  22, 22, 23, 23,.
185b0 2f 2a 20 20 36 30 20 2a 2f 20 20 32 34 2c 20 32  /*  60 */  24, 2
185c0 34 2c 20 32 35 2c 20 32 35 2c 20 32 36 2c 20 32  4, 25, 25, 26, 2
185d0 36 2c 20 32 37 2c 20 32 37 2c 20 32 38 2c 20 32  6, 27, 27, 28, 2
185e0 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20 20 32 39  8,./*  70 */  29
185f0 2c 20 32 39 2c 20 33 30 2c 20 33 30 2c 20 33 31  , 29, 30, 30, 31
18600 2c 20 33 31 2c 20 33 32 2c 20 33 32 2c 20 33 33  , 31, 32, 32, 33
18610 2c 20 33 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20  , 33,./*  80 */ 
18620 20 33 34 2c 20 33 34 2c 20 33 35 2c 20 33 35 2c   34, 34, 35, 35,
18630 20 33 36 2c 20 33 36 2c 20 33 37 2c 20 33 37 2c   36, 36, 37, 37,
18640 20 33 38 2c 20 33 38 2c 0a 2f 2a 20 20 39 30 20   38, 38,./*  90 
18650 2a 2f 20 20 33 39 2c 20 33 39 2c 20 34 30 2c 20  */  39, 39, 40, 
18660 34 30 2c 20 34 31 2c 20 34 31 2c 20 34 32 2c 20  40, 41, 41, 42, 
18670 34 32 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a 20 31  42, 43, 43,./* 1
18680 30 30 20 2a 2f 20 20 34 34 2c 20 34 34 2c 20 34  00 */  44, 44, 4
18690 35 2c 20 34 35 2c 20 34 36 2c 20 34 36 2c 20 34  5, 45, 46, 46, 4
186a0 37 2c 20 34 37 2c 20 34 38 2c 20 34 38 2c 0a 2f  7, 47, 48, 48,./
186b0 2a 20 31 31 30 20 2a 2f 20 20 34 39 2c 20 34 39  * 110 */  49, 49
186c0 2c 20 35 30 2c 20 35 30 2c 20 35 31 2c 20 35 31  , 50, 50, 51, 51
186d0 2c 20 35 32 2c 20 35 32 2c 20 35 33 2c 20 35 33  , 52, 52, 53, 53
186e0 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20 20 35 34 2c  ,./* 120 */  54,
186f0 20 35 34 2c 20 35 35 2c 20 35 35 2c 20 35 36 2c   54, 55, 55, 56,
18700 20 35 36 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a   56, 57, 57.};..
18710 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18720 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
18730 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ata correspondin
18740 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
18750 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a  d serial-type..*
18760 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
18770 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
18780 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
18790 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
187a0 70 65 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20 72  pe>=128 ){.    r
187b0 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
187c0 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73  pe-12)/2;.  }els
187d0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  e{.    assert( s
187e0 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 0a 20  erial_type<12 . 
187f0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
18800 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
18810 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
18820 3d 3d 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  ==(serial_type -
18830 20 31 32 29 2f 32 20 29 3b 0a 20 20 20 20 72 65   12)/2 );.    re
18840 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c  turn sqlite3Smal
18850 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
18860 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75  l_type];.  }.}.u
18870 38 20 73 71 6c 69 74 65 33 56 64 62 65 4f 6e 65  8 sqlite3VdbeOne
18880 42 79 74 65 53 65 72 69 61 6c 54 79 70 65 4c 65  ByteSerialTypeLe
18890 6e 28 75 38 20 73 65 72 69 61 6c 5f 74 79 70 65  n(u8 serial_type
188a0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 65 72  ){.  assert( ser
188b0 69 61 6c 5f 74 79 70 65 3c 31 32 38 20 29 3b 0a  ial_type<128 );.
188c0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
188d0 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73  SmallTypeSizes[s
188e0 65 72 69 61 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d  erial_type];  .}
188f0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
18900 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63  e on an architec
18910 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d  ture with mixed-
18920 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20  endian floating 
18930 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20  .** points (ex: 
18940 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20  ARM7) then swap 
18950 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65  the lower 4 byte
18960 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75  s with the .** u
18970 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52  pper 4 bytes.  R
18980 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
18990 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74  ..**.** For most
189a0 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20   architectures, 
189b0 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
189c0 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20  .**.** (later): 
189d0 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
189e0 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d  to me that the m
189f0 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62  ixed-endian prob
18a00 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69  lem.** on ARM7 i
18a10 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20  s an issue with 
18a20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68  GCC, not with th
18a30 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74  e ARM7 chip.  It
18a40 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65   seems.** that e
18a50 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66  arly versions of
18a60 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20   GCC stored the 
18a70 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36  two words of a 6
18a80 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69  4-bit.** float i
18a90 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65  n the wrong orde
18aa0 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72  r.  And that err
18ab0 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70  or has been prop
18ac0 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73  agated.** ever s
18ad0 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65  ince.  The blame
18ae0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
18af0 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68  ily with GCC, th
18b00 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67  ough..** GCC mig
18b10 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70  ht have just cop
18b20 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ying the problem
18b30 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f   from a prior co
18b40 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20  mpiler..** I am 
18b50 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e  also told that n
18b60 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
18b70 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77   GCC that follow
18b80 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
18b90 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65  ABI get the byte
18ba0 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a   order right..**
18bb0 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75  .** Developers u
18bc0 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61  sing SQLite on a
18bd0 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f  n ARM7 should co
18be0 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68  mpile and run th
18bf0 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69  eir.** applicati
18c00 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  on using -DSQLIT
18c10 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61  E_DEBUG=1 at lea
18c20 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44  st once.  With D
18c30 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  EBUG.** enabled,
18c40 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65   some asserts be
18c50 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20  low will ensure 
18c60 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72  that the byte or
18c70 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69  der of.** floati
18c80 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
18c90 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a  is correct..**.*
18ca0 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20  * (2007-08-30)  
18cb0 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68  Frank van Vugt h
18cc0 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20  as studied this 
18cd0 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a  problem closely.
18ce0 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20  ** and has send 
18cf0 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20  his findings to 
18d00 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c  the SQLite devel
18d10 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a  opers.  Frank.**
18d20 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d   writes that som
18d30 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  e Linux kernels 
18d40 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70  offer floating p
18d50 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a  oint hardware.**
18d60 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20   emulation that 
18d70 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74  uses only 32-bit
18d80 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65   mantissas inste
18d90 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a  ad of a full .**
18da0 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75   48-bits as requ
18db0 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45  ired by the IEEE
18dc0 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69   standard.  (Thi
18dd0 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46  s is the.** CONF
18de0 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f  IG_FPE_FASTFPE o
18df0 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68  ption.)  On such
18e00 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69   systems, floati
18e10 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65  ng point.** byte
18e20 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65   swapping become
18e30 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74  s very complicat
18e40 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72  ed.  To avoid pr
18e50 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e  oblems,.** the n
18e60 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77  ecessary byte sw
18e70 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65  apping is carrie
18e80 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34  d out using a 64
18e90 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  -bit integer.** 
18ea0 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34  rather than a 64
18eb0 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61  -bit float.  Fra
18ec0 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68  nk assures us th
18ed0 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  at the code here
18ee0 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69  .** works for hi
18ef0 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65  m.  We, the deve
18f00 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20  lopers, have no 
18f10 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65  way to independe
18f20 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74  ntly.** verify t
18f30 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73  his, but Frank s
18f40 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61  eems to know wha
18f50 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20  t he is talking 
18f60 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74  about.** so we t
18f70 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66  rust him..*/.#if
18f80 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44  def SQLITE_MIXED
18f90 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
18fa0 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66  OAT.static u64 f
18fb0 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29  loatSwap(u64 in)
18fc0 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  {.  union {.    
18fd0 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69  u64 r;.    u32 i
18fe0 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  [2];.  } u;.  u3
18ff0 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e  2 t;..  u.r = in
19000 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a  ;.  t = u.i[0];.
19010 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31    u.i[0] = u.i[1
19020 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b  ];.  u.i[1] = t;
19030 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d  .  return u.r;.}
19040 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
19050 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
19060 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70  )  X = floatSwap
19070 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
19080 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
19090 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69  anFloat(X).#endi
190a0 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  f../*.** Write t
190b0 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
190c0 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20  ta blob for the 
190d0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
190e0 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75  pMem into .** bu
190f0 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  f. It is assumed
19100 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
19110 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73   has allocated s
19120 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e  ufficient space.
19130 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
19140 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
19150 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42  ritten..**.** nB
19160 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  uf is the amount
19170 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69   of space left i
19180 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61  n buf[].  The ca
19190 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
191a0 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63  ble.** for alloc
191b0 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61  ating enough spa
191c0 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68  ce to buf[] to h
191d0 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66  old the entire f
191e0 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a  ield, exclusive.
191f0 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e  ** of the pMem->
19200 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f  u.nZero bytes fo
19210 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c  r a MEM_Zero val
19220 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ue..**.** Return
19230 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
19240 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72  ytes actually wr
19250 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d  itten into buf[]
19260 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
19270 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
19280 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
19290 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e  l is included in
192a0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
192b0 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f  e only.** if tho
192c0 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65  se bytes were ze
192d0 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a  roed in buf[]..*
192e0 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  / .u32 sqlite3Vd
192f0 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a  beSerialPut(u8 *
19300 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20  buf, Mem *pMem, 
19310 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
19320 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20  {.  u32 len;..  
19330 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52  /* Integer and R
19340 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  eal */.  if( ser
19350 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73  ial_type<=7 && s
19360 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a  erial_type>0 ){.
19370 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75      u64 v;.    u
19380 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65  32 i;.    if( se
19390 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
193a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
193b0 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28  zeof(v)==sizeof(
193c0 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20  pMem->u.r) );.  
193d0 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26      memcpy(&v, &
193e0 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f  pMem->u.r, sizeo
193f0 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61  f(v));.      swa
19400 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
19410 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t(v);.    }else{
19420 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d  .      v = pMem-
19430 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >u.i;.    }.    
19440 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65  len = i = sqlite
19450 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
19460 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
19470 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
19480 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62  .    do{.      b
19490 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76  uf[--i] = (u8)(v
194a0 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
194b0 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c  >>= 8;.    }whil
194c0 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74 75  e( i );.    retu
194d0 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
194e0 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  * String or blob
194f0 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
19500 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
19510 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
19520 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   + ((pMem->flags
19530 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65   & MEM_Zero)?pMe
19540 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20  m->u.nZero:0).  
19550 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69             == (i
19560 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt)sqlite3VdbeSe
19570 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
19580 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20  al_type) );.    
19590 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  len = pMem->n;. 
195a0 20 20 20 69 66 28 20 6c 65 6e 3e 30 20 29 20 6d     if( len>0 ) m
195b0 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d  emcpy(buf, pMem-
195c0 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65  >z, len);.    re
195d0 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
195e0 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73   /* NULL or cons
195f0 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a  tants 0 or 1 */.
19600 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
19610 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73 20 61  * Input "x" is a
19620 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73   sequence of uns
19630 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72 73  igned characters
19640 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 20   that represent 
19650 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20  a.** big-endian 
19660 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e  integer.  Return
19670 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
19680 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a  native integer.*
19690 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59  /.#define ONE_BY
196a0 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69  TE_INT(x)    ((i
196b0 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e  8)(x)[0]).#defin
196c0 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78  e TWO_BYTE_INT(x
196d0 29 20 20 20 20 28 32 35 36 2a 28 69 38 29 28 28  )    (256*(i8)((
196e0 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23  x)[0])|(x)[1]).#
196f0 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54  define THREE_BYT
19700 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33 36  E_INT(x)  (65536
19710 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28  *(i8)((x)[0])|((
19720 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d  x)[1]<<8)|(x)[2]
19730 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42  ).#define FOUR_B
19740 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28  YTE_UINT(x)  (((
19750 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c  u32)(x)[0]<<24)|
19760 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78  ((x)[1]<<16)|((x
19770 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29  )[2]<<8)|(x)[3])
19780 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59  .#define FOUR_BY
19790 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37  TE_INT(x) (16777
197a0 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  216*(i8)((x)[0])
197b0 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28  |((x)[1]<<16)|((
197c0 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d  x)[2]<<8)|(x)[3]
197d0 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  )../*.** Deseria
197e0 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
197f0 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
19800 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
19810 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
19820 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
19830 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
19840 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
19850 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
19860 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
19870 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  nction is implem
19880 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65 70  ented as two sep
19890 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66  arate routines f
198a0 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  or performance..
198b0 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73 65 73  ** The few cases
198c0 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f   that require lo
198d0 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72  cal variables ar
198e0 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74  e broken out int
198f0 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20  o a separate.** 
19900 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20  routine so that 
19910 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68  in most cases th
19920 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f  e overhead of mo
19930 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70  ving the stack p
19940 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f  ointer.** is avo
19950 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  ided..*/ .static
19960 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   u32 SQLITE_NOIN
19970 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a  LINE serialGet(.
19980 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
19990 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
199a0 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
199b0 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
199c0 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
199d0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
199e0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
199f0 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
19a00 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
19a30 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
19a40 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34  into */.){.  u64
19a50 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
19a60 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20  INT(buf);.  u32 
19a70 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
19a80 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d  NT(buf+4);.  x =
19a90 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20   (x<<32) + y;.  
19aa0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
19ab0 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  =6 ){.    /* EVI
19ac0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35  DENCE-OF: R-2985
19ad0 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20 69 73  1-52272 Value is
19ae0 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 36 34   a big-endian 64
19af0 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73  -bit.    ** twos
19b00 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
19b10 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  ger. */.    pMem
19b20 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
19b30 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  x;.    pMem->fla
19b40 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
19b50 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
19b60 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c  ->u.i<0 );.  }el
19b70 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  se{.    /* EVIDE
19b80 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d  NCE-OF: R-57343-
19b90 34 39 31 31 34 20 56 61 6c 75 65 20 69 73 20 61  49114 Value is a
19ba0 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45 45 45   big-endian IEEE
19bb0 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62 69 74   754-2008 64-bit
19bc0 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67  .    ** floating
19bd0 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a   point number. *
19be0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  /.#if !defined(N
19bf0 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
19c00 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
19c10 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
19c20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
19c30 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66  t integers and f
19c40 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
19c50 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d  lues use the sam
19c60 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72  e.    ** byte or
19c70 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69  der.  Or, that i
19c80 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
19c90 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
19ca0 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  T is.    ** defi
19cb0 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20  ned that 64-bit 
19cc0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
19cd0 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65  alues really are
19ce0 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e   mixed.    ** en
19cf0 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dian..    */.   
19d00 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36   static const u6
19d10 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33  4 t1 = ((u64)0x3
19d20 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20  ff00000)<<32;.  
19d30 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
19d40 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
19d50 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
19d60 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e  .    swapMixedEn
19d70 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20  dianFloat(t2);. 
19d80 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
19d90 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32  f(r1)==sizeof(t2
19da0 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c  ) && memcmp(&r1,
19db0 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29   &t2, sizeof(r1)
19dc0 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20  )==0 );.#endif. 
19dd0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
19de0 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f  f(x)==8 && sizeo
19df0 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20  f(pMem->u.r)==8 
19e00 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64  );.    swapMixed
19e10 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a  EndianFloat(x);.
19e20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
19e30 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f  ->u.r, &x, sizeo
19e40 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  f(x));.    pMem-
19e50 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  >flags = sqlite3
19e60 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29  IsNaN(pMem->u.r)
19e70 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45   ? MEM_Null : ME
19e80 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65  M_Real;.  }.  re
19e90 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71  turn 8;.}.u32 sq
19ea0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
19eb0 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
19ec0 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
19ed0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
19ee0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
19ef0 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
19f00 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
19f10 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
19f20 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
19f30 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
19f40 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
19f50 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
19f60 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
19f70 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
19f80 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
19f90 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
19fa0 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   10:   /* Reserv
19fb0 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
19fc0 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31  e */.    case 11
19fd0 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
19fe0 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
19ff0 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20  /.    case 0: { 
1a000 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20   /* Null */.    
1a010 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1a020 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20  : R-24078-09375 
1a030 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e  Value is a NULL.
1a040 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1a050 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
1a060 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a070 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a     }.    case 1:
1a080 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
1a090 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35  ENCE-OF: R-44885
1a0a0 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69 73 20  -25196 Value is 
1a0b0 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f  an 8-bit twos-co
1a0c0 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  mplement.      *
1a0d0 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  * integer. */.  
1a0e0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1a0f0 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  ONE_BYTE_INT(buf
1a100 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
1a110 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1a120 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a130 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
1a140 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1a150 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
1a160 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
1a170 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1a180 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1a190 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30  -OF: R-49794-350
1a1a0 32 36 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  26 Value is a bi
1a1b0 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a  g-endian 16-bit.
1a1c0 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
1a1d0 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
1a1e0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1a1f0 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f  >u.i = TWO_BYTE_
1a200 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
1a210 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1a220 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
1a230 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
1a240 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
1a250 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 2;.    }.    
1a260 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
1a270 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1a280 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
1a290 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
1a2a0 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20  839-54301 Value 
1a2b0 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
1a2c0 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  24-bit.      ** 
1a2d0 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
1a2e0 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
1a2f0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48    pMem->u.i = TH
1a300 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  REE_BYTE_INT(buf
1a310 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
1a320 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1a330 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a340 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
1a350 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20       return 3;. 
1a360 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
1a370 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
1a380 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1a390 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1a3a0 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30  -OF: R-01849-260
1a3b0 37 39 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  79 Value is a bi
1a3c0 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a  g-endian 32-bit.
1a3d0 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
1a3e0 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
1a3f0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1a400 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45  >u.i = FOUR_BYTE
1a410 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66 64 65  _INT(buf);.#ifde
1a420 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20 20  f __HP_cc .     
1a430 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20   /* Work around 
1a440 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e  a sign-extension
1a450 20 62 75 67 20 69 6e 20 74 68 65 20 48 50 20 63   bug in the HP c
1a460 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50 2f 55  ompiler for HP/U
1a470 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62  X */.      if( b
1a480 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70 4d 65  uf[0]&0x80 ) pMe
1a490 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66 66  m->u.i |= 0xffff
1a4a0 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a  ffff80000000LL;.
1a4b0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4d 65  #endif.      pMe
1a4c0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1a4d0 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
1a4e0 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
1a4f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a500 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  4;.    }.    cas
1a510 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
1a520 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1a530 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1a540 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35  ENCE-OF: R-50385
1a550 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69 73 20  -09674 Value is 
1a560 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d  a big-endian 48-
1a570 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  bit.      ** two
1a580 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
1a590 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
1a5a0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f  Mem->u.i = FOUR_
1a5b0 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29  BYTE_UINT(buf+2)
1a5c0 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
1a5d0 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62  )*TWO_BYTE_INT(b
1a5e0 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
1a5f0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1a600 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1a610 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1a620 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b  .      return 6;
1a630 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1a640 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73  6:   /* 8-byte s
1a650 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1a660 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f  .    case 7: { /
1a670 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20  * IEEE floating 
1a680 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  point */.      /
1a690 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61  * These use loca
1a6a0 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20  l variables, so 
1a6b0 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70  do them in a sep
1a6c0 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20  arate routine.  
1a6d0 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20      ** to avoid 
1a6e0 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74  having to move t
1a6f0 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72  he frame pointer
1a700 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
1a710 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ase */.      ret
1a720 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75  urn serialGet(bu
1a730 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d  f,serial_type,pM
1a740 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  em);.    }.    c
1a750 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74  ase 8:    /* Int
1a760 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61  eger 0 */.    ca
1a770 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65  se 9: {  /* Inte
1a780 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f  ger 1 */.      /
1a790 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a7a0 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56 61 6c  -12976-22893 Val
1a7b0 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65  ue is the intege
1a7c0 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  r 0. */.      /*
1a7d0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a7e0 31 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c 75  18143-12121 Valu
1a7f0 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72  e is the integer
1a800 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   1. */.      pMe
1a810 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f  m->u.i = serial_
1a820 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d  type-8;.      pM
1a830 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1a840 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
1a850 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  n 0;.    }.    d
1a860 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1a870 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a880 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56 61  R-14606-31564 Va
1a890 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74 68  lue is a BLOB th
1a8a0 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20 62  at is (N-12)/2 b
1a8b0 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ytes in.      **
1a8c0 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a   length..      *
1a8d0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a8e0 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56 61 6c  -28401-00140 Val
1a8f0 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 69  ue is a string i
1a900 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64  n the text encod
1a910 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ing and.      **
1a920 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73 20   (N-13)/2 bytes 
1a930 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20  in length. */.  
1a940 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1a950 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b   u16 aFlag[] = {
1a960 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70   MEM_Blob|MEM_Ep
1a970 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  hem, MEM_Str|MEM
1a980 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20  _Ephem };.      
1a990 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20  pMem->z = (char 
1a9a0 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65  *)buf;.      pMe
1a9b0 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74  m->n = (serial_t
1a9c0 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
1a9d0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61   pMem->flags = a
1a9e0 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65  Flag[serial_type
1a9f0 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72  &1];.      retur
1aa00 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d  n pMem->n;.    }
1aa10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1aa20 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .}./*.** This ro
1aa30 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
1aa40 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63   allocate suffic
1aa50 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61  ient space for a
1aa60 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  n UnpackedRecord
1aa70 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61  .** structure la
1aa80 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65  rge enough to be
1aa90 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74   used with sqlit
1aaa0 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
1aab0 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66  ck() if.** the f
1aac0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
1aad0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65   a pointer to Ke
1aae0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
1aaf0 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20  pKeyInfo..**.** 
1ab00 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69 74  The space is eit
1ab10 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  her allocated us
1ab20 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  ing sqlite3DbMal
1ab30 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d  locRaw() or from
1ab40 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75   within.** the u
1ab50 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20  naligned buffer 
1ab60 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73  passed via the s
1ab70 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20  econd and third 
1ab80 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75  arguments (presu
1ab90 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73  mably.** stack s
1aba0 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f  pace). If the fo
1abb0 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72  rmer, then *ppFr
1abc0 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  ee is set to a p
1abd0 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75  ointer that shou
1abe0 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61  ld.** be eventua
1abf0 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65  lly freed by the
1ac00 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
1ac10 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f  lite3DbFree(). O
1ac20 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c  r, if the .** al
1ac30 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66  location comes f
1ac40 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73  rom the pSpace/s
1ac50 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a  zSpace buffer, *
1ac60 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f  ppFree is set to
1ac70 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20   NULL.** before 
1ac80 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
1ac90 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
1aca0 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
1acb0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e   returned..*/.Un
1acc0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71  packedRecord *sq
1acd0 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
1ace0 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20  packedRecord(.  
1acf0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1ad00 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
1ad10 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
1ad20 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  f the record */.
1ad30 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  ){.  UnpackedRec
1ad40 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ord *p;         
1ad50 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64       /* Unpacked
1ad60 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72   record to retur
1ad70 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  n */.  int nByte
1ad80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ad90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ada0 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
1adb0 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 20 20 6e  ed for *p */.  n
1adc0 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
1add0 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63  zeof(UnpackedRec
1ade0 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d  ord)) + sizeof(M
1adf0 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e  em)*(pKeyInfo->n
1ae00 46 69 65 6c 64 2b 31 29 3b 0a 20 20 70 20 3d 20  Field+1);.  p = 
1ae10 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
1ae20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
1ae30 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64  cRaw(pKeyInfo->d
1ae40 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  b, nByte);.  if(
1ae50 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
1ae60 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d    p->aMem = (Mem
1ae70 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f  *)&((char*)p)[RO
1ae80 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
1ae90 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20  ckedRecord))];. 
1aea0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1aeb0 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
1aec0 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66   );.  p->pKeyInf
1aed0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
1aee0 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  p->nField = pKey
1aef0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31  Info->nField + 1
1af00 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
1af10 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
1af20 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64   nKey-byte encod
1af30 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20  ing of a record 
1af40 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c  in pKey[], popul
1af50 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61  ate the .** Unpa
1af60 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  ckedRecord struc
1af70 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62  ture indicated b
1af80 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  y the fourth arg
1af90 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a  ument with the.*
1afa0 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1afb0 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64  e decoded record
1afc0 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
1afd0 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
1afe0 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ck(.  KeyInfo *p
1aff0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20  KeyInfo,     /* 
1b000 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
1b010 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  t the record for
1b020 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  mat */.  int nKe
1b030 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
1b040 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62  /* Size of the b
1b050 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
1b060 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
1b070 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey,      /* The 
1b080 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
1b090 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1b0a0 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70  d *p      /* Pop
1b0b0 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63  ulate this struc
1b0c0 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75  ture before retu
1b0d0 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63  rning. */.){.  c
1b0e0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1b0f0 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
1b100 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1b110 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b  *)pKey;.  int d;
1b120 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20 20   .  u32 idx;    
1b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b140 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1b150 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20   aKey[] to read 
1b160 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b  from */.  u16 u;
1b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
1b190 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
1b1a0 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  er */.  u32 szHd
1b1b0 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  r;.  Mem *pMem =
1b1c0 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e   p->aMem;..  p->
1b1d0 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a  default_rc = 0;.
1b1e0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
1b1f0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
1b200 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20  Mem) );.  idx = 
1b210 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1b220 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20  , szHdr);.  d = 
1b230 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a  szHdr;.  u = 0;.
1b240 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48    while( idx<szH
1b250 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b  dr && d<=nKey ){
1b260 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
1b270 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b  type;..    idx +
1b280 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  = getVarint32(&a
1b290 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c  Key[idx], serial
1b2a0 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d  _type);.    pMem
1b2b0 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  ->enc = pKeyInfo
1b2c0 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d  ->enc;.    pMem-
1b2d0 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  >db = pKeyInfo->
1b2e0 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d  db;.    /* pMem-
1b2f0 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73  >flags = 0; // s
1b300 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1b310 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74  Get() will set t
1b320 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  his for us */.  
1b330 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63    pMem->szMalloc
1b340 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e   = 0;.    pMem->
1b350 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20  z = 0;.    d += 
1b360 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1b370 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73  lGet(&aKey[d], s
1b380 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d  erial_type, pMem
1b390 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  );.    pMem++;. 
1b3a0 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d     if( (++u)>=p-
1b3b0 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b  >nField ) break;
1b3c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75  .  }.  assert( u
1b3d0 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  <=pKeyInfo->nFie
1b3e0 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e  ld + 1 );.  p->n
1b3f0 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69  Field = u;.}..#i
1b400 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1b410 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1b420 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20  on compares two 
1b430 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72  index or table r
1b440 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68  ecord keys in th
1b450 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73  e same way.** as
1b460 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
1b470 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1b480 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20  routine. Unlike 
1b490 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1b4a0 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  e(),.** this fun
1b4b0 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a  ction deserializ
1b4c0 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20  es and compares 
1b4d0 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65  values using the
1b4e0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
1b4f0 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73  erialGet() and s
1b500 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1b510 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74  () functions. It
1b520 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61   is used.** in a
1b530 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1b540 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
1b550 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20  t the optimized 
1b560 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  code in.** sqlit
1b570 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1b580 61 72 65 28 29 20 72 65 74 75 72 6e 73 20 72 65  are() returns re
1b590 73 75 6c 74 73 20 77 69 74 68 20 74 68 65 73 65  sults with these
1b5a0 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e   two primitives.
1b5b0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1b5c0 75 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  ue if the result
1b5d0 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   of comparison i
1b5e0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
1b5f0 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a  desiredResult..*
1b600 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69  * Return false i
1b610 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69 73  f there is a dis
1b620 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  agreement..*/.st
1b630 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
1b640 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1b650 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1b660 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1b670 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1b680 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64    const Unpacked
1b690 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
1b6a0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1b6b0 20 20 69 6e 74 20 64 65 73 69 72 65 64 52 65 73    int desiredRes
1b6c0 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
1b6d0 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65  /* Correct answe
1b6e0 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31  r */.){.  u32 d1
1b6f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b700 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1b710 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
1b720 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
1b730 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
1b740 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
1b750 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
1b760 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
1b770 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
1b780 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b790 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
1b7a0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
1b7b0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
1b7c0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1b7d0 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
1b7e0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1b7f0 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b  har *)pKey1;.  K
1b800 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1b810 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
1b820 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65   pKeyInfo = pPKe
1b830 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
1b840 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  if( pKeyInfo->db
1b850 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
1b860 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
1b870 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
1b880 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
1b890 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e  ->db;.  /* mem1.
1b8a0 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57  flags = 0;  // W
1b8b0 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ill be initializ
1b8c0 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62  ed by sqlite3Vdb
1b8d0 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a  eSerialGet() */.
1b8e0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
1b8f0 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  .szMalloc = 0; )
1b900 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
1b910 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
1b920 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20  ements */..  /* 
1b930 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f  Compilers may co
1b940 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31  mplain that mem1
1b950 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61  .u.i is potentia
1b960 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  lly uninitialize
1b970 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64  d..  ** We could
1b980 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20   initialize it, 
1b990 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74  as shown here, t
1b9a0 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20  o silence those 
1b9b0 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a  complaints..  **
1b9c0 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65   But in fact, me
1b9d0 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65  m1.u.i will neve
1b9e0 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73  r actually be us
1b9f0 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ed uninitialized
1ba00 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a  , and doing .  *
1ba10 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72  * the unnecessar
1ba20 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  y initialization
1ba30 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c   has a measurabl
1ba40 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f  e negative perfo
1ba50 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61  rmance.  ** impa
1ba60 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72  ct, since this r
1ba70 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79  outine is a very
1ba80 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41   high runner.  A
1ba90 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65  nd so, we choose
1baa0 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20  .  ** to ignore 
1bab0 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  the compiler war
1bac0 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20  nings and leave 
1bad0 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e  this variable un
1bae0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
1baf0 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69  /.  /*  mem1.u.i
1bb00 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65   = 0;  // not ne
1bb10 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69  eded, here to si
1bb20 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77  lence compiler w
1bb30 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69  arning */.  .  i
1bb40 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
1bb50 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
1bb60 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31 3e 39  ;.  if( szHdr1>9
1bb70 38 33 30 37 20 29 20 72 65 74 75 72 6e 20 53 51  8307 ) return SQ
1bb80 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
1bb90 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61  d1 = szHdr1;.  a
1bba0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1bbb0 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f  >nField+pKeyInfo
1bbc0 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79  ->nXField>=pPKey
1bbd0 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52  2->nField || COR
1bbe0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
1bbf0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
1bc00 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
1bc10 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1bc20 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  fo->nField>0 );.
1bc30 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
1bc40 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
1bc50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
1bc60 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1bc70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e1;..    /* Read
1bc80 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
1bc90 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
1bca0 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
1bcb0 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
1bcc0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20  += getVarint32( 
1bcd0 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
1bce0 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20  al_type1 );..   
1bcf0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1bd00 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
1bd10 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e  key space remain
1bd20 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20  ing to avoid.   
1bd30 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65   ** a buffer ove
1bd40 72 72 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b  rread.  The "d1+
1bd50 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20  serial_type1+2" 
1bd60 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69  subexpression wi
1bd70 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  ll.    ** always
1bd80 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
1bd90 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1bda0 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69   amount of requi
1bdb0 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20  red key space.. 
1bdc0 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61     ** Use that a
1bdd0 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20  pproximation to 
1bde0 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65  avoid the more e
1bdf0 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f  xpensive call to
1be00 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56  .    ** sqlite3V
1be10 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1be20 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  () in the common
1be30 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
1be40 20 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f    if( d1+serial_
1be50 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65  type1+2>(u32)nKe
1be60 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71  y1.     && d1+sq
1be70 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1be80 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
1be90 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20  pe1)>(u32)nKey1 
1bea0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72  .    ){.      br
1beb0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1bec0 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
1bed0 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70  alues to be comp
1bee0 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
1bef0 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
1bf00 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1bf10 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
1bf20 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20  ype1, &mem1);.. 
1bf30 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
1bf40 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20  parison.    */. 
1bf50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
1bf60 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c  emCompare(&mem1,
1bf70 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69   &pPKey2->aMem[i
1bf80 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ], pKeyInfo->aCo
1bf90 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ll[i]);.    if( 
1bfa0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  rc!=0 ){.      a
1bfb0 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1bfc0 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
1bfd0 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
1bfe0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b   */.      if( pK
1bff0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1c000 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[i] ){.       
1c010 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49   rc = -rc;  /* I
1c020 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74  nvert the result
1c030 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f   for DESC sort o
1c040 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  rder. */.      }
1c050 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75  .      goto debu
1c060 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20  gCompareEnd;.   
1c070 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77   }.    i++;.  }w
1c080 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72  hile( idx1<szHdr
1c090 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
1c0a0 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e  Field );..  /* N
1c0b0 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
1c0c0 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
1c0d0 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
1c0e0 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
1c0f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1c100 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
1c110 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
1c120 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
1c130 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
1c140 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
1c150 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
1c160 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
1c170 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1c180 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1c190 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30  0 );..  /* rc==0
1c1a0 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
1c1b0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   one of the keys
1c1c0 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
1c1d0 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
1c1e0 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
1c1f0 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
1c200 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74   equal. Return t
1c210 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20  he default_rc.  
1c220 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  ** value.  */.  
1c230 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  rc = pPKey2->def
1c240 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43  ault_rc;..debugC
1c250 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28  ompareEnd:.  if(
1c260 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d   desiredResult==
1c270 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74  0 && rc==0 ) ret
1c280 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73  urn 1;.  if( des
1c290 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20  iredResult<0 && 
1c2a0 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  rc<0 ) return 1;
1c2b0 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1c2c0 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29  sult>0 && rc>0 )
1c2d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1c2e0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
1c2f0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b  turn 1;.  if( pK
1c300 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
1c310 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1c320 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
1c330 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  .}.#endif..#if S
1c340 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1c350 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
1c360 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e  er of fields (a.
1c370 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e  k.a. columns) in
1c380 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65   the record give
1c390 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65  n by.** pKey,nKe
1c3a0 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74  y.  The verify t
1c3b0 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69  hat this count i
1c3c0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
1c3d0 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c  qual to the.** l
1c3e0 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b  imit given by pK
1c3f0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
1c400 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65   pKeyInfo->nXFie
1c410 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ld..**.** If thi
1c420 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  s constraint is 
1c430 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20 69  not satisfied, i
1c440 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1c450 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
1c460 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c470 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52 65  Int() and vdbeRe
1c480 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1c490 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  g() routines wil
1c4a0 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  l.** not work co
1c4b0 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69  rrectly.  If thi
1c4c0 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72 20  s assert() ever 
1c4d0 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62  fires, it probab
1c4e0 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  ly means.** that
1c4f0 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69   the KeyInfo.nFi
1c500 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e  eld or KeyInfo.n
1c510 58 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65  XField values we
1c520 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69  re computed.** i
1c530 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73  ncorrectly..*/.s
1c540 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 41  tatic void vdbeA
1c550 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
1c560 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69  ithinLimits(.  i
1c570 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76  nt nKey, const v
1c580 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
1c590 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65  The record to ve
1c5a0 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74  rify */ .  const
1c5b0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1c5c0 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  fo       /* Comp
1c5d0 61 72 65 20 73 69 7a 65 20 77 69 74 68 20 74 68  are size with th
1c5e0 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b  is KeyInfo */.){
1c5f0 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20  .  int nField = 
1c600 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  0;.  u32 szHdr;.
1c610 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32    u32 idx;.  u32
1c620 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73   notUsed;.  cons
1c630 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1c640 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
1c650 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b  nsigned char*)pK
1c660 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55  ey;..  if( CORRU
1c670 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  PT_DB ) return;.
1c680 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
1c690 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
1c6a0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  ;.  assert( nKey
1c6b0 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1c6c0 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65   szHdr<=(u32)nKe
1c6d0 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  y );.  while( id
1c6e0 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69  x<szHdr ){.    i
1c6f0 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
1c700 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55  2(aKey+idx, notU
1c710 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64  sed);.    nField
1c720 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ++;.  }.  assert
1c730 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79  ( nField <= pKey
1c740 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65  Info->nField+pKe
1c750 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29  yInfo->nXField )
1c760 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1c770 6e 65 20 76 64 62 65 41 73 73 65 72 74 46 69 65  ne vdbeAssertFie
1c780 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
1c790 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69  its(A,B,C).#endi
1c7a0 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70  f../*.** Both *p
1c7b0 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20  Mem1 and *pMem2 
1c7c0 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76  contain string v
1c7d0 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74  alues. Compare t
1c7e0 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a  he two values.**
1c7f0 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
1c800 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
1c810 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72  oll. As usual, r
1c820 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
1c830 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f   , zero.** or po
1c840 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
1c850 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74  *pMem1 is less t
1c860 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
1c870 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a   greater than .*
1c880 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63  * *pMem2, respec
1c890 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20  tively. Similar 
1c8a0 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63  in spirit to "rc
1c8b0 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a   = (*pMem1) - (*
1c8c0 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61  pMem2);"..*/.sta
1c8d0 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70  tic int vdbeComp
1c8e0 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20  areMemString(.  
1c8f0 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31  const Mem *pMem1
1c900 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  ,.  const Mem *p
1c910 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f  Mem2,.  const Co
1c920 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20  llSeq *pColl,.  
1c930 75 38 20 2a 70 72 63 45 72 72 20 20 20 20 20 20  u8 *prcErr      
1c940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c950 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63  /* If an OOM occ
1c960 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49  urs, set to SQLI
1c970 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20  TE_NOMEM */.){. 
1c980 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d   if( pMem1->enc=
1c990 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20  =pColl->enc ){. 
1c9a0 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67     /* The string
1c9b0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  s are already in
1c9c0 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63   the correct enc
1c9d0 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65  oding.  Call the
1c9e0 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69  .     ** compari
1c9f0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72  son function dir
1ca00 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74  ectly */.    ret
1ca10 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28  urn pColl->xCmp(
1ca20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65  pColl->pUser,pMe
1ca30 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70  m1->n,pMem1->z,p
1ca40 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a  Mem2->n,pMem2->z
1ca50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1ca60 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73  int rc;.    cons
1ca70 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b  t void *v1, *v2;
1ca80 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b  .    int n1, n2;
1ca90 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20  .    Mem c1;.   
1caa0 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c   Mem c2;.    sql
1cab0 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1cac0 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20  &c1, pMem1->db, 
1cad0 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  MEM_Null);.    s
1cae0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
1caf0 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62  t(&c2, pMem1->db
1cb00 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
1cb10 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1cb20 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20  hallowCopy(&c1, 
1cb30 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem1, MEM_Ephem
1cb40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1cb50 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
1cb60 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d  (&c2, pMem2, MEM
1cb70 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20  _Ephem);.    v1 
1cb80 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
1cb90 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
1cba0 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c1, pColl->e
1cbb0 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31  nc);.    n1 = v1
1cbc0 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a  ==0 ? 0 : c1.n;.
1cbd0 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33      v2 = sqlite3
1cbe0 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
1cbf0 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70  e3_value*)&c2, p
1cc00 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
1cc10 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a  n2 = v2==0 ? 0 :
1cc20 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20   c2.n;.    rc = 
1cc30 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
1cc40 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31  l->pUser, n1, v1
1cc50 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 69  , n2, v2);.    i
1cc60 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d  f( (v1==0 || v2=
1cc70 3d 30 29 20 26 26 20 70 72 63 45 72 72 20 29 20  =0) && prcErr ) 
1cc80 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45  *prcErr = SQLITE
1cc90 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1cca0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1ccb0 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20  elease(&c1);.   
1ccc0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1ccd0 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20  elease(&c2);.   
1cce0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1ccf0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  }../*.** The inp
1cd00 75 74 20 70 42 6c 6f 62 20 69 73 20 67 75 61 72  ut pBlob is guar
1cd10 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20 42  anteed to be a B
1cd20 6c 6f 62 20 74 68 61 74 20 69 73 20 6e 6f 74 20  lob that is not 
1cd30 6d 61 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d  marked.** with M
1cd40 45 4d 5f 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e  EM_Zero.  Return
1cd50 20 74 72 75 65 20 69 66 20 69 74 20 63 6f 75 6c   true if it coul
1cd60 64 20 62 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62  d be a zero-blob
1cd70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cd80 69 73 41 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20  isAllZero(const 
1cd90 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
1cda0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1cdb0 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
1cdc0 20 20 20 20 69 66 28 20 7a 5b 69 5d 20 29 20 72      if( z[i] ) r
1cdd0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
1cde0 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
1cdf0 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c  * Compare two bl
1ce00 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67  obs.  Return neg
1ce10 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
1ce20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
1ce30 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73  first.** is less
1ce40 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
1ce50 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1ce60 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73   the second, res
1ce70 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66  pectively..** If
1ce80 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70   one blob is a p
1ce90 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68  refix of the oth
1cea0 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f  er, then the sho
1ceb0 72 74 65 72 20 69 73 20 74 68 65 20 6c 65 73 73  rter is the less
1cec0 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  or..*/.static SQ
1ced0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
1cee0 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d  t sqlite3BlobCom
1cef0 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
1cf00 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  pB1, const Mem *
1cf10 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20  pB2){.  int c;. 
1cf20 20 69 6e 74 20 6e 31 20 3d 20 70 42 31 2d 3e 6e   int n1 = pB1->n
1cf30 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 70 42 32  ;.  int n2 = pB2
1cf40 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  ->n;..  /* It is
1cf50 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76   possible to hav
1cf60 65 20 61 20 42 6c 6f 62 20 76 61 6c 75 65 20 74  e a Blob value t
1cf70 68 61 74 20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e  hat has some non
1cf80 2d 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 0a 20 20  -zero content.  
1cf90 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a  ** followed by z
1cfa0 65 72 6f 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75  ero content.  Bu
1cfb0 74 20 74 68 61 74 20 6f 6e 6c 79 20 63 6f 6d 65  t that only come
1cfc0 73 20 75 70 20 66 6f 72 20 42 6c 6f 62 73 20 66  s up for Blobs f
1cfd0 6f 72 6d 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  ormed.  ** by th
1cfe0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1cff0 6f 70 63 6f 64 65 2c 20 61 6e 64 20 73 75 63 68  opcode, and such
1d000 20 42 6c 6f 62 73 20 6e 65 76 65 72 20 67 65 74   Blobs never get
1d010 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a   passed into.  *
1d020 2a 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  * sqlite3MemComp
1d030 61 72 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  are(). */.  asse
1d040 72 74 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 20  rt( (pB1->flags 
1d050 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c  & MEM_Zero)==0 |
1d060 7c 20 6e 31 3d 3d 30 20 29 3b 0a 20 20 61 73 73  | n1==0 );.  ass
1d070 65 72 74 28 20 28 70 42 32 2d 3e 66 6c 61 67 73  ert( (pB2->flags
1d080 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20   & MEM_Zero)==0 
1d090 7c 7c 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20 69  || n2==0 );..  i
1d0a0 66 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 7c 70  f( (pB1->flags|p
1d0b0 42 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d  B2->flags) & MEM
1d0c0 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 69 66 28  _Zero ){.    if(
1d0d0 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 70 42   pB1->flags & pB
1d0e0 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  2->flags & MEM_Z
1d0f0 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ero ){.      ret
1d100 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f  urn pB1->u.nZero
1d110 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b   - pB2->u.nZero;
1d120 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1d130 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B1->flags & MEM_
1d140 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66  Zero ){.      if
1d150 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 32  ( !isAllZero(pB2
1d160 2d 3e 7a 2c 20 70 42 32 2d 3e 6e 29 20 29 20 72  ->z, pB2->n) ) r
1d170 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1d180 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a  return pB1->u.nZ
1d190 65 72 6f 20 2d 20 6e 32 3b 0a 20 20 20 20 7d 65  ero - n2;.    }e
1d1a0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
1d1b0 69 73 41 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a  isAllZero(pB1->z
1d1c0 2c 20 70 42 31 2d 3e 6e 29 20 29 20 72 65 74 75  , pB1->n) ) retu
1d1d0 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
1d1e0 75 72 6e 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e  urn n1 - pB2->u.
1d1f0 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  nZero;.    }.  }
1d200 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42  .  c = memcmp(pB
1d210 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31  1->z, pB2->z, n1
1d220 3e 6e 32 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a  >n2 ? n2 : n1);.
1d230 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e    if( c ) return
1d240 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e 31 20   c;.  return n1 
1d250 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  - n2;.}../*.** D
1d260 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  o a comparison b
1d270 65 74 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20  etween a 64-bit 
1d280 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61  signed integer a
1d290 6e 64 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  nd a 64-bit floa
1d2a0 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75  ting-point.** nu
1d2b0 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65  mber.  Return ne
1d2c0 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
1d2d0 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
1d2e0 20 66 69 72 73 74 20 28 69 36 34 29 20 69 73 20   first (i64) is 
1d2f0 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71  less than,.** eq
1d300 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1d310 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1d320 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a  nd (double)..*/.
1d330 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1d340 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1d350 65 28 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20  e(i64 i, double 
1d360 72 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  r){.  if( sizeof
1d370 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45  (LONGDOUBLE_TYPE
1d380 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44  )>8 ){.    LONGD
1d390 4f 55 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28  OUBLE_TYPE x = (
1d3a0 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29  LONGDOUBLE_TYPE)
1d3b0 69 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29  i;.    if( x<r )
1d3c0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1d3d0 69 66 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e  if( x>r ) return
1d3e0 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   +1;.    return 
1d3f0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1d400 69 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c  i64 y;.    doubl
1d410 65 20 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d  e s;.    if( r<-
1d420 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
1d430 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b  808.0 ) return +
1d440 31 3b 0a 20 20 20 20 69 66 28 20 72 3e 39 32 32  1;.    if( r>922
1d450 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
1d460 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .0 ) return -1;.
1d470 20 20 20 20 79 20 3d 20 28 69 36 34 29 72 3b 0a      y = (i64)r;.
1d480 20 20 20 20 69 66 28 20 69 3c 79 20 29 20 72 65      if( i<y ) re
1d490 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1d4a0 20 69 3e 79 20 29 7b 0a 20 20 20 20 20 20 69 66   i>y ){.      if
1d4b0 28 20 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e  ( y==SMALLEST_IN
1d4c0 54 36 34 20 26 26 20 72 3e 30 2e 30 20 29 20 72  T64 && r>0.0 ) r
1d4d0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1d4e0 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 7d  return +1;.    }
1d4f0 0a 20 20 20 20 73 20 3d 20 28 64 6f 75 62 6c 65  .    s = (double
1d500 29 69 3b 0a 20 20 20 20 69 66 28 20 73 3c 72 20  )i;.    if( s<r 
1d510 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1d520 20 69 66 28 20 73 3e 72 20 29 20 72 65 74 75 72   if( s>r ) retur
1d530 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  n +1;.    return
1d540 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1d550 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c   Compare the val
1d560 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79  ues contained by
1d570 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20   the two memory 
1d580 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67  cells, returning
1d590 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  .** negative, ze
1d5a0 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ro or positive i
1d5b0 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20  f pMem1 is less 
1d5c0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
1d5d0 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68  or greater.** th
1d5e0 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e  an pMem2. Sortin
1d5f0 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27  g order is NULL'
1d600 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65  s first, followe
1d610 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e  d by numbers (in
1d620 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65  tegers.** and re
1d630 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65  als) sorted nume
1d640 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65  rically, followe
1d650 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65  d by text ordere
1d660 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69  d by the collati
1d670 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70  ng.** sequence p
1d680 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79  Coll and finally
1d690 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20   blob's ordered 
1d6a0 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a  by memcmp()..**.
1d6b0 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75  ** Two NULL valu
1d6c0 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
1d6d0 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 73 20  d equal by this 
1d6e0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
1d6f0 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1d700 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  re(const Mem *pM
1d710 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  em1, const Mem *
1d720 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c  pMem2, const Col
1d730 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
1d740 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e  int f1, f2;.  in
1d750 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  t combined_flags
1d760 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d  ;..  f1 = pMem1-
1d770 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70  >flags;.  f2 = p
1d780 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63  Mem2->flags;.  c
1d790 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20  ombined_flags = 
1d7a0 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28  f1|f2;.  assert(
1d7b0 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73   (combined_flags
1d7c0 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d   & MEM_RowSet)==
1d7d0 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f  0 );. .  /* If o
1d7e0 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  ne value is NULL
1d7f0 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  , it is less tha
1d800 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20  n the other. If 
1d810 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a  both values.  **
1d820 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72   are NULL, retur
1d830 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
1d840 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d  combined_flags&M
1d850 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
1d860 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75  eturn (f2&MEM_Nu
1d870 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75  ll) - (f1&MEM_Nu
1d880 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  ll);.  }..  /* A
1d890 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
1d8a0 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 69 73  he two values is
1d8b0 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20   a number.  */. 
1d8c0 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1d8d0 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  ags&(MEM_Int|MEM
1d8e0 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 69 66  _Real) ){.    if
1d8f0 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d  ( (f1 & f2 & MEM
1d900 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1d910 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
1d920 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   < pMem2->u.i ) 
1d930 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1d940 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20   if( pMem1->u.i 
1d950 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72  > pMem2->u.i ) r
1d960 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20  eturn +1;.      
1d970 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1d980 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32      if( (f1 & f2
1d990 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20   & MEM_Real)!=0 
1d9a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ){.      if( pMe
1d9b0 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d  m1->u.r < pMem2-
1d9c0 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2d 31  >u.r ) return -1
1d9d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
1d9e0 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e  1->u.r > pMem2->
1d9f0 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  u.r ) return +1;
1da00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1da10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1da20 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29  f1&MEM_Int)!=0 )
1da30 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26  {.      if( (f2&
1da40 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1da50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
1da60 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1da70 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69  mpare(pMem1->u.i
1da80 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20  , pMem2->u.r);. 
1da90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1daa0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1dab0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1dac0 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61   if( (f1&MEM_Rea
1dad0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)!=0 ){.      i
1dae0 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21  f( (f2&MEM_Int)!
1daf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
1db00 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74  turn -sqlite3Int
1db10 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65  FloatCompare(pMe
1db20 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e  m2->u.i, pMem1->
1db30 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
1db40 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
1db50 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n -1;.      }.  
1db60 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2b    }.    return +
1db70 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1db80 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20 73  one value is a s
1db90 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74  tring and the ot
1dba0 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74  her is a blob, t
1dbb0 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73  he string is les
1dbc0 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20  s..  ** If both 
1dbd0 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d  are strings, com
1dbe0 70 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 63  pare using the c
1dbf0 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
1dc00 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ns..  */.  if( c
1dc10 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45  ombined_flags&ME
1dc20 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28  M_Str ){.    if(
1dc30 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d   (f1 & MEM_Str)=
1dc40 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1dc50 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
1dc60 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74  if( (f2 & MEM_St
1dc70 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  r)==0 ){.      r
1dc80 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
1dc90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
1dca0 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e  m1->enc==pMem2->
1dcb0 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62  enc || pMem1->db
1dcc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1dcd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
1dce0 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1dcf0 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20  _UTF8 || .      
1dd00 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63        pMem1->enc
1dd10 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
1dd20 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d   || pMem1->enc==
1dd30 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
1dd40 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
1dd50 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1dd60 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64   must be defined
1dd70 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
1dd80 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74  even if.    ** t
1dd90 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 73 20  he user deletes 
1dda0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1ddb0 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 68 65  quence after the
1ddc0 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73   vdbe program is
1ddd0 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64  .    ** compiled
1dde0 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61   (this was not a
1ddf0 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 29 2e  lways the case).
1de00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1de10 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43  rt( !pColl || pC
1de20 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20  oll->xCmp );..  
1de30 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
1de40 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
1de50 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1de60 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70  (pMem1, pMem2, p
1de70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Coll, 0);.    }.
1de80 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c      /* If a NULL
1de90 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73   pointer was pas
1dea0 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61  sed as the colla
1deb0 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c  te function, fal
1dec0 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a  l through.    **
1ded0 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73   to the blob cas
1dee0 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70  e and use memcmp
1def0 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20  ().  */.  }. .  
1df00 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d  /* Both values m
1df10 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43  ust be blobs.  C
1df20 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d  ompare using mem
1df30 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74  cmp().  */.  ret
1df40 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43  urn sqlite3BlobC
1df50 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d  ompare(pMem1, pM
1df60 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  em2);.}.../*.** 
1df70 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
1df80 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
1df90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1dfa0 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74  serial-type that
1dfb0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  .** corresponds 
1dfc0 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  to an integer - 
1dfd0 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65  all values betwe
1dfe0 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75  en 1 and 9 inclu
1dff0 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20  sive .** except 
1e000 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f  7. The second po
1e010 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
1e020 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69   containing an i
1e030 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20  nteger value.** 
1e040 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72  serialized accor
1e050 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74  ding to serial_t
1e060 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ype. This functi
1e070 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a  on deserializes.
1e080 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74  ** and returns t
1e090 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  he value..*/.sta
1e0a0 74 69 63 20 69 36 34 20 76 64 62 65 52 65 63 6f  tic i64 vdbeReco
1e0b0 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20  rdDecodeInt(u32 
1e0c0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e  serial_type, con
1e0d0 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20  st u8 *aKey){.  
1e0e0 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28  u32 y;.  assert(
1e0f0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28   CORRUPT_DB || (
1e100 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26  serial_type>=1 &
1e110 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39  & serial_type<=9
1e120 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21   && serial_type!
1e130 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =7) );.  switch(
1e140 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
1e150 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20      case 0:.    
1e160 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65  case 1:.      te
1e170 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1e180 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
1e190 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  turn ONE_BYTE_IN
1e1a0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73  T(aKey);.    cas
1e1b0 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 2:.      testc
1e1c0 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1e1d0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1e1e0 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  n TWO_BYTE_INT(a
1e1f0 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33  Key);.    case 3
1e200 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1e210 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1e220 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
1e230 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b  HREE_BYTE_INT(aK
1e240 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a  ey);.    case 4:
1e250 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1e260 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1e270 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  );.      y = FOU
1e280 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1e290 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e2a0 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a  (i64)*(int*)&y;.
1e2b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
1e2c0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1e2d0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1e2e0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1e2f0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1e300 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34  aKey+2) + (((i64
1e310 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
1e320 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1e330 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b   }.    case 6: {
1e340 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 46  .      u64 x = F
1e350 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1e360 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1e370 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1e380 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  0 );.      x = (
1e390 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59  x<<32) | FOUR_BY
1e3a0 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b  TE_UINT(aKey+4);
1e3b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69  .      return (i
1e3c0 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20  64)*(i64*)&x;.  
1e3d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1e3e0 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  n (serial_type -
1e3f0 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   8);.}../*.** Th
1e400 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
1e410 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
1e420 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
1e430 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63   records.** spec
1e440 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c  ified by {nKey1,
1e450 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65   pKey1} and pPKe
1e460 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  y2.  It returns 
1e470 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
1e480 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
1e490 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20  integer if key1 
1e4a0 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1e4b0 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72  ual to or .** gr
1e4c0 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e  eater than key2.
1e4d0 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b    The {nKey1, pK
1e4e0 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65  ey1} key must be
1e4f0 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74   a blob.** creat
1e500 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
1e510 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f  eRecord opcode o
1e520 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65  f the VDBE.  The
1e530 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d   pPKey2.** key m
1e540 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20  ust be a parsed 
1e550 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61  key such as obta
1e560 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
1e570 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63  ite3VdbeParseRec
1e580 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ord..**.** If ar
1e590 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20  gument bSkip is 
1e5a0 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20  non-zero, it is 
1e5b0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1e5c0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1e5d0 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  ady.** determine
1e5e0 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
1e5f0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b   fields of the k
1e600 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a  eys are equal..*
1e610 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65  *.** Key1 and Ke
1e620 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  y2 do not have t
1e630 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61  o contain the sa
1e640 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  me number of fie
1e650 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20  lds. If all .** 
1e660 66 69 65 6c 64 73 20 74 68 61 74 20 61 70 70 65  fields that appe
1e670 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20  ar in both keys 
1e680 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  are equal, then 
1e690 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1e6a0 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  rc is .** return
1e6b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  ed..**.** If dat
1e6c0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1e6d0 20 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20   is discovered, 
1e6e0 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43  set pPKey2->errC
1e6f0 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  ode to .** SQLIT
1e700 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65  E_CORRUPT and re
1e710 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f  turn 0. If an OO
1e720 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  M error is encou
1e730 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65  ntered, .** pPKe
1e740 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73  y2->errCode is s
1e750 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
1e760 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73  EM and, if it is
1e770 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a   not NULL, the.*
1e780 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20  * malloc-failed 
1e790 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61  flag set on data
1e7a0 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b  base handle (pPK
1e7b0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
1e7c0 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  b)..*/.int sqlit
1e7d0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1e7e0 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69  areWithSkip(.  i
1e7f0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1e800 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f  void *pKey1,   /
1e810 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1e820 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1e830 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20  pPKey2,         
1e840 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1e850 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20    int bSkip     
1e860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e870 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b    /* If true, sk
1e880 69 70 20 74 68 65 20 66 69 72 73 74 20 66 69 65  ip the first fie
1e890 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  ld */.){.  u32 d
1e8a0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1e8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1e8c0 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1e8d0 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
1e8e0 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
1e8f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1e910 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c  dex of next fiel
1e920 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  d to compare */.
1e930 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
1e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e950 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63    /* Size of rec
1e960 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62 79  ord header in by
1e970 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  tes */.  u32 idx
1e980 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1e990 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1e9a0 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 70 65  et of first type
1e9b0 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
1e9c0 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9e0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
1e9f0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d  */.  Mem *pRhs =
1ea00 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20   pPKey2->aMem;  
1ea10 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65       /* Next fie
1ea20 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20  ld of pPKey2 to 
1ea30 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79  compare */.  Key
1ea40 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
1ea50 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1ea60 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  o;.  const unsig
1ea70 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
1ea80 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1ea90 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
1eaa0 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f    Mem mem1;..  /
1eab0 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72  * If bSkip is tr
1eac0 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ue, then the cal
1ead0 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
1eae0 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
1eaf0 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
1eb00 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
1eb10 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  he keys are equa
1eb20 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f  l. Fix the vario
1eb30 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  us stack variabl
1eb40 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  es so.  ** that 
1eb50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67  this routine beg
1eb60 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74  ins comparing at
1eb70 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c   the second fiel
1eb80 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69  d. */.  if( bSki
1eb90 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b  p ){.    u32 s1;
1eba0 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20  .    idx1 = 1 + 
1ebb0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1ebc0 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20  y1[1], s1);.    
1ebd0 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30  szHdr1 = aKey1[0
1ebe0 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64  ];.    d1 = szHd
1ebf0 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65  r1 + sqlite3Vdbe
1ec00 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31  SerialTypeLen(s1
1ec10 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20  );.    i = 1;.  
1ec20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73    pRhs++;.  }els
1ec30 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65  e{.    idx1 = ge
1ec40 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
1ec50 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31   szHdr1);.    d1
1ec60 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69   = szHdr1;.    i
1ec70 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29  f( d1>(unsigned)
1ec80 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20  nKey1 ){ .      
1ec90 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1eca0 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
1ecb0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1ecc0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
1ecd0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1ece0 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20   }.    i = 0;.  
1ecf0 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d  }..  VVA_ONLY( m
1ed00 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em1.szMalloc = 0
1ed10 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ; ) /* Only need
1ed20 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73  ed by assert() s
1ed30 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61  tatements */.  a
1ed40 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1ed50 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1ed60 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1ed70 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79  ->nXField>=pPKey
1ed80 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20  2->nField .     
1ed90 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
1eda0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  );.  assert( pPK
1edb0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ey2->pKeyInfo->a
1edc0 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
1edd0 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
1ede0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ->pKeyInfo->nFie
1edf0 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
1ee00 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c  ( idx1<=szHdr1 |
1ee10 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1ee20 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65    do{.    u32 se
1ee30 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
1ee40 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74  /* RHS is an int
1ee50 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  eger */.    if( 
1ee60 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1ee70 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  M_Int ){.      s
1ee80 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
1ee90 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
1eea0 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1eeb0 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1eec0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1eed0 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20  pe>=10 ){.      
1eee0 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1eef0 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1ef00 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  l_type==0 ){.   
1ef10 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1ef20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1ef30 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
1ef40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ef50 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1ef60 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1ef70 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  type, &mem1);.  
1ef80 20 20 20 20 20 20 72 63 20 3d 20 2d 73 71 6c 69        rc = -sqli
1ef90 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1efa0 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65  re(pRhs->u.i, me
1efb0 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  m1.u.r);.      }
1efc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
1efd0 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f  4 lhs = vdbeReco
1efe0 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69  rdDecodeInt(seri
1eff0 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b  al_type, &aKey1[
1f000 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36  d1]);.        i6
1f010 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e  4 rhs = pRhs->u.
1f020 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  i;.        if( l
1f030 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs<rhs ){.      
1f040 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1f050 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c       }else if( l
1f060 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs>rhs ){.      
1f070 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1f080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1f090 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1f0a0 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20   is real */.    
1f0b0 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
1f0c0 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
1f0d0 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
1f0e0 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1f0f0 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65  1];.      if( se
1f100 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b  rial_type>=10 ){
1f110 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69  .        /* Seri
1f120 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72 20 67  al types 12 or g
1f130 72 65 61 74 65 72 20 61 72 65 20 73 74 72 69 6e  reater are strin
1f140 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72  gs and blobs (gr
1f150 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20  eater than.     
1f160 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20     ** numbers). 
1f170 54 79 70 65 73 20 31 30 20 61 6e 64 20 31 31 20  Types 10 and 11 
1f180 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 22 72  are currently "r
1f190 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
1f1a0 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  re .        ** u
1f1b0 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  se", so it doesn
1f1c0 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72  't really matter
1f1d0 20 77 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   what the result
1f1e0 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20  s of comparing. 
1f1f0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 20 74         ** them t
1f200 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c 75 65  o numberic value
1f210 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20  s are.  */.     
1f220 20 20 20 72 63 20 3d 20 2b 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 30 20 29 7b 0a 20 20  al_type==0 ){.  
1f250 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1f260 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
1f280 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1f290 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1f2a0 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20  , &mem1);.      
1f2b0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1f2c0 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1f2d0 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70    if( mem1.u.r<p
1f2e0 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20  Rhs->u.r ){.    
1f2f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1f300 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1f310 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52   if( mem1.u.r>pR
1f320 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20  hs->u.r ){.     
1f330 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1f340 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f350 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f360 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f370 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1f380 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d  (mem1.u.i, pRhs-
1f390 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  >u.r);.        }
1f3a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f3b0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20      /* RHS is a 
1f3c0 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c  string */.    el
1f3d0 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1f3e0 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
1f3f0 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
1f400 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
1f410 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1f420 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
1f430 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
1f440 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1f450 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
1f460 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1f470 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
1f480 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1f490 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1f4a0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1f4b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
1f4c0 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  1.n = (serial_ty
1f4d0 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20  pe - 12) / 2;.  
1f4e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f4f0 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e  (d1+mem1.n)==(un
1f500 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1f510 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f520 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d  ( (d1+mem1.n+1)=
1f530 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1f540 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1f550 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75  (d1+mem1.n) > (u
1f560 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1f570 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
1f580 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1f590 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1f5a0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1f5b0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1f5c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1f5d0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1f5e0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79    }else if( pKey
1f5f0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  Info->aColl[i] )
1f600 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  {.          mem1
1f610 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
1f620 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  >enc;.          
1f630 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
1f640 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  fo->db;.        
1f650 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d    mem1.flags = M
1f660 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20  EM_Str;.        
1f670 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72    mem1.z = (char
1f680 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20  *)&aKey1[d1];.  
1f690 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
1f6a0 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1f6b0 67 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g(.             
1f6c0 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b   &mem1, pRhs, pK
1f6d0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1f6e0 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  , &pPKey2->errCo
1f6f0 64 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  de.          );.
1f700 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f710 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
1f720 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20  p = MIN(mem1.n, 
1f730 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
1f740 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
1f750 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
1f760 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
1f770 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
1f780 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20  ) rc = mem1.n - 
1f790 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20  pRhs->n; .      
1f7a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f7b0 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1f7c0 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65   a blob */.    e
1f7d0 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
1f7e0 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
1f7f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1f800 28 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d  (pRhs->flags & M
1f810 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 70  EM_Zero)==0 || p
1f820 52 68 73 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20  Rhs->n==0 );.   
1f830 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26     getVarint32(&
1f840 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72  aKey1[idx1], ser
1f850 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20  ial_type);.     
1f860 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
1f870 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
1f880 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1f890 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61  ype<12 || (seria
1f8a0 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
1f8b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1f8c0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1f8d0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72          int nStr
1f8e0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20   = (serial_type 
1f8f0 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20  - 12) / 2;.     
1f900 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1f910 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65  +nStr)==(unsigne
1f920 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1f930 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1f940 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67  +nStr+1)==(unsig
1f950 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1f960 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74       if( (d1+nSt
1f970 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e  r) > (unsigned)n
1f980 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20  Key1 ){.        
1f990 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1f9a0 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1f9b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1f9c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9e0 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
1f9f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1fa00 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1fa10 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
1fa20 20 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c         if( !isAl
1fa30 6c 5a 65 72 6f 28 28 63 6f 6e 73 74 20 63 68 61  lZero((const cha
1fa40 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 2c 6e 53  r*)&aKey1[d1],nS
1fa50 74 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tr) ){.         
1fa60 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
1fa70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1fa80 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 53 74          rc = nSt
1fa90 72 20 2d 20 70 52 68 73 2d 3e 75 2e 6e 5a 65 72  r - pRhs->u.nZer
1faa0 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  o;.          }. 
1fab0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1fac0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70          int nCmp
1fad0 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68   = MIN(nStr, pRh
1fae0 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  s->n);.         
1faf0 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b   rc = memcmp(&aK
1fb00 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a  ey1[d1], pRhs->z
1fb10 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20  , nCmp);.       
1fb20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
1fb30 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d  c = nStr - pRhs-
1fb40 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  >n;.        }.  
1fb50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1fb60 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20   /* RHS is null 
1fb70 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  */.    else{.   
1fb80 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
1fb90 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
1fba0 20 20 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c      rc = (serial
1fbb0 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d  _type!=0);.    }
1fbc0 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ..    if( rc!=0 
1fbd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65  ){.      if( pKe
1fbe0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1fbf0 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
1fc00 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20  rc = -rc;.      
1fc10 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
1fc20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1fc30 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1fc40 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29  ey1, pPKey2, rc)
1fc50 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1fc60 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1fc70 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
1fc80 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20  mment below */. 
1fc90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1fca0 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a      }..    i++;.
1fcb0 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20      pRhs++;.    
1fcc0 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
1fcd0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
1fce0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1fcf0 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33   idx1 += sqlite3
1fd00 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c  VarintLen(serial
1fd10 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  _type);.  }while
1fd20 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64  ( idx1<(unsigned
1fd30 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  )szHdr1 && i<pPK
1fd40 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64  ey2->nField && d
1fd50 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  1<=(unsigned)nKe
1fd60 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  y1 );..  /* No m
1fd70 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1fd80 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
1fd90 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
1fda0 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
1fdb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1fdc0 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
1fdd0 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
1fde0 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
1fdf0 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
1fe00 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
1fe10 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1fe20 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20  elease(&mem1).  
1fe30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
1fe40 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1fe50 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
1fe60 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
1fe70 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
1fe80 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
1fe90 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
1fea0 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
1feb0 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
1fec0 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75  were equal. Retu
1fed0 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72  rn the default_r
1fee0 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a  c.  ** value.  *
1fef0 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  /.  assert( CORR
1ff00 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  UPT_DB .       |
1ff10 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  | vdbeRecordComp
1ff20 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1ff30 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70  pKey1, pPKey2, p
1ff40 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1ff50 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b  c) .       || pK
1ff60 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
1ff70 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20  ocFailed.  );.  
1ff80 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
1ff90 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b   1;.  return pPK
1ffa0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
1ffb0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
1ffc0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1ffd0 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1ffe0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1fff0 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a     /* Left key *
20000 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
20010 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
20020 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
20030 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
20040 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
20050 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
20060 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
20070 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  PKey2, 0);.}.../
20080 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
20090 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  on is an optimiz
200a0 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
200b0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
200c0 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61  ompare() .** tha
200d0 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20  t (a) the first 
200e0 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
200f0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61  is an integer, a
20100 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73  nd (b) the .** s
20110 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
20120 72 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  rint at the star
20130 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79  t of (pKey1/nKey
20140 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  1) fits in a sin
20150 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65  gle.** byte (i.e
20160 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  . is less than 1
20170 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  28)..**.** To av
20180 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f  oid concerns abo
20190 75 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65  ut buffer overre
201a0 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ads, this routin
201b0 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a  e is only used.*
201c0 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65  * on schemas whe
201d0 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76  re the maximum v
201e0 61 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65  alid header size
201f0 20 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20   is 63 bytes or 
20200 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  less..*/.static 
20210 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
20220 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20  mpareInt(.  int 
20230 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
20240 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
20250 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
20260 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
20270 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
20280 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f  t key */.){.  co
20290 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26  nst u8 *aKey = &
202a0 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  ((const u8*)pKey
202b0 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70  1)[*(const u8*)p
202c0 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20  Key1 & 0x3F];.  
202d0 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20  int serial_type 
202e0 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b  = ((const u8*)pK
202f0 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72  ey1)[1];.  int r
20300 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75  es;.  u32 y;.  u
20310 36 34 20 78 3b 0a 20 20 69 36 34 20 76 3b 0a 20  64 x;.  i64 v;. 
20320 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62   i64 lhs;..  vdb
20330 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
20340 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b  tWithinLimits(nK
20350 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
20360 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  y2->pKeyInfo);. 
20370 20 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29   assert( (*(u8*)
20380 70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20  pKey1)<=0x3F || 
20390 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
203a0 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
203b0 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
203c0 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
203d0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
203e0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45  .      lhs = ONE
203f0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
20400 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20410 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
20420 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
20430 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
20440 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
20450 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
20460 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28   = TWO_BYTE_INT(
20470 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
20480 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
20490 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
204a0 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
204b0 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
204c0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
204d0 20 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42     lhs = THREE_B
204e0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
204f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
20500 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
20510 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20520 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
20530 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
20540 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46  r */.      y = F
20550 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
20560 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d  ey);.      lhs =
20570 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b   (i64)*(int*)&y;
20580 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20590 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
205a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
205b0 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d   case 5: { /* 6-
205c0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
205d0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
205e0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
205f0 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69  T(aKey+2) + (((i
20600 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
20610 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
20620 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
20630 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
20640 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20650 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79  ase 6: { /* 8-by
20660 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
20670 72 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46  r */.      x = F
20680 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
20690 65 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  ey);.      x = (
206a0 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59  x<<32) | FOUR_BY
206b0 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b  TE_UINT(aKey+4);
206c0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69  .      lhs = *(i
206d0 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65  64*)&x;.      te
206e0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
206f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20700 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
20710 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a  .      lhs = 0;.
20720 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20730 20 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c   case 9:.      l
20740 68 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  hs = 1;.      br
20750 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  eak;..    /* Thi
20760 73 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20  s case could be 
20770 72 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20  removed without 
20780 63 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73  changing the res
20790 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a  ults of running.
207a0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
207b0 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63  . Including it c
207c0 61 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e  auses gcc to gen
207d0 65 72 61 74 65 20 61 20 66 61 73 74 65 72 20 73  erate a faster s
207e0 77 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74  witch .    ** st
207f0 61 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74  atement (since t
20800 68 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74  he range of swit
20810 63 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73  ch targets now s
20820 74 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e  tarts at zero an
20830 64 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74  d.    ** is cont
20840 69 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73  iguous) but does
20850 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64   not cause any d
20860 75 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f  uplicate code to
20870 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20   be generated.  
20880 20 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20    ** (as gcc is 
20890 63 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f  clever enough to
208a0 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f   combine the two
208b0 20 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74   like cases). Ot
208c0 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  her .    ** comp
208d0 69 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 73  ilers might be s
208e0 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20  imilar.  */ .   
208f0 20 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a   case 0: case 7:
20900 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
20910 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20920 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
20930 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20  ey1, pPKey2);.. 
20940 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
20950 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
20960 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
20970 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
20980 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20  pPKey2);.  }..  
20990 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  v = pPKey2->aMem
209a0 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 66 28 20 76  [0].u.i;.  if( v
209b0 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  >lhs ){.    res 
209c0 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
209d0 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20  }else if( v<lhs 
209e0 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
209f0 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65  ey2->r2;.  }else
20a00 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
20a10 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  eld>1 ){.    /* 
20a20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
20a30 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
20a40 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70   are equal. Comp
20a50 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67  are the trailing
20a60 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e   .    ** fields.
20a70 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73    */.    res = s
20a80 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
20a90 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
20aa0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
20ab0 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  Key2, 1);.  }els
20ac0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  e{.    /* The fi
20ad0 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
20ae0 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65  e two keys are e
20af0 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61  qual and there a
20b00 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20  re no trailing. 
20b10 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65     ** fields. Re
20b20 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  turn pPKey2->def
20b30 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20  ault_rc in this 
20b40 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73  case. */.    res
20b50 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
20b60 6c 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79  lt_rc;.    pPKey
20b70 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20  2->eqSeen = 1;. 
20b80 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64   }..  assert( vd
20b90 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
20ba0 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
20bb0 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20  1, pPKey2, res) 
20bc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
20bd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
20be0 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70  unction is an op
20bf0 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  timized version 
20c00 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  of sqlite3VdbeRe
20c10 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a  cordCompare() .*
20c20 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66  * that (a) the f
20c30 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50  irst field of pP
20c40 4b 65 79 32 20 69 73 20 61 20 73 74 72 69 6e 67  Key2 is a string
20c50 2c 20 74 68 61 74 20 28 62 29 20 74 68 65 20 66  , that (b) the f
20c60 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73  irst field.** us
20c70 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
20c80 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59   sequence BINARY
20c90 20 61 6e 64 20 28 63 29 20 74 68 61 74 20 74 68   and (c) that th
20ca0 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  e size-of-header
20cb0 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74   varint .** at t
20cc0 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65  he start of (pKe
20cd0 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69  y1/nKey1) fits i
20ce0 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e  n a single byte.
20cf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
20d00 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20d10 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b  String(.  int nK
20d20 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
20d30 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
20d40 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
20d50 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
20d60 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
20d70 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  key */.){.  cons
20d80 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63  t u8 *aKey1 = (c
20d90 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a  onst u8*)pKey1;.
20da0 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70    int serial_typ
20db0 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  e;.  int res;.. 
20dc0 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
20dd0 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26  >aMem[0].flags &
20de0 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64   MEM_Str );.  vd
20df0 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
20e00 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e  ntWithinLimits(n
20e10 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
20e20 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a  ey2->pKeyInfo);.
20e30 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
20e40 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f  Key1[1], serial_
20e50 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72  type);.  if( ser
20e60 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20  ial_type<12 ){. 
20e70 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
20e80 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r1;      /* (pK
20e90 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
20ea0 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c  number or a null
20eb0 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
20ec0 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20  !(serial_type & 
20ed0 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65  0x01) ){ .    re
20ee0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20  s = pPKey2->r2; 
20ef0 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e       /* (pKey1/n
20f00 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20  Key1) is a blob 
20f10 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
20f20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e  int nCmp;.    in
20f30 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20  t nStr;.    int 
20f40 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d  szHdr = aKey1[0]
20f50 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73  ;..    nStr = (s
20f60 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f  erial_type-12) /
20f70 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48   2;.    if( (szH
20f80 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65  dr + nStr) > nKe
20f90 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65  y1 ){.      pPKe
20fa0 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
20fb0 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
20fc0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
20fd0 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72  urn 0;    /* Cor
20fe0 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d  ruption */.    }
20ff0 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28  .    nCmp = MIN(
21000 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
21010 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20  .n, nStr );.    
21020 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b  res = memcmp(&aK
21030 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65  ey1[szHdr], pPKe
21040 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e  y2->aMem[0].z, n
21050 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  Cmp);..    if( r
21060 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  es==0 ){.      r
21070 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65  es = nStr - pPKe
21080 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20  y2->aMem[0].n;. 
21090 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
210a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
210b0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
210c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  ){.          res
210d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
210e0 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
210f0 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  kip(nKey1, pKey1
21100 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20  , pPKey2, 1);.  
21110 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21120 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
21130 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
21140 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
21150 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20  2->eqSeen = 1;. 
21160 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21170 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
21180 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
21190 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
211a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
211b0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
211c0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
211d0 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
211e0 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
211f0 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65  Key2->r2;.    }e
21200 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  lse{.      res =
21210 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
21220 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
21230 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
21240 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
21250 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
21260 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f  es).       || CO
21270 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20  RRUPT_DB.       
21280 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  || pPKey2->pKeyI
21290 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
212a0 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74  ailed.  );.  ret
212b0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
212c0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
212d0 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
212e0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
212f0 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66  e() compatible f
21300 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61  unction.** suita
21310 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  ble for comparin
21320 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63  g serialized rec
21330 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61  ords to the unpa
21340 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73  cked record pass
21350 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c  ed.** as the onl
21360 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52  y argument..*/.R
21370 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c  ecordCompare sql
21380 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
21390 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  are(UnpackedReco
213a0 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72  rd *p){.  /* var
213b0 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
213c0 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74  Int() and varint
213d0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
213e0 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d  ing() both assum
213f0 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  e.  ** that the 
21400 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
21410 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72  arint that occur
21420 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
21430 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20  f each record.  
21440 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  ** fits in a sin
21450 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69  gle byte (i.e. i
21460 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20  s 127 or less). 
21470 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
21480 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c  areInt().  ** al
21490 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  so assumes that 
214a0 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76  it is safe to ov
214b0 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20  erread a buffer 
214c0 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20  by at least the 
214d0 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f  .  ** maximum po
214e0 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61  ssible legal hea
214f0 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20  der size plus 8 
21500 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74  bytes. Because t
21510 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61  here is.  ** gua
21520 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74  ranteed to be at
21530 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e   least 74 (but n
21540 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66  ot 136) bytes of
21550 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69   padding followi
21560 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66  ng each.  ** buf
21570 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61  fer passed to va
21580 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
21590 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65  eInt() this make
215a0 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20  s it convenient 
215b0 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68  to.  ** limit th
215c0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
215d0 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73  ader to 64 bytes
215e0 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20   in cases where 
215f0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a  the first field.
21600 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67    ** is an integ
21610 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  er..  **.  ** Th
21620 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
21630 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69   enforce this li
21640 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64  mit is to consid
21650 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20  er only records 
21660 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65  with.  ** 13 fie
21670 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20  lds or less. If 
21680 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
21690 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74  is an integer, t
216a0 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
216b0 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a  .  ** header siz
216c0 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b  e is (12*5 + 1 +
216d0 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20   1) bytes.  */. 
216e0 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66   if( (p->pKeyInf
216f0 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70  o->nField + p->p
21700 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
21710 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74  )<=13 ){.    int
21720 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d   flags = p->aMem
21730 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69  [0].flags;.    i
21740 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  f( p->pKeyInfo->
21750 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b  aSortOrder[0] ){
21760 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31  .      p->r1 = 1
21770 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
21780 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
21790 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b       p->r1 = -1;
217a0 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31  .      p->r2 = 1
217b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
217c0 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  (flags & MEM_Int
217d0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
217e0 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
217f0 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  areInt;.    }.  
21800 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
21810 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a  s & MEM_Real );.
21820 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
21830 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
21840 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
21850 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
21860 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61   );.    if( (fla
21870 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d  gs & (MEM_Real|M
21880 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62  EM_Null|MEM_Blob
21890 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79  ))==0 && p->pKey
218a0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d  Info->aColl[0]==
218b0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
218c0 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  t( flags & MEM_S
218d0 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tr );.      retu
218e0 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
218f0 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20  pareString;.    
21900 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
21910 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
21920 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a  dCompare;.}../*.
21930 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  ** pCur points a
21940 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
21950 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
21960 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
21970 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64   opcode..** Read
21980 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20   the rowid (the 
21990 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68  last field in th
219a0 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74  e record) and st
219b0 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64  ore it in *rowid
219c0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
219d0 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
219e0 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e  ing works, or an
219f0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
21a00 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75  rwise..**.** pCu
21a10 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74  r might be point
21a20 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61  ing to text obta
21a30 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72  ined from a corr
21a40 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
21a50 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e  e..** So the con
21a60 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74  tent cannot be t
21a70 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72  rusted.  Do appr
21a80 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f  opriate checks o
21a90 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a  n the content..*
21aa0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
21ab0 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65  eIdxRowid(sqlite
21ac0 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20  3 *db, BtCursor 
21ad0 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
21ae0 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
21af0 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
21b00 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
21b10 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
21b20 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
21b30 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
21b40 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
21b50 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
21b60 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
21b70 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
21b80 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
21b90 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20  Mem m, v;..  /* 
21ba0 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  Get the size of 
21bb0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e  the index entry.
21bc0 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65    Only indices e
21bd0 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20  ntries of less. 
21be0 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72   ** than 2GiB ar
21bf0 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74  e support - anyt
21c00 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20  hing large must 
21c10 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  be database corr
21c20 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79  uption..  ** Any
21c30 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
21c40 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74  etected in sqlit
21c50 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
21c60 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73  Ptr(), though, s
21c70 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65  o.  ** this code
21c80 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75   can safely assu
21c90 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79  me that nCellKey
21ca0 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20   is 32-bits  .  
21cb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
21cc0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
21cd0 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
21ce0 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    nCellKey = sql
21cf0 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
21d00 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 61 73  Size(pCur);.  as
21d10 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20  sert( (nCellKey 
21d20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32  & SQLITE_MAX_U32
21d30 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79  )==(u64)nCellKey
21d40 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69   );..  /* Read i
21d50 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63  n the complete c
21d60 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e  ontent of the in
21d70 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73  dex entry */.  s
21d80 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
21d90 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20  t(&m, db, 0);.  
21da0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
21db0 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75  MemFromBtree(pCu
21dc0 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c  r, 0, (u32)nCell
21dd0 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  Key, &m);.  if( 
21de0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
21df0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
21e00 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d  he index entry m
21e10 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  ust begin with a
21e20 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a   header size */.
21e30 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
21e40 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
21e50 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Hdr);.  testcase
21e60 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20  ( szHdr==3 );.  
21e70 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
21e80 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e  =m.n );.  if( un
21e90 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c  likely(szHdr<3 |
21ea0 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e  | (int)szHdr>m.n
21eb0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
21ec0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
21ed0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  on;.  }..  /* Th
21ee0 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20  e last field of 
21ef0 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
21f00 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   be an integer -
21f10 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a   the ROWID..  **
21f20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
21f30 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c   last entry real
21f40 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ly is an integer
21f50 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
21f60 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
21f70 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70  .z[szHdr-1], typ
21f80 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
21f90 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
21fa0 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
21fb0 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b   typeRowid==2 );
21fc0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
21fd0 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74  eRowid==3 );.  t
21fe0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
21ff0 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63  id==4 );.  testc
22000 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
22010 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  5 );.  testcase(
22020 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b   typeRowid==6 );
22030 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
22040 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74  eRowid==8 );.  t
22050 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
22060 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75  id==9 );.  if( u
22070 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69  nlikely(typeRowi
22080 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d<1 || typeRowid
22090 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d  >9 || typeRowid=
220a0 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =7) ){.    goto 
220b0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
220c0 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  tion;.  }.  lenR
220d0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d  owid = sqlite3Sm
220e0 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70  allTypeSizes[typ
220f0 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63  eRowid];.  testc
22100 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73  ase( (u32)m.n==s
22110 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b  zHdr+lenRowid );
22120 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
22130 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c  (u32)m.n<szHdr+l
22140 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  enRowid) ){.    
22150 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
22160 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
22170 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69    /* Fetch the i
22180 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65  nteger off the e
22190 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
221a0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
221b0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
221c0 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c  ((u8*)&m.z[m.n-l
221d0 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f  enRowid], typeRo
221e0 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77  wid, &v);.  *row
221f0 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71  id = v.u.i;.  sq
22200 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
22210 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
22220 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
22230 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
22240 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
22250 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
22260 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e  after m has been
22270 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  .  ** allocated.
22280 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a    Free the m obj
22290 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
222a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a  QLITE_CORRUPT. *
222b0 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  /.idx_rowid_corr
222c0 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61  uption:.  testca
222d0 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d  se( m.szMalloc!=
222e0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
222f0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
22300 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
22310 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
22320 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
22330 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
22340 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74  index entry that
22350 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f   cursor pC is po
22360 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73  inting to agains
22370 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72  t.** the key str
22380 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64  ing in pUnpacked
22390 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
223a0 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
223b0 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
223c0 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
223d0 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
223e0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
223f0 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
22400 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  than pUnpacked. 
22410 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
22420 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  K on success..**
22430 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73  .** pUnpacked is
22440 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20   either created 
22450 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20  without a rowid 
22460 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  or is truncated 
22470 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d  so that it.** om
22480 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74  its the rowid at
22490 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72   the end.  The r
224a0 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
224b0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
224c0 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ry.** is ignored
224d0 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65   as well.  Hence
224e0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  , this routine o
224f0 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65  nly compares the
22500 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66   prefixes .** of
22510 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20   the keys prior 
22520 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  to the final row
22530 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69  id, not the enti
22540 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  re key..*/.int s
22550 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
22560 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74  Compare(.  sqlit
22570 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
22580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
22590 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
225a0 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  on */.  VdbeCurs
225b0 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
225c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
225d0 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72  cursor to compar
225e0 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55  e against */.  U
225f0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
22600 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20  Unpacked,       
22610 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
22620 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20  ion of key */.  
22630 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20  int *res        
22640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22650 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
22660 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
22670 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
22680 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
22690 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
226a0 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d  sor *pCur;.  Mem
226b0 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   m;..  assert( p
226c0 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
226d0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
226e0 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43  pCur = pC->uc.pC
226f0 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  ursor;.  assert(
22700 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
22710 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
22720 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d   );.  nCellKey =
22730 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
22740 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a  loadSize(pCur);.
22750 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69    /* nCellKey wi
22760 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74  ll always be bet
22770 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66  ween 0 and 0xfff
22780 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66  fffff because of
22790 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68   the way.  ** th
227a0 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  at btreeParseCel
227b0 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74  lPtr() and sqlit
227c0 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
227d0 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
227e0 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  */.  if( nCellKe
227f0 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
22800 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
22810 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
22820 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
22830 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
22840 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
22850 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29  mInit(&m, db, 0)
22860 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
22870 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
22880 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e  (pCur, 0, (u32)n
22890 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20  CellKey, &m);.  
228a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
228b0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
228c0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
228d0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d  eRecordCompare(m
228e0 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b  .n, m.z, pUnpack
228f0 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ed);.  sqlite3Vd
22900 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
22910 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
22920 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
22930 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
22940 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
22950 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
22960 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
22970 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
22980 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
22990 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
229a0 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
229b0 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
229c0 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
229d0 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61  nt nChange){.  a
229e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
229f0 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
22a00 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43  tex) );.  db->nC
22a10 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b  hange = nChange;
22a20 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
22a30 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
22a40 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66  }../*.** Set a f
22a50 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20  lag in the vdbe 
22a60 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
22a70 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65  ange counter whe
22a80 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65  n it is finalise
22a90 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a  d.** or reset..*
22aa0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
22ab0 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56  beCountChanges(V
22ac0 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68  dbe *v){.  v->ch
22ad0 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d  angeCntOn = 1;.}
22ae0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65  ../*.** Mark eve
22af0 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ry prepared stat
22b00 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ement associated
22b10 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
22b20 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
22b30 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  s expired..**.**
22b40 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   An expired stat
22b50 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74  ement means that
22b60 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
22b70 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
22b80 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e  is.** recommend.
22b90 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70    Statements exp
22ba0 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20  ire when things 
22bb0 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65  happen that make
22bc0 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61   their.** progra
22bd0 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65  ms obsolete.  Re
22be0 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69  moving user-defi
22bf0 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ned functions or
22c00 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
22c10 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e  quences, or chan
22c20 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a  ging an authoriz
22c30 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61  ation function a
22c40 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a  re the types of.
22c50 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d  ** things that m
22c60 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ake prepared sta
22c70 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65  tements obsolete
22c80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22c90 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
22ca0 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65  tatements(sqlite
22cb0 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
22cc0 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d  p;.  for(p = db-
22cd0 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e  >pVdbe; p; p=p->
22ce0 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65  pNext){.    p->e
22cf0 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  xpired = 1;.  }.
22d00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22d10 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
22d20 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
22d30 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
22d40 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
22d50 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
22d60 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  urn v->db;.}../*
22d70 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
22d80 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
22d90 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
22da0 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
22db0 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a  e value bound.**
22dc0 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20   parameter iVar 
22dd0 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c  of VM v. Except,
22de0 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
22df0 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65   an SQL NULL, re
22e00 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65  turn .** 0 inste
22e10 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73  ad. Unless it is
22e20 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66   NULL, apply aff
22e30 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f  inity aff (one o
22e40 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46  f the SQLITE_AFF
22e50 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29  _*.** constants)
22e60 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65   to the value be
22e70 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
22e80 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  t..**.** The ret
22e90 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74  urned value must
22ea0 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
22eb0 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
22ec0 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29  lite3ValueFree()
22ed0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c  ..*/.sqlite3_val
22ee0 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  ue *sqlite3VdbeG
22ef0 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 62  etBoundValue(Vdb
22f00 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20  e *v, int iVar, 
22f10 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72  u8 aff){.  asser
22f20 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69  t( iVar>0 );.  i
22f30 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20  f( v ){.    Mem 
22f40 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72  *pMem = &v->aVar
22f50 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66  [iVar-1];.    if
22f60 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67  ( 0==(pMem->flag
22f70 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b  s & MEM_Null) ){
22f80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
22f90 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c  alue *pRet = sql
22fa0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e  ite3ValueNew(v->
22fb0 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  db);.      if( p
22fc0 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Ret ){.        s
22fd0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70  qlite3VdbeMemCop
22fe0 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70  y((Mem *)pRet, p
22ff0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
23000 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41  lite3ValueApplyA
23010 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66  ffinity(pRet, af
23020 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  f, SQLITE_UTF8);
23030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
23040 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20  eturn pRet;.    
23050 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
23060 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69  ;.}../*.** Confi
23070 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c  gure SQL variabl
23080 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62  e iVar so that b
23090 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c  inding a new val
230a0 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73  ue to it signals
230b0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  .** to sqlite3_r
230c0 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74  eoptimize() that
230d0 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68   re-preparing th
230e0 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20  e statement may 
230f0 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62  result.** in a b
23100 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e  etter query plan
23110 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23120 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
23130 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
23140 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  r){.  assert( iV
23150 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56  ar>0 );.  if( iV
23160 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e  ar>32 ){.    v->
23170 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66  expmask = 0xffff
23180 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ffff;.  }else{. 
23190 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
231a0 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61   ((u32)1 << (iVa
231b0 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  r-1));.  }.}..#i
231c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
231d0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
231e0 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72  *.** Transfer er
231f0 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
23200 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33   from an sqlite3
23210 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74  _vtab.zErrMsg (t
23220 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  ext stored.** in
23230 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
23240 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
23250 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62  lloc) into a Vdb
23260 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20  e.zErrMsg (text 
23270 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d  stored.** in mem
23280 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
23290 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
232a0 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  c)..*/.void sqli
232b0 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72  te3VtabImportErr
232c0 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c  msg(Vdbe *p, sql
232d0 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
232e0 29 7b 0a 20 20 69 66 28 20 70 56 74 61 62 2d 3e  ){.  if( pVtab->
232f0 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 73  zErrMsg ){.    s
23300 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
23310 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  db;.    sqlite3D
23320 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
23330 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
23340 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44  rrMsg = sqlite3D
23350 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74 61  bStrDup(db, pVta
23360 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b->zErrMsg);.   
23370 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
23380 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
23390 20 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73     pVtab->zErrMs
233a0 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  g = 0;.  }.}.#en
233b0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
233c0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
233d0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
233e0 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
233f0 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49  TE_HOOK../*.** I
23400 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
23410 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
23420 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e 79 20 61  L, release any a
23430 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63  llocations assoc
23440 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 74  iated .** with t
23450 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  he memory cells 
23460 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65 6d 5b 5d  in the p->aMem[]
23470 20 61 72 72 61 79 2e 20 41 6c 73 6f 20 66 72 65   array. Also fre
23480 65 20 74 68 65 20 55 6e 70 61 63 6b 65 64 52 65  e the UnpackedRe
23490 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72  cord.** structur
234a0 65 20 69 74 73 65 6c 66 2c 20 75 73 69 6e 67 20  e itself, using 
234b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
234c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
234d0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
234e0 66 72 65 65 20 55 6e 70 61 63 6b 65 64 52 65 63  free UnpackedRec
234f0 6f 72 64 20 73 74 72 75 63 74 75 72 65 73 20 61  ord structures a
23500 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
23510 68 65 20 76 64 62 65 55 6e 70 61 63 6b 52 65 63  he vdbeUnpackRec
23520 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ord() function f
23530 6f 75 6e 64 20 69 6e 20 76 64 62 65 61 70 69 2e  ound in vdbeapi.
23540 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  c..*/.static voi
23550 64 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b  d vdbeFreeUnpack
23560 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ed(sqlite3 *db, 
23570 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
23580 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
23590 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
235a0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 46 69 65  r(i=0; i<p->nFie
235b0 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; i++){.      
235c0 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e  Mem *pMem = &p->
235d0 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69  aMem[i];.      i
235e0 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63  f( pMem->zMalloc
235f0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   ) sqlite3VdbeMe
23600 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a  mRelease(pMem);.
23610 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
23620 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
23630 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
23640 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
23650 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a  EUPDATE_HOOK */.
23660 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
23670 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
23680 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  HOOK./*.** Invok
23690 65 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 65  e the pre-update
236a0 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20 69   hook. If this i
236b0 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  s an UPDATE or D
236c0 45 4c 45 54 45 20 70 72 65 2d 75 70 64 61 74 65  ELETE pre-update
236d0 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63   call,.** then c
236e0 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20  ursor passed as 
236f0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
23700 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74  ent should point
23710 20 74 6f 20 74 68 65 20 72 6f 77 20 61 62 6f 75   to the row abou
23720 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70 64 61 74  t.** to be updat
23730 65 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66  e or deleted. If
23740 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
23750 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70   calls sqlite3_p
23760 72 65 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a  reupdate_old(),.
23770 2a 2a 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ** the required 
23780 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65  value will be re
23790 61 64 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20  ad from the row 
237a0 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
237b0 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  s to..*/.void sq
237c0 6c 69 74 65 33 56 64 62 65 50 72 65 55 70 64 61  lite3VdbePreUpda
237d0 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a  teHook(.  Vdbe *
237e0 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v,              
237f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
23800 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f  e pre-update hoo
23810 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  k is invoked by 
23820 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
23830 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20  *pCsr,          
23840 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74       /* Cursor t
23850 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c  o grab old.* val
23860 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ues from */.  in
23870 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23890 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
238a0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
238b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
238c0 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20   *zDb,          
238d0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
238e0 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c  e name */.  Tabl
238f0 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
23900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
23910 6f 64 69 66 69 65 64 20 74 61 62 6c 65 20 2a 2f  odified table */
23920 0a 20 20 69 36 34 20 69 4b 65 79 31 2c 20 20 20  .  i64 iKey1,   
23930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23940 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b 65     /* Initial ke
23950 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  y value */.  int
23960 20 69 52 65 67 20 20 20 20 20 20 20 20 20 20 20   iReg           
23970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23980 52 65 67 69 73 74 65 72 20 66 6f 72 20 6e 65 77  Register for new
23990 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  .* record */.){.
239a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
239b0 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b 65  v->db;.  i64 iKe
239c0 79 32 3b 0a 20 20 50 72 65 55 70 64 61 74 65 20  y2;.  PreUpdate 
239d0 70 72 65 75 70 64 61 74 65 3b 0a 20 20 63 6f 6e  preupdate;.  con
239e0 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20  st char *zTbl = 
239f0 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73  pTab->zName;.  s
23a00 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 66  tatic const u8 f
23a10 61 6b 65 53 6f 72 74 4f 72 64 65 72 20 3d 20 30  akeSortOrder = 0
23a20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  ;..  assert( db-
23a30 3e 70 50 72 65 55 70 64 61 74 65 3d 3d 30 20 29  >pPreUpdate==0 )
23a40 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75  ;.  memset(&preu
23a50 70 64 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pdate, 0, sizeof
23a60 28 50 72 65 55 70 64 61 74 65 29 29 3b 0a 20 20  (PreUpdate));.  
23a70 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55  if( op==SQLITE_U
23a80 50 44 41 54 45 20 29 7b 0a 20 20 20 20 69 4b 65  PDATE ){.    iKe
23a90 79 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 65  y2 = v->aMem[iRe
23aa0 67 5d 2e 75 2e 69 3b 0a 20 20 7d 65 6c 73 65 7b  g].u.i;.  }else{
23ab0 0a 20 20 20 20 69 4b 65 79 32 20 3d 20 69 4b 65  .    iKey2 = iKe
23ac0 79 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  y1;.  }..  asser
23ad0 74 28 20 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d  t( pCsr->nField=
23ae0 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20  =pTab->nCol .   
23af0 20 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e 6e 46      || (pCsr->nF
23b00 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  ield==pTab->nCol
23b10 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c 49 54 45  +1 && op==SQLITE
23b20 5f 44 45 4c 45 54 45 20 26 26 20 69 52 65 67 3d  _DELETE && iReg=
23b30 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20 70 72 65  =-1).  );..  pre
23b40 75 70 64 61 74 65 2e 76 20 3d 20 76 3b 0a 20 20  update.v = v;.  
23b50 70 72 65 75 70 64 61 74 65 2e 70 43 73 72 20 3d  preupdate.pCsr =
23b60 20 70 43 73 72 3b 0a 20 20 70 72 65 75 70 64 61   pCsr;.  preupda
23b70 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70 72  te.op = op;.  pr
23b80 65 75 70 64 61 74 65 2e 69 4e 65 77 52 65 67 20  eupdate.iNewReg 
23b90 3d 20 69 52 65 67 3b 0a 20 20 70 72 65 75 70 64  = iReg;.  preupd
23ba0 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64 62 20 3d  ate.keyinfo.db =
23bb0 20 64 62 3b 0a 20 20 70 72 65 75 70 64 61 74 65   db;.  preupdate
23bc0 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20 3d 20 45  .keyinfo.enc = E
23bd0 4e 43 28 64 62 29 3b 0a 20 20 70 72 65 75 70 64  NC(db);.  preupd
23be0 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 46 69 65  ate.keyinfo.nFie
23bf0 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  ld = pTab->nCol;
23c00 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
23c10 69 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20  info.aSortOrder 
23c20 3d 20 28 75 38 2a 29 26 66 61 6b 65 53 6f 72 74  = (u8*)&fakeSort
23c30 4f 72 64 65 72 3b 0a 20 20 70 72 65 75 70 64 61  Order;.  preupda
23c40 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79 31  te.iKey1 = iKey1
23c50 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b  ;.  preupdate.iK
23c60 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70  ey2 = iKey2;.  p
23c70 72 65 75 70 64 61 74 65 2e 70 54 61 62 20 3d 20  reupdate.pTab = 
23c80 70 54 61 62 3b 0a 0a 20 20 64 62 2d 3e 70 50 72  pTab;..  db->pPr
23c90 65 55 70 64 61 74 65 20 3d 20 26 70 72 65 75 70  eUpdate = &preup
23ca0 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65  date;.  db->xPre
23cb0 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64  UpdateCallback(d
23cc0 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67  b->pPreUpdateArg
23cd0 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a  , db, op, zDb, z
23ce0 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79  Tbl, iKey1, iKey
23cf0 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70  2);.  db->pPreUp
23d00 64 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  date = 0;.  sqli
23d10 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72  te3DbFree(db, pr
23d20 65 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29  eupdate.aRecord)
23d30 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61  ;.  vdbeFreeUnpa
23d40 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61  cked(db, preupda
23d50 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  te.pUnpacked);. 
23d60 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65   vdbeFreeUnpacke
23d70 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  d(db, preupdate.
23d80 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20  pNewUnpacked);. 
23d90 20 69 66 28 20 70 72 65 75 70 64 61 74 65 2e 61   if( preupdate.a
23da0 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  New ){.    int i
23db0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
23dc0 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69  <pCsr->nField; i
23dd0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
23de0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
23df0 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  (&preupdate.aNew
23e00 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
23e10 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23e20 2c 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  , preupdate.aNew
23e30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
23e40 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
23e50 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20  _PREUPDATE_HOOK 
23e60 2a 2f 0a                                         */.