/ Hex Artifact Content
Login

Artifact 8378658e15a82b20fa49718f9204d1286b4fbc26:


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 53 65 74 20 74 68 65 20 50 34  /*.** Set the P4
70c0: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
70d0: 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 63 6f  ently added opco
70e0: 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49 6e 66  de to the KeyInf
70f0: 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 64  o for the.** ind
7100: 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69  ex given..*/.voi
7110: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
7120: 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20  P4KeyInfo(Parse 
7130: 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
7140: 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20 2a 76  pIdx){.  Vdbe *v
7150: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
7160: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
7170: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
7180: 64 78 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  dx!=0 );.  sqlit
7190: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
71a0: 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 73 71 6c  , -1, (char*)sql
71b0: 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
71c0: 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  ex(pParse, pIdx)
71d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
71e0: 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
71f0: 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  FO);.}..#ifdef S
7200: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
7210: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a  LAIN_COMMENTS./*
7220: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63  .** Change the c
7230: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  omment on the mo
7240: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65  st recently code
7250: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  d instruction.  
7260: 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e  Or.** insert a N
7270: 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65  o-op and add the
7280: 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74   comment to that
7290: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
72a0: 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73  .  This.** makes
72b0: 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72   the code easier
72c0: 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20   to read during 
72d0: 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65  debugging.  None
72e0: 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   of this happens
72f0: 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74  .** in a product
7300: 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74  ion build..*/.st
7310: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 56 43  atic void vdbeVC
7320: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
7330: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
7340: 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29  mat, va_list ap)
7350: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  {.  assert( p->n
7360: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
7370: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
7380: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
7390: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
73a0: 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64  mment==0 || p->d
73b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
73c0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
73d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
73e0: 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c  ->aOp );.    sql
73f0: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
7400: 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  , p->aOp[p->nOp-
7410: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  1].zComment);.  
7420: 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d    p->aOp[p->nOp-
7430: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71  1].zComment = sq
7440: 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d  lite3VMPrintf(p-
7450: 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  >db, zFormat, ap
7460: 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
7470: 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74  lite3VdbeComment
7480: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
7490: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
74a0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
74b0: 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  p;.  if( p ){.  
74c0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
74d0: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62  Format);.    vdb
74e0: 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f  eVComment(p, zFo
74f0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
7500: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
7510: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7520: 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62  eNoopComment(Vdb
7530: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
7540: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
7550: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
7560: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71   if( p ){.    sq
7570: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
7580: 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20  p, OP_Noop);.   
7590: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
75a0: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65  ormat);.    vdbe
75b0: 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72  VComment(p, zFor
75c0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
75d0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
75e0: 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55  #endif  /* NDEBU
75f0: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
7600: 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  ITE_VDBE_COVERAG
7610: 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  E./*.** Set the 
7620: 76 61 6c 75 65 20 69 66 20 74 68 65 20 69 53 72  value if the iSr
7630: 63 4c 69 6e 65 20 66 69 65 6c 64 20 66 6f 72 20  cLine field for 
7640: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 63  the previously c
7650: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  oded instruction
7660: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7670: 33 56 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d 62  3VdbeSetLineNumb
7680: 65 72 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  er(Vdbe *v, int 
7690: 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74 65  iLine){.  sqlite
76a0: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 29  3VdbeGetOp(v,-1)
76b0: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69  ->iSrcLine = iLi
76c0: 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ne;.}.#endif /* 
76d0: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
76e0: 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RAGE */../*.** R
76f0: 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65  eturn the opcode
7700: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64   for a given add
7710: 72 65 73 73 2e 20 20 49 66 20 74 68 65 20 61 64  ress.  If the ad
7720: 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65  dress is -1, the
7730: 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20  n.** return the 
7740: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
7750: 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a  serted opcode..*
7760: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
7770: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
7780: 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 70  r has occurred p
7790: 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rior to the call
77a0: 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72  ing of this.** r
77b0: 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70  outine, then a p
77c0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d  ointer to a dumm
77d0: 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65  y VdbeOp will be
77e0: 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74   returned.  That
77f0: 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65   opcode.** is re
7800: 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77  adable but not w
7810: 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20  ritable, though 
7820: 69 74 20 69 73 20 63 61 73 74 20 74 6f 20 61 20  it is cast to a 
7830: 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a  writable value..
7840: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66  ** The return of
7850: 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20   a dummy opcode 
7860: 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20  allows the call 
7870: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63  to continue func
7880: 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72  tioning.** after
7890: 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69   an OOM fault wi
78a0: 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
78b0: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
78c0: 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20  the return from 
78d0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
78e0: 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e   is a valid poin
78f0: 74 65 72 2e 20 20 42 75 74 20 62 65 63 61 75 73  ter.  But becaus
7900: 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f  e the dummy.opco
7910: 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d  de is 0,.** dumm
7920: 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  y will never be 
7930: 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69  written to.  Thi
7940: 73 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79  s is verified by
7950: 20 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e   code inspection
7960: 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69   and.** by runni
7970: 6e 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64  ng with Valgrind
7980: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
7990: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64  ite3VdbeGetOp(Vd
79a0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
79b0: 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69  {.  /* C89 speci
79c0: 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  fies that the co
79d0: 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77  nstant "dummy" w
79e0: 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ill be initializ
79f0: 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a  ed to all.  ** z
7a00: 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63  eros, which is c
7a10: 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65  orrect.  MSVC ge
7a20: 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e  nerates a warnin
7a30: 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e  g, nevertheless.
7a40: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64 62   */.  static Vdb
7a50: 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49  eOp dummy;  /* I
7a60: 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77  gnore the MSVC w
7a70: 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20  arning about no 
7a80: 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20  initializer */. 
7a90: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
7aa0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
7ab0: 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  IT );.  if( addr
7ac0: 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d  <0 ){.    addr =
7ad0: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
7ae0: 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72  .  assert( (addr
7af0: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
7b00: 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  Op) || p->db->ma
7b10: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
7b20: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
7b30: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
7b40: 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26  eturn (VdbeOp*)&
7b50: 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  dummy;.  }else{.
7b60: 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
7b70: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a  Op[addr];.  }.}.
7b80: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
7b90: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
7ba0: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a  IN_COMMENTS)./*.
7bb0: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  ** Return an int
7bc0: 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 6f  eger value for o
7bd0: 6e 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  ne of the parame
7be0: 74 65 72 73 20 74 6f 20 74 68 65 20 6f 70 63 6f  ters to the opco
7bf0: 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d  de pOp.** determ
7c00: 69 6e 65 64 20 62 79 20 63 68 61 72 61 63 74 65  ined by characte
7c10: 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  r c..*/.static i
7c20: 6e 74 20 74 72 61 6e 73 6c 61 74 65 50 28 63 68  nt translateP(ch
7c30: 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a  ar c, const Op *
7c40: 70 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27  pOp){.  if( c=='
7c50: 31 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  1' ) return pOp-
7c60: 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32  >p1;.  if( c=='2
7c70: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ' ) return pOp->
7c80: 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33 27  p2;.  if( c=='3'
7c90: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
7ca0: 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34 27 20  3;.  if( c=='4' 
7cb0: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34  ) return pOp->p4
7cc0: 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70  .i;.  return pOp
7cd0: 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ->p5;.}../*.** C
7ce0: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
7cf0: 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74  for the "comment
7d00: 22 20 66 69 65 6c 64 20 6f 66 20 61 20 56 44 42  " field of a VDB
7d10: 45 20 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e 67  E opcode listing
7d20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f  ..**.** The Syno
7d30: 70 73 69 73 3a 20 66 69 65 6c 64 20 69 6e 20 63  psis: field in c
7d40: 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 76  omments in the v
7d50: 64 62 65 2e 63 20 73 6f 75 72 63 65 20 66 69 6c  dbe.c source fil
7d60: 65 20 67 65 74 73 20 63 6f 6e 76 65 72 74 65 64  e gets converted
7d70: 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74 72 61 20  .** to an extra 
7d80: 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 61  string that is a
7d90: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 73  ppended to the s
7da0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
7db0: 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61  ().  In the.** a
7dc0: 62 73 65 6e 63 65 20 6f 66 20 6f 74 68 65 72 20  bsence of other 
7dd0: 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20 73  comments, this s
7de0: 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d 65 73 20  ynopsis becomes 
7df0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
7e00: 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f  he opcode..** So
7e10: 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f  me translation o
7e20: 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ccurs:.**.**    
7e30: 20 20 20 22 50 58 22 20 20 20 20 20 20 2d 3e 20     "PX"      -> 
7e40: 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20   "r[X]".**      
7e50: 20 22 50 58 40 50 59 22 20 20 20 2d 3e 20 20 22   "PX@PY"   ->  "
7e60: 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72  r[X..X+Y-1]"  or
7e70: 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20   "r[x]" if y is 
7e80: 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20 20  0 or 1.**       
7e90: 22 50 58 40 50 59 2b 31 22 20 2d 3e 20 20 22 72  "PX@PY+1" ->  "r
7ea0: 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20  [X..X+Y]"    or 
7eb0: 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30  "r[x]" if y is 0
7ec0: 0a 2a 2a 20 20 20 20 20 20 20 22 50 59 2e 2e 50  .**       "PY..P
7ed0: 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d  Y"  ->  "r[X..Y]
7ee0: 22 20 20 20 20 20 20 6f 72 20 22 72 5b 78 5d 22  "      or "r[x]"
7ef0: 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74   if y<=x.*/.stat
7f00: 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43 6f  ic int displayCo
7f10: 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f  mment(.  const O
7f20: 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54  p *pOp,     /* T
7f30: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 20  he opcode to be 
7f40: 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63  commented */.  c
7f50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
7f60: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20    /* Previously 
7f70: 6f 62 74 61 69 6e 65 64 20 76 61 6c 75 65 20 66  obtained value f
7f80: 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68 61 72 20  or P4 */.  char 
7f90: 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a  *zTemp,       /*
7fa0: 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 68 65   Write result he
7fb0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d  re */.  int nTem
7fc0: 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70  p          /* Sp
7fd0: 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  ace available in
7fe0: 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20   zTemp[] */.){. 
7ff0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
8000: 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Name;.  const ch
8010: 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20  ar *zSynopsis;. 
8020: 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20   int nOpName;.  
8030: 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 63 68  int ii, jj;.  ch
8040: 61 72 20 7a 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a  ar zAlt[50];.  z
8050: 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  OpName = sqlite3
8060: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
8070: 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61  opcode);.  nOpNa
8080: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
8090: 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20  en30(zOpName);. 
80a0: 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70   if( zOpName[nOp
80b0: 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69  Name+1] ){.    i
80c0: 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a  nt seenCom = 0;.
80d0: 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20      char c;.    
80e0: 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e  zSynopsis = zOpN
80f0: 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b  ame += nOpName +
8100: 20 31 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e   1;.    if( strn
8110: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2c 22 49  cmp(zSynopsis,"I
8120: 46 20 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  F ",3)==0 ){.   
8130: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20 26     if( pOp->p5 &
8140: 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32 20   SQLITE_STOREP2 
8150: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8160: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
8170: 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c 20  of(zAlt), zAlt, 
8180: 22 72 5b 50 32 5d 20 3d 20 28 25 73 29 22 2c 20  "r[P2] = (%s)", 
8190: 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20 20  zSynopsis+3);.  
81a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
81b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
81c0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74 29  ntf(sizeof(zAlt)
81d0: 2c 20 7a 41 6c 74 2c 20 22 69 66 20 25 73 20 67  , zAlt, "if %s g
81e0: 6f 74 6f 20 50 32 22 2c 20 7a 53 79 6e 6f 70 73  oto P2", zSynops
81f0: 69 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 0a 20  is+3);.      }. 
8200: 20 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d       zSynopsis =
8210: 20 7a 41 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 20   zAlt;.    }.   
8220: 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a   for(ii=jj=0; jj
8230: 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d  <nTemp-1 && (c =
8240: 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21   zSynopsis[ii])!
8250: 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  =0; ii++){.     
8260: 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20   if( c=='P' ){. 
8270: 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f         c = zSyno
8280: 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20  psis[++ii];.    
8290: 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29      if( c=='4' )
82a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
82b0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
82c0: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
82d0: 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20   "%s", zP4);.   
82e0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
82f0: 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20  =='X' ){.       
8300: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8310: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
8320: 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f  emp+jj, "%s", pO
8330: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  p->zComment);.  
8340: 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20          seenCom 
8350: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
8360: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
8370: 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65  t v1 = translate
8380: 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  P(c, pOp);.     
8390: 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20       int v2;.   
83a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
83b0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
83c0: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22  , zTemp+jj, "%d"
83d0: 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , v1);.         
83e0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
83f0: 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50  nopsis+ii+1, "@P
8400: 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 2)==0 ){.    
8410: 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b          ii += 3;
8420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
8430: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
8440: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20  30(zTemp+jj);.  
8450: 20 20 20 20 20 20 20 20 20 20 76 32 20 3d 20 74            v2 = t
8460: 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70  ranslateP(zSynop
8470: 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20  sis[ii], pOp);. 
8480: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
8490: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
84a0: 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30  +ii+1,"+1",2)==0
84b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
84c0: 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20    ii += 2;.     
84d0: 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20           v2++;. 
84e0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
84f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 32 3e           if( v2>
8500: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
8510: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8520: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
8530: 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20  emp+jj, "..%d", 
8540: 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20  v1+v2-1);.      
8550: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8560: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
8570: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69  cmp(zSynopsis+ii
8580: 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d  +1, "..P3", 4)==
8590: 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20  0 && pOp->p3==0 
85a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
85b0: 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
85c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
85d0: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
85e0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
85f0: 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  p+jj);.      }el
8600: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  se{.        zTem
8610: 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  p[jj++] = c;.   
8620: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
8630: 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a  f( !seenCom && j
8640: 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70  j<nTemp-5 && pOp
8650: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
8660: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8670: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
8680: 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c  Temp+jj, "; %s",
8690: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
86a0: 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c  .      jj += sql
86b0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
86c0: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20  mp+jj);.    }.  
86d0: 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29    if( jj<nTemp )
86e0: 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a   zTemp[jj] = 0;.
86f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
8700: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
8710: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8720: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
8730: 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  "%s", pOp->zComm
8740: 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73  ent);.    jj = s
8750: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8760: 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Temp);.  }else{.
8770: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
8780: 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20  ;.    jj = 0;.  
8790: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d  }.  return jj;.}
87a0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
87b0: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20  E_DEBUG */..#if 
87c0: 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20  VDBE_DISPLAY_P4 
87d0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
87e0: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
87f0: 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61  HINTS)./*.** Tra
8800: 6e 73 6c 61 74 65 20 74 68 65 20 50 34 2e 70 45  nslate the P4.pE
8810: 78 70 72 20 76 61 6c 75 65 20 66 6f 72 20 61 6e  xpr value for an
8820: 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20 6f   OP_CursorHint o
8830: 70 63 6f 64 65 20 69 6e 74 6f 20 74 65 78 74 0a  pcode into text.
8840: 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 64  ** that can be d
8850: 69 73 70 6c 61 79 65 64 20 69 6e 20 74 68 65 20  isplayed in the 
8860: 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58 50  P4 column of EXP
8870: 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a  LAIN output..*/.
8880: 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70  static void disp
8890: 6c 61 79 50 34 45 78 70 72 28 53 74 72 41 63 63  layP4Expr(StrAcc
88a0: 75 6d 20 2a 70 2c 20 45 78 70 72 20 2a 70 45 78  um *p, Expr *pEx
88b0: 70 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  pr){.  const cha
88c0: 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 73 77  r *zOp = 0;.  sw
88d0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
88e0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  ){.    case TK_S
88f0: 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 73 71 6c  TRING:.      sql
8900: 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22  ite3XPrintf(p, "
8910: 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  %Q", pExpr->u.zT
8920: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
8930: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8940: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 73  INTEGER:.      s
8950: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
8960: 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e   "%d", pExpr->u.
8970: 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  iValue);.      b
8980: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8990: 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71  K_NULL:.      sq
89a0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
89b0: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62  "NULL");.      b
89c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
89d0: 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
89e0: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
89f0: 74 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70  tf(p, "r[%d]", p
8a00: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
8a10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8a20: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
8a30: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
8a40: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
8a50: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  <0 ){.        sq
8a60: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
8a70: 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20  "rowid");.      
8a80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8a90: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
8aa0: 20 22 63 25 64 22 2c 20 28 69 6e 74 29 70 45 78   "c%d", (int)pEx
8ab0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
8ac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
8ad0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
8ae0: 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 4f  e TK_LT:      zO
8af0: 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 20 62  p = "LT";      b
8b00: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8b10: 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_LE:      zOp =
8b20: 20 22 4c 45 22 3b 20 20 20 20 20 20 62 72 65 61   "LE";      brea
8b30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
8b40: 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47  T:      zOp = "G
8b50: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
8b60: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20      case TK_GE: 
8b70: 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 45 22 3b       zOp = "GE";
8b80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8b90: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
8ba0: 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20    zOp = "NE";   
8bb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8bc0: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a  se TK_EQ:      z
8bd0: 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20 20  Op = "EQ";      
8be0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8bf0: 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70 20  TK_IS:      zOp 
8c00: 3d 20 22 49 53 22 3b 20 20 20 20 20 20 62 72 65  = "IS";      bre
8c10: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8c20: 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20 22  ISNOT:   zOp = "
8c30: 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b 3b  ISNOT";   break;
8c40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
8c50: 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e 44  :     zOp = "AND
8c60: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
8c70: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20    case TK_OR:   
8c80: 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20 20     zOp = "OR";  
8c90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8ca0: 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20  ase TK_PLUS:    
8cb0: 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20  zOp = "ADD";    
8cc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8cd0: 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f 70   TK_STAR:    zOp
8ce0: 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20 62 72   = "MUL";     br
8cf0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8d00: 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d 20  _MINUS:   zOp = 
8d10: 22 53 55 42 22 3b 20 20 20 20 20 62 72 65 61 6b  "SUB";     break
8d20: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
8d30: 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 52 45  M:     zOp = "RE
8d40: 4d 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  M";     break;. 
8d50: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
8d60: 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 41 4e  D:  zOp = "BITAN
8d70: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
8d80: 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20  case TK_BITOR:  
8d90: 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20   zOp = "BITOR"; 
8da0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8db0: 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 4f  e TK_SLASH:   zO
8dc0: 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20 20 62  p = "DIV";     b
8dd0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8de0: 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d  K_LSHIFT:  zOp =
8df0: 20 22 4c 53 48 49 46 54 22 3b 20 20 62 72 65 61   "LSHIFT";  brea
8e00: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
8e10: 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 52  SHIFT:  zOp = "R
8e20: 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a  SHIFT";  break;.
8e30: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
8e40: 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e 43  AT:  zOp = "CONC
8e50: 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  AT";  break;.   
8e60: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
8e70: 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22 3b    zOp = "MINUS";
8e80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8e90: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a  se TK_UPLUS:   z
8ea0: 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 20 20 20  Op = "PLUS";    
8eb0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8ec0: 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70 20  TK_BITNOT:  zOp 
8ed0: 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 62 72 65  = "BITNOT";  bre
8ee0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8ef0: 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22  NOT:     zOp = "
8f00: 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  NOT";     break;
8f10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
8f20: 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53 4e  ULL:  zOp = "ISN
8f30: 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ULL";  break;.  
8f40: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
8f50: 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c  L: zOp = "NOTNUL
8f60: 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  L"; break;..    
8f70: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73  default:.      s
8f80: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
8f90: 20 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a   "%s", "expr");.
8fa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
8fb0: 0a 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20  ..  if( zOp ){. 
8fc0: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
8fd0: 66 28 70 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29  f(p, "%s(", zOp)
8fe0: 3b 0a 20 20 20 20 64 69 73 70 6c 61 79 50 34 45  ;.    displayP4E
8ff0: 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 4c  xpr(p, pExpr->pL
9000: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 45  eft);.    if( pE
9010: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
9020: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
9030: 63 63 75 6d 41 70 70 65 6e 64 28 70 2c 20 22 2c  ccumAppend(p, ",
9040: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69 73  ", 1);.      dis
9050: 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45  playP4Expr(p, pE
9060: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
9070: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53    }.    sqlite3S
9080: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 2c  trAccumAppend(p,
9090: 20 22 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a   ")", 1);.  }.}.
90a0: 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44  #endif /* VDBE_D
90b0: 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66  ISPLAY_P4 && def
90c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
90d0: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29  LE_CURSOR_HINTS)
90e0: 20 2a 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44   */...#if VDBE_D
90f0: 49 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20  ISPLAY_P4./*.** 
9100: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
9110: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
9120: 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72  the P4 parameter
9130: 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a   for an opcode..
9140: 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72  ** Use zTemp for
9150: 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65   any required te
9160: 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73  mporary buffer s
9170: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
9180: 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28  char *displayP4(
9190: 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a  Op *pOp, char *z
91a0: 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29  Temp, int nTemp)
91b0: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20  {.  char *zP4 = 
91c0: 7a 54 65 6d 70 3b 0a 20 20 53 74 72 41 63 63 75  zTemp;.  StrAccu
91d0: 6d 20 78 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  m x;.  assert( n
91e0: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71  Temp>=20 );.  sq
91f0: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
9200: 74 28 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20  t(&x, 0, zTemp, 
9210: 6e 54 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69  nTemp, 0);.  swi
9220: 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  tch( pOp->p4type
9230: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f   ){.    case P4_
9240: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
9250: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65   int j;.      Ke
9260: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
9270: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
9280: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
9290: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
92a0: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
92b0: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
92c0: 66 28 26 78 2c 20 22 6b 28 25 64 22 2c 20 70 4b  f(&x, "k(%d", pK
92d0: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b  eyInfo->nField);
92e0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
92f0: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  j<pKeyInfo->nFie
9300: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
9310: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
9320: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
9330: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63  ll[j];.        c
9340: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
9350: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
9360: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b 0a 20 20  ->zName : "";.  
9370: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
9380: 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41 52 59 22  (zColl, "BINARY"
9390: 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d 20 22  )==0 ) zColl = "
93a0: 42 22 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  B";.        sqli
93b0: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
93c0: 2c 25 73 25 73 22 2c 20 70 4b 65 79 49 6e 66 6f  ,%s%s", pKeyInfo
93d0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
93e0: 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c  ? "-" : "", zCol
93f0: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
9400: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
9410: 6d 41 70 70 65 6e 64 28 26 78 2c 20 22 29 22 2c  mAppend(&x, ")",
9420: 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
9430: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
9440: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
9450: 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61  SOR_HINTS.    ca
9460: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20  se P4_EXPR: {.  
9470: 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70      displayP4Exp
9480: 72 28 26 78 2c 20 70 4f 70 2d 3e 70 34 2e 70 45  r(&x, pOp->p4.pE
9490: 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  xpr);.      brea
94a0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
94b0: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
94c0: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
94d0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
94e0: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
94f0: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9500: 66 28 26 78 2c 20 22 28 25 2e 32 30 73 29 22 2c  f(&x, "(%.20s)",
9510: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
9520: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9530: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46   }.    case P4_F
9540: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
9550: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20  FuncDef *pDef = 
9560: 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20  pOp->p4.pFunc;. 
9570: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
9580: 6e 74 66 28 26 78 2c 20 22 25 73 28 25 64 29 22  ntf(&x, "%s(%d)"
9590: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
95a0: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
95b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
95c0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
95d0: 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
95e0: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
95f0: 29 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  ).    case P4_FU
9600: 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46  NCCTX: {.      F
9610: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
9620: 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75  Op->p4.pCtx->pFu
9630: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
9640: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 73  3XPrintf(&x, "%s
9650: 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61  (%d)", pDef->zNa
9660: 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b  me, pDef->nArg);
9670: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9680: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
9690: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a  ase P4_INT64: {.
96a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
96b0: 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c  intf(&x, "%lld",
96c0: 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b   *pOp->p4.pI64);
96d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
96e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
96f0: 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73  INT32: {.      s
9700: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
9710: 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%d", pOp->p4.
9720: 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  i);.      break;
9730: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9740: 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20  P4_REAL: {.     
9750: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
9760: 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f  &x, "%.16g", *pO
9770: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20  p->p4.pReal);.  
9780: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9790: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
97a0: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  : {.      Mem *p
97b0: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d  Mem = pOp->p4.pM
97c0: 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  em;.      if( pM
97d0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
97e0: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
97f0: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
9800: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
9810: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
9820: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Int ){.        s
9830: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
9840: 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e  , "%lld", pMem->
9850: 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.i);.      }els
9860: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
9870: 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  s & MEM_Real ){.
9880: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58          sqlite3X
9890: 50 72 69 6e 74 66 28 26 78 2c 20 22 25 2e 31 36  Printf(&x, "%.16
98a0: 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a  g", pMem->u.r);.
98b0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
98c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
98d0: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  M_Null ){.      
98e0: 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c 22 3b 0a    zP4 = "NULL";.
98f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9900: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
9910: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  m->flags & MEM_B
9920: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  lob );.        z
9930: 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20  P4 = "(blob)";. 
9940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
9950: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
9960: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
9970: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
9980: 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20  ase P4_VTAB: {. 
9990: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
99a0: 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  b *pVtab = pOp->
99b0: 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
99c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
99d0: 72 69 6e 74 66 28 26 78 2c 20 22 76 74 61 62 3a  rintf(&x, "vtab:
99e0: 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20  %p", pVtab);.   
99f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9a00: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
9a10: 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20  P4_INTARRAY: {. 
9a20: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
9a30: 20 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f 70 2d    int *ai = pOp-
9a40: 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 69 6e  >p4.ai;.      in
9a50: 74 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20 20 2f  t n = ai[0];   /
9a60: 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c 65 6d  * The first elem
9a70: 65 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41 52 52  ent of an INTARR
9a80: 41 59 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  AY is always the
9a90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9aa0: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74          ** count
9ab0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
9ac0: 66 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 66 6f  f elements to fo
9ad0: 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 66 6f  llow */.      fo
9ae0: 72 28 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=1; i<n; i++)
9af0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9b00: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 2c 25  3XPrintf(&x, ",%
9b10: 64 22 2c 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20  d", ai[i]);.    
9b20: 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b    }.      zTemp[
9b30: 30 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20  0] = '[';.      
9b40: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
9b50: 70 70 65 6e 64 28 26 78 2c 20 22 5d 22 2c 20 31  ppend(&x, "]", 1
9b60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9b70: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
9b80: 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a  4_SUBPROGRAM: {.
9b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
9ba0: 69 6e 74 66 28 26 78 2c 20 22 70 72 6f 67 72 61  intf(&x, "progra
9bb0: 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  m");.      break
9bc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9bd0: 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20   P4_ADVANCE: {. 
9be0: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
9bf0: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
9c00: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
9c10: 34 5f 54 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  4_TABLE: {.     
9c20: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
9c30: 26 78 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70  &x, "%s", pOp->p
9c40: 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  4.pTab->zName);.
9c50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9c60: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
9c70: 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f  {.      zP4 = pO
9c80: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69  p->p4.z;.      i
9c90: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
9ca0: 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70       zP4 = zTemp
9cb0: 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  ;.        zTemp[
9cc0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  0] = 0;.      }.
9cd0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
9ce0: 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
9cf0: 68 28 26 78 29 3b 0a 20 20 61 73 73 65 72 74 28  h(&x);.  assert(
9d00: 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74   zP4!=0 );.  ret
9d10: 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69  urn zP4;.}.#endi
9d20: 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41  f /* VDBE_DISPLA
9d30: 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  Y_P4 */../*.** D
9d40: 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64  eclare to the Vd
9d50: 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65  be that the BTre
9d60: 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e  e object at db->
9d70: 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a  aDb[i] is used..
9d80: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72  **.** The prepar
9d90: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65  ed statements ne
9da0: 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64  ed to know in ad
9db0: 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65  vance the comple
9dc0: 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74  te set of.** att
9dd0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
9de0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
9df0: 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65  .  A mask of the
9e00: 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  se databases.** 
9e10: 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e  is maintained in
9e20: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20   p->btreeMask.  
9e30: 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20  The p->lockMask 
9e40: 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 62  value is the sub
9e50: 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72  set of.** p->btr
9e60: 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61  eeMask of databa
9e70: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ses that will re
9e80: 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f  quire a lock..*/
9e90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9ea0: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
9eb0: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73  *p, int i){.  as
9ec0: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
9ed0: 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c  p->db->nDb && i<
9ee0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d  (int)sizeof(yDbM
9ef0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65  ask)*8 );.  asse
9f00: 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f  rt( i<(int)sizeo
9f10: 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a  f(p->btreeMask)*
9f20: 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74  8 );.  DbMaskSet
9f30: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69  (p->btreeMask, i
9f40: 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26  );.  if( i!=1 &&
9f50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61   sqlite3BtreeSha
9f60: 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62  rable(p->db->aDb
9f70: 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20  [i].pBt) ){.    
9f80: 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63  DbMaskSet(p->loc
9f90: 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d  kMask, i);.  }.}
9fa0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
9fb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
9fc0: 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20 49  D_CACHE)./*.** I
9fd0: 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  f SQLite is comp
9fe0: 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  iled to support 
9ff0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
a000: 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65  e and to be thre
a010: 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20  adsafe,.** this 
a020: 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20  routine obtains 
a030: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
a040: 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42  ated with each B
a050: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
a060: 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65  e.** that may be
a070: 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65   accessed by the
a080: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
a090: 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f   argument. In do
a0a0: 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a  ing so it also.*
a0b0: 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61  * sets the BtSha
a0c0: 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66  red.db member of
a0d0: 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53   each of the BtS
a0e0: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73  hared structures
a0f0: 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68  , ensuring.** th
a100: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
a110: 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
a120: 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  back is invoked 
a130: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a  if required..**.
a140: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
a150: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62  not threadsafe b
a160: 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20  ut does support 
a170: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
a180: 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74  e, then.** sqlit
a190: 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 69  e3BtreeEnter() i
a1a0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  s invoked to set
a1b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
a1c0: 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66   variables.** of
a1d0: 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64   all of BtShared
a1e0: 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65   structures acce
a1f0: 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64  ssible via the d
a200: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a  atabase handle .
a210: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ** associated wi
a220: 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a  th the VM..**.**
a230: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
a240: 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64  t threadsafe and
a250: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
a260: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
a270: 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  ode, this.** fun
a280: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
a290: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62  ..**.** The p->b
a2a0: 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69  treeMask field i
a2b0: 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61  s a bitmask of a
a2c0: 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20 74  ll btrees that t
a2d0: 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20  he prepared .** 
a2e0: 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c  statement p will
a2f0: 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20   ever use.  Let 
a300: 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  N be the number 
a310: 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74  of bits in p->bt
a320: 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65  reeMask.** corre
a330: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65  sponding to btre
a340: 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72  es that use shar
a350: 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20  ed cache.  Then 
a360: 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a  the runtime of.*
a370: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
a380: 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e  s N*N.  But as N
a390: 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20   is rarely more 
a3a0: 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f  than 1, this sho
a3b0: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20  uld not.** be a 
a3c0: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64  problem..*/.void
a3d0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
a3e0: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  r(Vdbe *p){.  in
a3f0: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
a400: 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20  db;.  Db *aDb;. 
a410: 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20   int nDb;.  if( 
a420: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
a430: 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74  >lockMask) ) ret
a440: 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  urn;  /* The com
a450: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62  mon case */.  db
a460: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20   = p->db;.  aDb 
a470: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62  = db->aDb;.  nDb
a480: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f   = db->nDb;.  fo
a490: 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b  r(i=0; i<nDb; i+
a4a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31  +){.    if( i!=1
a4b0: 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70   && DbMaskTest(p
a4c0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26  ->lockMask,i) &&
a4d0: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70   ALWAYS(aDb[i].p
a4e0: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  Bt!=0) ){.      
a4f0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
a500: 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  r(aDb[i].pBt);. 
a510: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
a520: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
a530: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
a540: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c  ED_CACHE) && SQL
a550: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
a560: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c  ./*.** Unlock al
a570: 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73 20  l of the btrees 
a580: 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65  previously locke
a590: 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73  d by a call to s
a5a0: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
a5b0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  )..*/.static SQL
a5c0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
a5d0: 64 20 76 64 62 65 4c 65 61 76 65 28 56 64 62 65  d vdbeLeave(Vdbe
a5e0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
a5f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
a600: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
a610: 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  Db;.  db = p->db
a620: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
a630: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
a640: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  Db;.  for(i=0; i
a650: 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nDb; i++){.    
a660: 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61  if( i!=1 && DbMa
a670: 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61  skTest(p->lockMa
a680: 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28  sk,i) && ALWAYS(
a690: 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29  aDb[i].pBt!=0) )
a6a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
a6b0: 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d  treeLeave(aDb[i]
a6c0: 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pBt);.    }.  }
a6d0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
a6e0: 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70  dbeLeave(Vdbe *p
a6f0: 29 7b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41  ){.  if( DbMaskA
a700: 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61  llZero(p->lockMa
a710: 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  sk) ) return;  /
a720: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
a730: 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76 65  e */.  vdbeLeave
a740: 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  (p);.}.#endif..#
a750: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
a760: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
a770: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
a780: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
a790: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
a7a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a7b0: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
a7c0: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
a7d0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
a7e0: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
a7f0: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
a800: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20  {.  char *zP4;. 
a810: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
a820: 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d    char zCom[100]
a830: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
a840: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20   char *zFormat1 
a850: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64  = "%4d %-13s %4d
a860: 20 25 34 64 20 25 34 64 20 25 2d 31 33 73 20 25   %4d %4d %-13s %
a870: 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28  .2X %s\n";.  if(
a880: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
a890: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20  = stdout;.  zP4 
a8a0: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
a8b0: 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50   zPtr, sizeof(zP
a8c0: 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  tr));.#ifdef SQL
a8d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
a8e0: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69  IN_COMMENTS.  di
a8f0: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
a900: 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a  , zP4, zCom, siz
a910: 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73  eof(zCom));.#els
a920: 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b  e.  zCom[0] = 0;
a930: 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a  .#endif.  /* NB:
a940: 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63    The sqlite3Opc
a950: 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69  odeName() functi
a960: 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
a970: 64 20 62 79 20 63 6f 64 65 20 63 72 65 61 74 65  d by code create
a980: 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b  d.  ** by the mk
a990: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20  opcodeh.awk and 
a9a0: 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63  mkopcodec.awk sc
a9b0: 72 69 70 74 73 20 77 68 69 63 68 20 65 78 74 72  ripts which extr
a9c0: 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66  act the.  ** inf
a9d0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
a9e0: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
a9f0: 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74  text */.  fprint
aa00: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
aa10: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
aa20: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
aa30: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
aa40: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
aa50: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
aa60: 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d  ->p5,.      zCom
aa70: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
aa80: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
aa90: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
aaa0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d   an array of N M
aab0: 65 6d 20 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  em element..*/.s
aac0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 4d  tatic void initM
aad0: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
aae0: 69 6e 74 20 4e 2c 20 73 71 6c 69 74 65 33 20 2a  int N, sqlite3 *
aaf0: 64 62 2c 20 75 31 36 20 66 6c 61 67 73 29 7b 0a  db, u16 flags){.
ab00: 20 20 77 68 69 6c 65 28 20 28 4e 2d 2d 29 3e 30    while( (N--)>0
ab10: 20 29 7b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20   ){.    p->db = 
ab20: 64 62 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  db;.    p->flags
ab30: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 70 2d   = flags;.    p-
ab40: 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23  >szMalloc = 0;.#
ab50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
ab60: 55 47 0a 20 20 20 20 70 2d 3e 70 53 63 6f 70 79  UG.    p->pScopy
ab70: 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66  From = 0;.#endif
ab80: 0a 20 20 20 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a  .    p++;.  }.}.
ab90: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
aba0: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
abb0: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61   elements.*/.sta
abc0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
abd0: 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c  MemArray(Mem *p,
abe0: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
abf0: 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d   && N ){.    Mem
ac00: 20 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a   *pEnd = &p[N];.
ac10: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
ac20: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28  = p->db;.    if(
ac30: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
ac40: 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  d ){.      do{. 
ac50: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a         if( p->sz
ac60: 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
ac70: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
ac80: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77  alloc);.      }w
ac90: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
aca0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
acb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
acc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
acd0: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
ace0: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
acf0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ad00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
ad10: 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70  kMemInvariants(p
ad20: 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ) );..      /* T
ad30: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61  his block is rea
ad40: 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76  lly an inlined v
ad50: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
ad60: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
ad70: 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  ).      ** that 
ad80: 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20  takes advantage 
ad90: 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74  of the fact that
ada0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
adb0: 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20   value is .     
adc0: 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f   ** being set to
add0: 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65   NULL after rele
ade0: 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69  asing any dynami
adf0: 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20  c resources..   
ae00: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
ae10: 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e  he justification
ae20: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67   for duplicating
ae30: 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63   code is that ac
ae40: 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20  cording to .    
ae50: 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20    ** callgrind, 
ae60: 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65  this causes a ce
ae70: 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20  rtain test case 
ae80: 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34  to hit the CPU 4
ae90: 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72  .7 .      ** per
aea0: 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c  cent less (x86 l
aeb0: 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f  inux, gcc versio
aec0: 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68  n 4.1.2, -O6) th
aed0: 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20  an if .      ** 
aee0: 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73  sqlite3MemReleas
aef0: 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20  e() were called 
af00: 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20  from here. With 
af10: 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a  -O2, this jumps.
af20: 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20        ** to 6.6 
af30: 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73  percent. The tes
af40: 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74  t case is insert
af50: 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e  ing 1000 rows in
af60: 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20  to a table .    
af70: 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64    ** with no ind
af80: 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e  exes using a sin
af90: 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53  gle prepared INS
afa0: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ERT statement, b
afb0: 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ind() .      ** 
afc0: 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73  and reset(). Ins
afd0: 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64  erts are grouped
afe0: 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74   into a transact
aff0: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
b000: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
b010: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67  >flags & MEM_Agg
b020: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
b030: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
b040: 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20  EM_Dyn );.      
b050: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
b060: 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29  gs & MEM_Frame )
b070: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
b080: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
b090: 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20  _RowSet );.     
b0a0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d   if( p->flags&(M
b0b0: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d  EM_Agg|MEM_Dyn|M
b0c0: 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77  EM_Frame|MEM_Row
b0d0: 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Set) ){.        
b0e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
b0f0: 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20  lease(p);.      
b100: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d  }else if( p->szM
b110: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
b120: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
b130: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
b140: 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c          p->szMal
b150: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  loc = 0;.      }
b160: 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73  ..      p->flags
b170: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
b180: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b  ;.    }while( (+
b190: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  +p)<pEnd );.  }.
b1a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
b1b0: 61 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  a VdbeFrame obje
b1c0: 63 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65  ct and its conte
b1d0: 6e 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f  nts. VdbeFrame o
b1e0: 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c  bjects are.** al
b1f0: 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f  located by the O
b200: 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65  P_Program opcode
b210: 20 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45   in sqlite3VdbeE
b220: 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  xec()..*/.void s
b230: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44  qlite3VdbeFrameD
b240: 65 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20  elete(VdbeFrame 
b250: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
b260: 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65  Mem *aMem = Vdbe
b270: 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56  FrameMem(p);.  V
b280: 64 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73  dbeCursor **apCs
b290: 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20  r = (VdbeCursor 
b2a0: 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69  **)&aMem[p->nChi
b2b0: 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d  ldMem];.  for(i=
b2c0: 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73  0; i<p->nChildCs
b2d0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  r; i++){.    sql
b2e0: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
b2f0: 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69  or(p->v, apCsr[i
b300: 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ]);.  }.  releas
b310: 65 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20  eMemArray(aMem, 
b320: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20  p->nChildMem);. 
b330: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
b340: 74 65 41 75 78 44 61 74 61 28 70 2d 3e 76 2d 3e  teAuxData(p->v->
b350: 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61  db, &p->pAuxData
b360: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69  , -1, 0);.  sqli
b370: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e  te3DbFree(p->v->
b380: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64  db, p);.}..#ifnd
b390: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
b3a0: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76  XPLAIN./*.** Giv
b3b0: 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  e a listing of t
b3c0: 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68  he program in th
b3d0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
b3e0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  e..**.** The int
b3f0: 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61  erface is the sa
b400: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62  me as sqlite3Vdb
b410: 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e  eExec().  But in
b420: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e  stead of.** runn
b430: 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74  ing the code, it
b440: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c   invokes the cal
b450: 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65  lback once for e
b460: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ach instruction.
b470: 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65  .** This feature
b480: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
b490: 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e  ement "EXPLAIN".
b4a0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
b4b0: 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20  xplain==1, each 
b4c0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c  instruction is l
b4d0: 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20  isted.  When.** 
b4e0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f  p->explain==2, o
b4f0: 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  nly OP_Explain i
b500: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
b510: 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65  listed and these
b520: 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e  .** are shown in
b530: 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72   a different for
b540: 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e  mat.  p->explain
b550: 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69  ==2 is used to i
b560: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c  mplement.** EXPL
b570: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a  AIN QUERY PLAN..
b580: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
b590: 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20  plain==1, first 
b5a0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
b5b0: 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e   is listed, then
b5c0: 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20   each of.** the 
b5d0: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
b5e0: 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f  ams are listed o
b5f0: 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e  ne by one..*/.in
b600: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
b610: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b630: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
b640: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20  .  int nRow;    
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b660: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20          /* Stop 
b670: 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72  when row count r
b680: 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20  eaches this */. 
b690: 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20   int nSub = 0;  
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b6c0: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65  of sub-vdbes see
b6d0: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75  n so far */.  Su
b6e0: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
b6f0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b700: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
b710: 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65  ub-vdbes */.  Me
b720: 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  m *pSub = 0;    
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b740: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
b750: 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20  l hold array of 
b760: 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71  subprogs */.  sq
b770: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
b780: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
b790: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
b7a0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
b7b0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7d0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
b7e0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
b7f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
b820: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
b830: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20  = &p->aMem[1];  
b840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
b850: 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c  rst Mem of resul
b860: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  t set */..  asse
b870: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29  rt( p->explain )
b880: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
b890: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
b8a0: 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  _RUN );.  assert
b8b0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
b8c0: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
b8d0: 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72  ITE_BUSY || p->r
b8e0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
b8f0: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
b900: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
b910: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79   does not use dy
b920: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f  namic strings fo
b930: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c  r.  ** the resul
b940: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  t, result column
b950: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e  s may become dyn
b960: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72  amic if the user
b970: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69   calls.  ** sqli
b980: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
b990: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74  6(), causing a t
b9a0: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54  ranslation to UT
b9b0: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20  F-16 encoding.. 
b9c0: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   */.  releaseMem
b9d0: 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a  Array(pMem, 8);.
b9e0: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
b9f0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  = 0;..  if( p->r
ba00: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  c==SQLITE_NOMEM_
ba10: 42 4b 50 54 20 29 7b 0a 20 20 20 20 2f 2a 20 54  BKPT ){.    /* T
ba20: 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61  his happens if a
ba30: 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65   malloc() inside
ba40: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
ba50: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29  e3_column_text()
ba60: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
ba70: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
ba80: 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20  () failed.  */. 
ba90: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
baa0: 6c 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75  lt(db);.    retu
bab0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
bac0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
bad0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
bae0: 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65  tput rows reache
baf0: 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61  s nRow, that mea
bb00: 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ns the.  ** list
bb10: 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64  ing has finished
bb20: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65   and sqlite3_ste
bb30: 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72  p() should retur
bb40: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
bb50: 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20   ** nRow is the 
bb60: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
bb70: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
bb80: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70   main program, p
bb90: 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d  lus.  ** the sum
bba0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
bbb0: 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72  f rows in all tr
bbc0: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
bbd0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
bbe0: 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20  ** so far.  The 
bbf0: 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20  nRow value will 
bc00: 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20  increase as new 
bc10: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
bc20: 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63  ams are.  ** enc
bc30: 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d  ountered, but p-
bc40: 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61  >pc will eventua
bc50: 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20  lly catch up to 
bc60: 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f  nRow..  */.  nRo
bc70: 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  w = p->nOp;.  if
bc80: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
bc90: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
bca0: 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c  rst 8 memory cel
bcb0: 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  ls are used for 
bcc0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
bcd0: 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20   So we will.    
bce0: 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68  ** commandeer th
bcf0: 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73  e 9th cell to us
bd00: 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72  e as storage for
bd10: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
bd20: 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20  nters.    ** to 
bd30: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
bd40: 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69  ams.  The VDBE i
bd50: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
bd60: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a  have at least 9.
bd70: 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a      ** cells.  *
bd80: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
bd90: 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70  >nMem>9 );.    p
bda0: 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39  Sub = &p->aMem[9
bdb0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ];.    if( pSub-
bdc0: 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20  >flags&MEM_Blob 
bdd0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74  ){.      /* On t
bde0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
bdf0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c   sqlite3_step(),
be00: 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20   pSub will hold 
be10: 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20  a NULL.  It is. 
be20: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
be30: 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79  zed to a BLOB by
be40: 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52   the P4_SUBPROGR
be50: 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  AM processing lo
be60: 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  gic below */.   
be70: 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e     nSub = pSub->
be80: 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b  n/sizeof(Vdbe*);
be90: 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28  .      apSub = (
bea0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
beb0: 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  ub->z;.    }.   
bec0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
bed0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52  ; i++){.      nR
bee0: 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e  ow += apSub[i]->
bef0: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nOp;.    }.  }..
bf00: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
bf10: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
bf20: 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78   i<nRow && p->ex
bf30: 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61  plain==2 && p->a
bf40: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50  Op[i].opcode!=OP
bf50: 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  _Explain );.  if
bf60: 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20  ( i>=nRow ){.   
bf70: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
bf80: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
bf90: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
bfa0: 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49  e if( db->u1.isI
bfb0: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
bfc0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
bfd0: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
bfe0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
bff0: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  R;.    sqlite3Vd
c000: 62 65 45 72 72 6f 72 28 70 2c 20 73 71 6c 69 74  beError(p, sqlit
c010: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29  e3ErrStr(p->rc))
c020: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
c030: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70  har *zP4;.    Op
c040: 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69   *pOp;.    if( i
c050: 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20  <p->nOp ){.     
c060: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c   /* The output l
c070: 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d  ine number is sm
c080: 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20  all enough that 
c090: 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  we are still in 
c0a0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69  the.      ** mai
c0b0: 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20  n program. */.  
c0c0: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
c0d0: 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  p[i];.    }else{
c0e0: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65  .      /* We are
c0f0: 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69   currently listi
c100: 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  ng subprograms. 
c110: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
c120: 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20  h one and.      
c130: 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61  ** pick up the a
c140: 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64  ppropriate opcod
c150: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
c160: 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d  j;.      i -= p-
c170: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  >nOp;.      for(
c180: 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d  j=0; i>=apSub[j]
c190: 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nOp; j++){.   
c1a0: 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b       i -= apSub[
c1b0: 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d  j]->nOp;.      }
c1c0: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70  .      pOp = &ap
c1d0: 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a  Sub[j]->aOp[i];.
c1e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
c1f0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
c200: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
c210: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
c220: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b    pMem->u.i = i;
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74  /* Program count
c260: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
c270: 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65  ++;.  .      pMe
c280: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
c290: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45  tatic|MEM_Str|ME
c2a0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
c2b0: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73  em->z = (char*)s
c2c0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
c2d0: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f  (pOp->opcode); /
c2e0: 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  * Opcode */.    
c2f0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
c300: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
c310: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
c320: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
c330: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
c340: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
c350: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  .      pMem++;..
c360: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e        /* When an
c370: 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f   OP_Program opco
c380: 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20  de is encounter 
c390: 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65  (the only opcode
c3a0: 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20   that has.      
c3b0: 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52  ** a P4_SUBPROGR
c3c0: 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78  AM argument), ex
c3d0: 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66  pand the size of
c3e0: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75   the array of su
c3f0: 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20  bprograms.      
c400: 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d  ** kept in p->aM
c410: 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20  em[9].z to hold 
c420: 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20  the new program 
c430: 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20  - assuming this 
c440: 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20  subprogram.     
c450: 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   ** has not alre
c460: 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20  ady been seen.. 
c470: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
c480: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
c490: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
c4a0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74          int nByt
c4b0: 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a  e = (nSub+1)*siz
c4c0: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
c4d0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  ;.        int j;
c4e0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
c4f0: 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  ; j<nSub; j++){.
c500: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70            if( ap
c510: 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e  Sub[j]==pOp->p4.
c520: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
c530: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c540: 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20      if( j==nSub 
c550: 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71  && SQLITE_OK==sq
c560: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
c570: 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53  (pSub, nByte, nS
c580: 75 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ub!=0) ){.      
c590: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
c5a0: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
c5b0: 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  >z;.          ap
c5c0: 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f  Sub[nSub++] = pO
c5d0: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  p->p4.pProgram;.
c5e0: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
c5f0: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f  flags |= MEM_Blo
c600: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  b;.          pSu
c610: 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65  b->n = nSub*size
c620: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
c630: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c640: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d   }.    }..    pM
c650: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c660: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
c670: 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20  .i = pOp->p1;   
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c690: 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a         /* P1 */.
c6a0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
c6b0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
c6c0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
c6d0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  ->u.i = pOp->p2;
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
c700: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
c710: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
c720: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
c730: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
c740: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c760: 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P3 */.    pMem++
c770: 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ;..    if( sqlit
c780: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
c790: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30  dResize(pMem, 10
c7a0: 30 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20  0) ){ /* P4 */. 
c7b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c7c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c7d0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
c7e0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
c7f0: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66     }.    pMem->f
c800: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
c810: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34  EM_Term;.    zP4
c820: 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70   = displayP4(pOp
c830: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d  , pMem->z, pMem-
c840: 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  >szMalloc);.    
c850: 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a  if( zP4!=pMem->z
c860: 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   ){.      pMem->
c870: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  n = 0;.      sql
c880: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
c890: 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c  r(pMem, zP4, -1,
c8a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
c8b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c8c0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
c8d0: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  >z!=0 );.      p
c8e0: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
c8f0: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
c900: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
c910: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
c920: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
c930: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++;..    if( p->
c940: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
c950: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
c960: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
c970: 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b  size(pMem, 4) ){
c980: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c990: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
c9a0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
c9b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
c9c0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
c9d0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
c9e0: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
c9f0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
ca00: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
ca10: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
ca20: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c  pMem->z, "%.2x",
ca30: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20   pOp->p5);   /* 
ca40: 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P5 */.      pMem
ca50: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
ca60: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
ca70: 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c  +;.  .#ifdef SQL
ca80: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
ca90: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
caa0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
cab0: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
cac0: 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b  ze(pMem, 500) ){
cad0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
cae0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
caf0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
cb00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
cb10: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
cb20: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
cb30: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
cb40: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
cb50: 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e   = displayCommen
cb60: 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d  t(pOp, zP4, pMem
cb70: 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20 20  ->z, 500);.     
cb80: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
cb90: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a  ITE_UTF8;.#else.
cba0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
cbb0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20  s = MEM_Null;   
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbd0: 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a      /* Comment *
cbe0: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  /.#endif.    }..
cbf0: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
cc00: 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78  n = 8 - 4*(p->ex
cc10: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d  plain-1);.    p-
cc20: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70  >pResultSet = &p
cc30: 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70  ->aMem[1];.    p
cc40: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
cc50: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
cc60: 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74  E_ROW;.  }.  ret
cc70: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
cc80: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
cc90: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64  EXPLAIN */..#ifd
cca0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
ccb0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
ccc0: 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65  SQL that was use
ccd0: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  d to generate a 
cce0: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  VDBE program..*/
ccf0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
cd00: 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a  ePrintSql(Vdbe *
cd10: 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p){.  const char
cd20: 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70   *z = 0;.  if( p
cd30: 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20  ->zSql ){.    z 
cd40: 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c  = p->zSql;.  }el
cd50: 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31  se if( p->nOp>=1
cd60: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64   ){.    const Vd
cd70: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e  beOp *pOp = &p->
cd80: 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  aOp[0];.    if( 
cd90: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
cda0: 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e  Init && pOp->p4.
cdb0: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20  z!=0 ){.      z 
cdc0: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
cdd0: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
cde0: 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a  3Isspace(*z) ) z
cdf0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
ce00: 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22  if( z ) printf("
ce10: 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29  SQL: [%s]\n", z)
ce20: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
ce30: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
ce40: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
ce50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
ce60: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a  ABLE_IOTRACE)./*
ce70: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54  .** Print an IOT
ce80: 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f  RACE message sho
ce90: 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74  wing SQL content
cea0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ceb0: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28  3VdbeIOTraceSql(
cec0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
ced0: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
cee0: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
cef0: 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63  f( sqlite3IoTrac
cf00: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
cf10: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
cf20: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
cf30: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
cf40: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
cf50: 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  nit && pOp->p4.z
cf60: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
cf70: 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b  , j;.    char z[
cf80: 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  1000];.    sqlit
cf90: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
cfa0: 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20  of(z), z, "%s", 
cfb0: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20  pOp->p4.z);.    
cfc0: 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33  for(i=0; sqlite3
cfd0: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69  Isspace(z[i]); i
cfe0: 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d  ++){}.    for(j=
cff0: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
d000: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
d010: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b  Isspace(z[i]) ){
d020: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
d030: 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]!=' ' ){.    
d040: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
d050: 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
d060: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d070: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
d080: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d090: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
d0a0: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
d0b0: 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b  ("SQL %s\n", z);
d0c0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
d0d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52   !SQLITE_OMIT_TR
d0e0: 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  ACE && SQLITE_EN
d0f0: 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a  ABLE_IOTRACE */.
d100: 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  ./* An instance 
d110: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 64  of this object d
d120: 65 73 63 72 69 62 65 73 20 62 75 6c 6b 20 6d 65  escribes bulk me
d130: 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66  mory available f
d140: 6f 72 20 75 73 65 0a 2a 2a 20 62 79 20 73 75 62  or use.** by sub
d150: 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61 20  components of a 
d160: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
d170: 6e 74 2e 20 20 53 70 61 63 65 20 69 73 20 61 6c  nt.  Space is al
d180: 6c 6f 63 61 74 65 64 20 6f 75 74 0a 2a 2a 20 6f  located out.** o
d190: 66 20 61 20 52 65 75 73 61 62 6c 65 53 70 61 63  f a ReusableSpac
d1a0: 65 20 6f 62 6a 65 63 74 20 62 79 20 74 68 65 20  e object by the 
d1b0: 61 6c 6c 6f 63 53 70 61 63 65 28 29 20 72 6f 75  allocSpace() rou
d1c0: 74 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 73  tine below..*/.s
d1d0: 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70  truct ReusableSp
d1e0: 61 63 65 20 7b 0a 20 20 75 38 20 2a 70 53 70 61  ace {.  u8 *pSpa
d1f0: 63 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ce;          /* 
d200: 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79  Available memory
d210: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
d220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
d230: 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
d240: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
d250: 20 6e 4e 65 65 64 65 64 3b 20 20 20 20 20 20 20   nNeeded;       
d260: 20 20 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65 73    /* Total bytes
d270: 20 74 68 61 74 20 63 6f 75 6c 64 20 6e 6f 74 20   that could not 
d280: 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  be allocated */.
d290: 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74 6f 20 61 6c  };../* Try to al
d2a0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
d2b0: 65 73 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69  es of 8-byte ali
d2c0: 67 6e 65 64 20 62 75 6c 6b 20 6d 65 6d 6f 72 79  gned bulk memory
d2d0: 20 66 6f 72 20 70 42 75 66 0a 2a 2a 20 66 72 6f   for pBuf.** fro
d2e0: 6d 20 74 68 65 20 52 65 75 73 61 62 6c 65 53 70  m the ReusableSp
d2f0: 61 63 65 20 6f 62 6a 65 63 74 2e 20 20 52 65 74  ace object.  Ret
d300: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
d310: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a   the allocated.*
d320: 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20 73 75 63 63  * memory on succ
d330: 65 73 73 2e 20 20 49 66 20 69 6e 73 75 66 66 69  ess.  If insuffi
d340: 63 69 65 6e 74 20 6d 65 6d 6f 72 79 20 69 73 20  cient memory is 
d350: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65  available in the
d360: 0a 2a 2a 20 52 65 75 73 61 62 6c 65 53 70 61 63  .** ReusableSpac
d370: 65 20 6f 62 6a 65 63 74 2c 20 69 6e 63 72 65 61  e object, increa
d380: 73 65 20 74 68 65 20 52 65 75 73 61 62 6c 65 53  se the ReusableS
d390: 70 61 63 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a 20  pace.nNeeded.** 
d3a0: 76 61 6c 75 65 20 62 79 20 74 68 65 20 61 6d 6f  value by the amo
d3b0: 75 6e 74 20 6e 65 65 64 65 64 20 61 6e 64 20 72  unt needed and r
d3c0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
d3d0: 2a 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74  * If pBuf is not
d3e0: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
d3f0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
d400: 20 74 68 65 20 6d 65 6d 6f 72 79 20 68 61 73 20   the memory has 
d410: 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
d420: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 20 70  allocated by a p
d430: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68 69  rior call to thi
d440: 73 20 72 6f 75 74 69 6e 65 2c 20 73 6f 20 6a 75  s routine, so ju
d450: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 70 79  st return a copy
d460: 0a 2a 2a 20 6f 66 20 70 42 75 66 20 61 6e 64 20  .** of pBuf and 
d470: 6c 65 61 76 65 20 52 65 75 73 61 62 6c 65 53 70  leave ReusableSp
d480: 61 63 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ace unchanged..*
d490: 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 63 61  *.** This alloca
d4a0: 74 6f 72 20 69 73 20 65 6d 70 6c 6f 79 65 64 20  tor is employed 
d4b0: 74 6f 20 72 65 70 75 72 70 6f 73 65 20 75 6e 75  to repurpose unu
d4c0: 73 65 64 20 73 6c 6f 74 73 20 61 74 20 74 68 65  sed slots at the
d4d0: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6f   end of the.** o
d4e0: 70 63 6f 64 65 20 61 72 72 61 79 20 6f 66 20 70  pcode array of p
d4f0: 72 65 70 61 72 65 64 20 73 74 61 74 65 20 66 6f  repared state fo
d500: 72 20 6f 74 68 65 72 20 6d 65 6d 6f 72 79 20 6e  r other memory n
d510: 65 65 64 73 20 6f 66 20 74 68 65 20 70 72 65 70  eeds of the prep
d520: 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ared.** statemen
d530: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
d540: 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20  d *allocSpace(. 
d550: 20 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65   struct Reusable
d560: 53 70 61 63 65 20 2a 70 2c 20 20 2f 2a 20 42 75  Space *p,  /* Bu
d570: 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61  lk memory availa
d580: 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  ble for allocati
d590: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
d5a0: 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
d5b0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
d5c0: 61 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69  a prior allocati
d5d0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  on */.  int nByt
d5e0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
d5f0: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65    /* Bytes of me
d600: 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a 29  mory needed */.)
d610: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
d620: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
d630: 28 70 2d 3e 70 53 70 61 63 65 29 20 29 3b 0a 20  (p->pSpace) );. 
d640: 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a   if( pBuf==0 ){.
d650: 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e      nByte = ROUN
d660: 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  D8(nByte);.    i
d670: 66 28 20 6e 42 79 74 65 20 3c 3d 20 70 2d 3e 6e  f( nByte <= p->n
d680: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 2d  Free ){.      p-
d690: 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b  >nFree -= nByte;
d6a0: 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 70  .      pBuf = &p
d6b0: 2d 3e 70 53 70 61 63 65 5b 70 2d 3e 6e 46 72 65  ->pSpace[p->nFre
d6c0: 65 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e];.    }else{. 
d6d0: 20 20 20 20 20 70 2d 3e 6e 4e 65 65 64 65 64 20       p->nNeeded 
d6e0: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a  += nByte;.    }.
d6f0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49    }.  assert( EI
d700: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
d710: 4e 54 28 70 42 75 66 29 20 29 3b 0a 20 20 72 65  NT(pBuf) );.  re
d720: 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a  turn pBuf;.}../*
d730: 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56  .** Rewind the V
d740: 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20  DBE back to the 
d750: 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65  beginning in pre
d760: 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  paration for.** 
d770: 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76  running it..*/.v
d780: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
d790: 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a  ewind(Vdbe *p){.
d7a0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
d7b0: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
d7c0: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
d7d0: 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64  E).  int i;.#end
d7e0: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  if.  assert( p!=
d7f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
d800: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
d810: 47 49 43 5f 49 4e 49 54 20 7c 7c 20 70 2d 3e 6d  GIC_INIT || p->m
d820: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
d830: 5f 52 45 53 45 54 20 29 3b 0a 0a 20 20 2f 2a 20  _RESET );..  /* 
d840: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
d850: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
d860: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
d870: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
d880: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
d890: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
d8a0: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
d8b0: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
d8c0: 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  */.  p->magic = 
d8d0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
d8e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
d8f0: 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20  EBUG.  for(i=0; 
d900: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b  i<p->nMem; i++){
d910: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
d920: 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64  aMem[i].db==p->d
d930: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
d940: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20    p->pc = -1;.  
d950: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
d960: 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  K;.  p->errorAct
d970: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
d980: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
d990: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
d9a0: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
d9b0: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
d9c0: 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d  55;.  p->iStatem
d9d0: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ent = 0;.  p->nF
d9e0: 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b  kConstraint = 0;
d9f0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
da00: 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20  FILE.  for(i=0; 
da10: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
da20: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
da30: 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f  t = 0;.    p->aO
da40: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
da50: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
da60: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
da70: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
da80: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72  or execution for
da90: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
daa0: 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e  after.** creatin
dab0: 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  g the virtual ma
dac0: 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76  chine.  This inv
dad0: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
dae0: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
daf0: 6e 67 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ng registers and
db00: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
db10: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
db20: 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  r..** After the 
db30: 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70  VDBE has be prep
db40: 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65  ped, it can be e
db50: 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f  xecuted by one o
db60: 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20  r more.** calls 
db70: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  to sqlite3VdbeEx
db80: 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ec().  .**.** Th
db90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
dba0: 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c  be called exactl
dbb0: 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76  y once on each v
dbc0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
dbd0: 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
dbe0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
dbf0: 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
dc00: 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69  "packaged" and i
dc10: 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75  s ready.** to ru
dc20: 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72  n.  After this r
dc30: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
dc40: 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20  , further calls 
dc50: 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  to .** sqlite3Vd
dc60: 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69  beAddOp() functi
dc70: 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74  ons are prohibit
dc80: 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
dc90: 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a  e disconnects.**
dca0: 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74   the Vdbe from t
dcb0: 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
dcc0: 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65  that helped gene
dcd0: 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20  rate it so that 
dce0: 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  the.** the Vdbe 
dcf0: 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70  becomes an indep
dd00: 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e  endent entity an
dd10: 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  d the Parse obje
dd20: 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73  ct can be.** des
dd30: 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73  troyed..**.** Us
dd40: 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  e the sqlite3Vdb
dd50: 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64  eRewind() proced
dd60: 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ure to restore a
dd70: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
dd80: 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20   back.** to its 
dd90: 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66  initial state af
dda0: 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ter it has been 
ddb0: 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  run..*/.void sql
ddc0: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
ddd0: 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  y(.  Vdbe *p,   
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
de00: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
de10: 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
de20: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
de30: 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73  ontext */.){.  s
de40: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
de60: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
de70: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
de80: 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20  t nVar;         
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dea0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65  Number of parame
deb0: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ters */.  int nM
dec0: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
ded0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
dee0: 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20  er of VM memory 
def0: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69  registers */.  i
df00: 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20  nt nCursor;     
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
df20: 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   Number of curso
df30: 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  rs required */. 
df40: 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20   int nArg;      
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
df70: 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f  uments in subpro
df80: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
df90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dfa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
dfb0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73  p counter */.  s
dfc0: 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70  truct ReusableSp
dfd0: 61 63 65 20 78 3b 20 20 20 20 20 20 20 20 2f 2a  ace x;        /*
dfe0: 20 52 65 75 73 61 62 6c 65 20 62 75 6c 6b 20 6d   Reusable bulk m
dff0: 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73 65  emory */..  asse
e000: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
e010: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
e020: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
e030: 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  se!=0 );.  asser
e040: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
e050: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
e060: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
e070: 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20  ==p->pParse );. 
e080: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
e090: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
e0a0: 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20  cFailed==0 );.  
e0b0: 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nVar = pParse->n
e0c0: 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50  Var;.  nMem = pP
e0d0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43  arse->nMem;.  nC
e0e0: 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
e0f0: 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70  nTab;.  nArg = p
e100: 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a  Parse->nMaxArg;.
e110: 20 20 0a 20 20 2f 2a 20 45 61 63 68 20 63 75 72    .  /* Each cur
e120: 73 6f 72 20 75 73 65 73 20 61 20 6d 65 6d 6f 72  sor uses a memor
e130: 79 20 63 65 6c 6c 2e 20 20 54 68 65 20 66 69 72  y cell.  The fir
e140: 73 74 20 63 75 72 73 6f 72 20 28 63 75 72 73 6f  st cursor (curso
e150: 72 20 30 29 20 63 61 6e 0a 20 20 2a 2a 20 75 73  r 0) can.  ** us
e160: 65 20 61 4d 65 6d 5b 30 5d 20 77 68 69 63 68 20  e aMem[0] which 
e170: 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65  is not otherwise
e180: 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42   used by the VDB
e190: 45 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c 6f  E program.  Allo
e1a0: 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20  cate.  ** space 
e1b0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 4d  at the end of aM
e1c0: 65 6d 5b 5d 20 66 6f 72 20 63 75 72 73 6f 72 73  em[] for cursors
e1d0: 20 31 20 61 6e 64 20 67 72 65 61 74 65 72 2e 0a   1 and greater..
e1e0: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
e1f0: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
e200: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
e210: 6e 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 6e  nCursor;.  if( n
e220: 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 6e 4d 65  Cursor==0 && nMe
e230: 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20 2f  m>0 ) nMem++;  /
e240: 2a 20 53 70 61 63 65 20 66 6f 72 20 61 4d 65 6d  * Space for aMem
e250: 5b 30 5d 20 65 76 65 6e 20 69 66 20 6e 6f 74 20  [0] even if not 
e260: 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  used */..  /* Fi
e270: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
e280: 68 20 72 65 75 73 61 62 6c 65 20 6d 65 6d 6f 72  h reusable memor
e290: 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61  y is available a
e2a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
e2b0: 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72  .  ** opcode arr
e2c0: 61 79 2e 20 20 54 68 69 73 20 65 78 74 72 61 20  ay.  This extra 
e2d0: 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 72  memory will be r
e2e0: 65 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 6f  eallocated for o
e2f0: 74 68 65 72 20 65 6c 65 6d 65 6e 74 73 0a 20 20  ther elements.  
e300: 2a 2a 20 6f 66 20 74 68 65 20 70 72 65 70 61 72  ** of the prepar
e310: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ed statement..  
e320: 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e 44 38 28  */.  n = ROUND8(
e330: 73 69 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e 4f  sizeof(Op)*p->nO
e340: 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p);             
e350: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6f 70 63   /* Bytes of opc
e360: 6f 64 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  ode memory used 
e370: 2a 2f 0a 20 20 78 2e 70 53 70 61 63 65 20 3d 20  */.  x.pSpace = 
e380: 26 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b 6e  &((u8*)p->aOp)[n
e390: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
e3a0: 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70 63 6f 64   /* Unused opcod
e3b0: 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73  e memory */.  as
e3c0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
e3d0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 78 2e 70 53 70  _ALIGNMENT(x.pSp
e3e0: 61 63 65 29 20 29 3b 0a 20 20 78 2e 6e 46 72 65  ace) );.  x.nFre
e3f0: 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 70  e = ROUNDDOWN8(p
e400: 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63  Parse->szOpAlloc
e410: 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74 65 73   - n);  /* Bytes
e420: 20 6f 66 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72   of unused memor
e430: 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 78  y */.  assert( x
e440: 2e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20 61  .nFree>=0 );.  a
e450: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
e460: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70  E_ALIGNMENT(&x.p
e470: 53 70 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20  Space[x.nFree]) 
e480: 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56  );..  resolveP2V
e490: 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b  alues(p, &nArg);
e4a0: 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  .  p->usesStmtJo
e4b0: 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61  urnal = (u8)(pPa
e4c0: 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  rse->isMultiWrit
e4d0: 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79  e && pParse->may
e4e0: 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50  Abort);.  if( pP
e4f0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26  arse->explain &&
e500: 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20   nMem<10 ){.    
e510: 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20  nMem = 10;.  }. 
e520: 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b   p->expired = 0;
e530: 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f  ..  /* Memory fo
e540: 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72  r registers, par
e550: 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c  ameters, cursor,
e560: 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74   etc, is allocat
e570: 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74 77 6f  ed in one or two
e580: 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f  .  ** passes.  O
e590: 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73  n the first pass
e5a0: 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73  , we try to reus
e5b0: 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20  e unused memory 
e5c0: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64  at the .  ** end
e5d0: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
e5e0: 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65  rray.  If we are
e5f0: 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73   unable to satis
e600: 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20  fy all memory.  
e610: 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20  ** requirements 
e620: 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f  by reusing the o
e630: 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c  pcode array tail
e640: 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e  , then the secon
e650: 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c  d.  ** pass will
e660: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 6d   fill in the rem
e670: 61 69 6e 64 65 72 20 75 73 69 6e 67 20 61 20 66  ainder using a f
e680: 72 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  resh memory allo
e690: 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20  cation.  .  **. 
e6a0: 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73   ** This two-pas
e6b0: 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20  s approach that 
e6c0: 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d  reuses as much m
e6d0: 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
e6e0: 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  e from.  ** the 
e6f0: 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72 79 20  leftover memory 
e700: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
e710: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20  e opcode array. 
e720: 20 54 68 69 73 20 63 61 6e 20 73 69 67 6e 69 66   This can signif
e730: 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64  icantly.  ** red
e740: 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  uce the amount o
e750: 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  f memory held by
e760: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
e770: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f  ement..  */.  do
e780: 20 7b 0a 20 20 20 20 78 2e 6e 4e 65 65 64 65 64   {.    x.nNeeded
e790: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65   = 0;.    p->aMe
e7a0: 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  m = allocSpace(&
e7b0: 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d  x, p->aMem, nMem
e7c0: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20  *sizeof(Mem));. 
e7d0: 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c     p->aVar = all
e7e0: 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
e7f0: 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66  Var, nVar*sizeof
e800: 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61  (Mem));.    p->a
e810: 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pArg = allocSpac
e820: 65 28 26 78 2c 20 70 2d 3e 61 70 41 72 67 2c 20  e(&x, p->apArg, 
e830: 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
e840: 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72  ));.    p->apCsr
e850: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
e860: 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72  , p->apCsr, nCur
e870: 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43  sor*sizeof(VdbeC
e880: 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66  ursor*));.#ifdef
e890: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
e8a0: 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
e8b0: 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61     p->anExec = a
e8c0: 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d  llocSpace(&x, p-
e8d0: 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a  >anExec, p->nOp*
e8e0: 73 69 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65  sizeof(i64));.#e
e8f0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 78 2e 6e  ndif.    if( x.n
e900: 4e 65 65 64 65 64 3d 3d 30 20 29 20 62 72 65 61  Needed==0 ) brea
e910: 6b 3b 0a 20 20 20 20 78 2e 70 53 70 61 63 65 20  k;.    x.pSpace 
e920: 3d 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c  = p->pFree = sql
e930: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
e940: 4e 28 64 62 2c 20 78 2e 6e 4e 65 65 64 65 64 29  N(db, x.nNeeded)
e950: 3b 0a 20 20 20 20 78 2e 6e 46 72 65 65 20 3d 20  ;.    x.nFree = 
e960: 78 2e 6e 4e 65 65 64 65 64 3b 0a 20 20 7d 77 68  x.nNeeded;.  }wh
e970: 69 6c 65 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ile( !db->malloc
e980: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e  Failed );..  p->
e990: 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e  nzVar = pParse->
e9a0: 6e 7a 56 61 72 3b 0a 20 20 70 2d 3e 61 7a 56 61  nzVar;.  p->azVa
e9b0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  r = pParse->azVa
e9c0: 72 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56  r;.  pParse->nzV
e9d0: 61 72 20 3d 20 20 30 3b 0a 20 20 70 50 61 72 73  ar =  0;.  pPars
e9e0: 65 2d 3e 61 7a 56 61 72 20 3d 20 30 3b 0a 20 20  e->azVar = 0;.  
e9f0: 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61  p->explain = pPa
ea00: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20  rse->explain;.  
ea10: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
ea20: 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  iled ){.    p->n
ea30: 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Var = 0;.    p->
ea40: 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  nCursor = 0;.   
ea50: 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20   p->nMem = 0;.  
ea60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 43  }else{.    p->nC
ea70: 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b  ursor = nCursor;
ea80: 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28  .    p->nVar = (
ea90: 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20  ynVar)nVar;.    
eaa0: 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e  initMemArray(p->
eab0: 61 56 61 72 2c 20 6e 56 61 72 2c 20 64 62 2c 20  aVar, nVar, db, 
eac0: 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 70  MEM_Null);.    p
ead0: 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20  ->nMem = nMem;. 
eae0: 20 20 20 69 6e 69 74 4d 65 6d 41 72 72 61 79 28     initMemArray(
eaf0: 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2c 20 64  p->aMem, nMem, d
eb00: 62 2c 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64  b, MEM_Undefined
eb10: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  );.    memset(p-
eb20: 3e 61 70 43 73 72 2c 20 30 2c 20 6e 43 75 72 73  >apCsr, 0, nCurs
eb30: 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
eb40: 72 73 6f 72 2a 29 29 3b 0a 23 69 66 64 65 66 20  rsor*));.#ifdef 
eb50: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
eb60: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
eb70: 20 20 6d 65 6d 73 65 74 28 70 2d 3e 61 6e 45 78    memset(p->anEx
eb80: 65 63 2c 20 30 2c 20 70 2d 3e 6e 4f 70 2a 73 69  ec, 0, p->nOp*si
eb90: 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64  zeof(i64));.#end
eba0: 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
ebb0: 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d  VdbeRewind(p);.}
ebc0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
ebd0: 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
ebe0: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
ebf0: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
ec00: 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e  ursor .** happen
ec10: 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  s to hold..*/.vo
ec20: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
ec30: 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
ec40: 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43  , VdbeCursor *pC
ec50: 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
ec60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
ec70: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
ec80: 78 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 43 78  x->pBt==0 || pCx
ec90: 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
eca0: 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 73  YPE_BTREE );.  s
ecb0: 77 69 74 63 68 28 20 70 43 78 2d 3e 65 43 75 72  witch( pCx->eCur
ecc0: 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Type ){.    case
ecd0: 20 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52 3a   CURTYPE_SORTER:
ece0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
ecf0: 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28  VdbeSorterClose(
ed00: 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 20  p->db, pCx);.   
ed10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ed20: 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45      case CURTYPE
ed30: 5f 42 54 52 45 45 3a 20 7b 0a 20 20 20 20 20 20  _BTREE: {.      
ed40: 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a  if( pCx->pBt ){.
ed50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
ed60: 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70  treeClose(pCx->p
ed70: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  Bt);.        /* 
ed80: 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  The pCx->pCursor
ed90: 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61   will be close a
eda0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66  utomatically, if
edb0: 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20   it exists, by. 
edc0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61         ** the ca
edd0: 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20  ll above. */.   
ede0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
edf0: 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 75    assert( pCx->u
ee00: 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  c.pCursor!=0 );.
ee10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
ee20: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
ee30: 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  pCx->uc.pCursor)
ee40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ee50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
ee60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ee70: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
ee80: 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 56    case CURTYPE_V
ee90: 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TAB: {.      sql
eea0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
eeb0: 20 2a 70 56 43 75 72 20 3d 20 70 43 78 2d 3e 75   *pVCur = pCx->u
eec0: 63 2e 70 56 43 75 72 3b 0a 20 20 20 20 20 20 63  c.pVCur;.      c
eed0: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64  onst sqlite3_mod
eee0: 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70  ule *pModule = p
eef0: 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f  VCur->pVtab->pMo
ef00: 64 75 6c 65 3b 0a 20 20 20 20 20 20 61 73 73 65  dule;.      asse
ef10: 72 74 28 20 70 56 43 75 72 2d 3e 70 56 74 61 62  rt( pVCur->pVtab
ef20: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
ef30: 20 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e    pVCur->pVtab->
ef40: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 70 4d  nRef--;.      pM
ef50: 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56  odule->xClose(pV
ef60: 43 75 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Cur);.      brea
ef70: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
ef80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
ef90: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 69  se all cursors i
efa0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
efb0: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ame..*/.static v
efc0: 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f 72 73  oid closeCursors
efd0: 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a 70 29  InFrame(Vdbe *p)
efe0: 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  {.  if( p->apCsr
eff0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
f000: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
f010: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
f020: 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f 72        VdbeCursor
f030: 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b   *pC = p->apCsr[
f040: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  i];.      if( pC
f050: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f060: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
f070: 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20  r(p, pC);.      
f080: 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20    p->apCsr[i] = 
f090: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
f0a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
f0b0: 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 74  py the values st
f0c0: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 65  ored in the Vdbe
f0d0: 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 20  Frame structure 
f0e0: 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 69  to its Vdbe. Thi
f0f0: 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f  s.** is used, fo
f100: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
f110: 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 72  a trigger sub-pr
f120: 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20  ogram is halted 
f130: 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f  to restore.** co
f140: 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69  ntrol to the mai
f150: 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e  n program..*/.in
f160: 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  t sqlite3VdbeFra
f170: 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 72  meRestore(VdbeFr
f180: 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20  ame *pFrame){.  
f190: 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65  Vdbe *v = pFrame
f1a0: 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73  ->v;.  closeCurs
f1b0: 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b 0a 23  orsInFrame(v);.#
f1c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f1d0: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
f1e0: 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20  TUS.  v->anExec 
f1f0: 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63  = pFrame->anExec
f200: 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61 4f  ;.#endif.  v->aO
f210: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b  p = pFrame->aOp;
f220: 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61  .  v->nOp = pFra
f230: 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d  me->nOp;.  v->aM
f240: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65  em = pFrame->aMe
f250: 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70  m;.  v->nMem = p
f260: 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76  Frame->nMem;.  v
f270: 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65  ->apCsr = pFrame
f280: 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43  ->apCsr;.  v->nC
f290: 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e  ursor = pFrame->
f2a0: 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62  nCursor;.  v->db
f2b0: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46  ->lastRowid = pF
f2c0: 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b  rame->lastRowid;
f2d0: 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  v->nChange = 
f2e0: 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b  pFrame->nChange;
f2f0: 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67  .  v->db->nChang
f300: 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43  e = pFrame->nDbC
f310: 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69 74 65 33  hange;.  sqlite3
f320: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
f330: 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e 70 41 75  a(v->db, &v->pAu
f340: 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20  xData, -1, 0);. 
f350: 20 76 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 70   v->pAuxData = p
f360: 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 3b  Frame->pAuxData;
f370: 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44  .  pFrame->pAuxD
f380: 61 74 61 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ata = 0;.  retur
f390: 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a  n pFrame->pc;.}.
f3a0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
f3b0: 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20   cursors..**.** 
f3c0: 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79  Also release any
f3d0: 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20   dynamic memory 
f3e0: 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69  held by the VM i
f3f0: 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20  n the Vdbe.aMem 
f400: 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20  memory .** cell 
f410: 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e  array. This is n
f420: 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20  ecessary as the 
f430: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61  memory cell arra
f440: 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a  y may contain.**
f450: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62   pointers to Vdb
f460: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20  eFrame objects, 
f470: 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72  which may in tur
f480: 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  n contain pointe
f490: 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75  rs to.** open cu
f4a0: 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rsors..*/.static
f4b0: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
f4c0: 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a  rsors(Vdbe *p){.
f4d0: 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20    if( p->pFrame 
f4e0: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
f4f0: 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f   *pFrame;.    fo
f500: 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61  r(pFrame=p->pFra
f510: 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72  me; pFrame->pPar
f520: 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  ent; pFrame=pFra
f530: 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
f540: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
f550: 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65  meRestore(pFrame
f560: 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65  );.    p->pFrame
f570: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72   = 0;.    p->nFr
f580: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ame = 0;.  }.  a
f590: 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65  ssert( p->nFrame
f5a0: 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75  ==0 );.  closeCu
f5b0: 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70 29 3b  rsorsInFrame(p);
f5c0: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
f5d0: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
f5e0: 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 70  Array(p->aMem, p
f5f0: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77  ->nMem);.  }.  w
f600: 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61  hile( p->pDelFra
f610: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
f620: 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70  ame *pDel = p->p
f630: 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d  DelFrame;.    p-
f640: 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65  >pDelFrame = pDe
f650: 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20  l->pParent;.    
f660: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
f670: 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20  Delete(pDel);.  
f680: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  }..  /* Delete a
f690: 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63  ny auxdata alloc
f6a0: 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74  ations made by t
f6b0: 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70  he VM */.  if( p
f6c0: 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73 71 6c  ->pAuxData ) sql
f6d0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
f6e0: 78 44 61 74 61 28 70 2d 3e 64 62 2c 20 26 70 2d  xData(p->db, &p-
f6f0: 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30  >pAuxData, -1, 0
f700: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
f710: 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d  pAuxData==0 );.}
f720: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
f730: 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 61 20   the VM after a 
f740: 73 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73  single run..*/.s
f750: 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e  tatic void Clean
f760: 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  up(Vdbe *p){.  s
f770: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
f780: 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  db;..#ifdef SQLI
f790: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78  TE_DEBUG.  /* Ex
f7a0: 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73  ecute assert() s
f7b0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
f7c0: 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62  ure that the Vdb
f7d0: 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20  e.apCsr[] and . 
f7e0: 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20   ** Vdbe.aMem[] 
f7f0: 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65  arrays have alre
f800: 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64  ady been cleaned
f810: 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69   up.  */.  int i
f820: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  ;.  if( p->apCsr
f830: 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d   ) for(i=0; i<p-
f840: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61  >nCursor; i++) a
f850: 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b  ssert( p->apCsr[
f860: 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  i]==0 );.  if( p
f870: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f  ->aMem ){.    fo
f880: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d  r(i=0; i<p->nMem
f890: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
f8a0: 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d  ->aMem[i].flags=
f8b0: 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29  =MEM_Undefined )
f8c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
f8d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f8e0: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
f8f0: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
f900: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
f910: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
f920: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
f930: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
f940: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
f950: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
f960: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
f970: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
f980: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
f990: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
f9a0: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
f9b0: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
f9c0: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
f9d0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
f9e0: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
f9f0: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
fa00: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
fa10: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
fa20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
fa30: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
fa40: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
fa50: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
fa60: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
fa70: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
fa80: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65  = p->db;..  rele
fa90: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
faa0: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
fab0: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
fac0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
fad0: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
fae0: 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43  me);.  n = nResC
faf0: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b  olumn*COLNAME_N;
fb00: 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  .  p->nResColumn
fb10: 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75   = (u16)nResColu
fb20: 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d  mn;.  p->aColNam
fb30: 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28  e = pColName = (
fb40: 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
fb50: 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
fb60: 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20  zeof(Mem)*n );. 
fb70: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65   if( p->aColName
fb80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
fb90: 69 6e 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e  initMemArray(p->
fba0: 61 43 6f 6c 4e 61 6d 65 2c 20 6e 2c 20 70 2d 3e  aColName, n, p->
fbb0: 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d  db, MEM_Null);.}
fbc0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
fbd0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
fbe0: 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
fbf0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
fc00: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
fc10: 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
fc20: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
fc30: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
fc40: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
fc50: 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
fc60: 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
fc70: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
fc80: 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
fc90: 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61  * The final para
fca0: 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73  meter, xDel, mus
fcb0: 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49  t be one of SQLI
fcc0: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49  TE_DYNAMIC, SQLI
fcd0: 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20  TE_STATIC.** or 
fce0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
fcf0: 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54  . If it is SQLIT
fd00: 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  E_DYNAMIC, then 
fd10: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
fd20: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d  ed.** to by zNam
fd30: 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  e will be freed 
fd40: 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  by sqlite3DbFree
fd50: 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
fd60: 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a   is destroyed..*
fd70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
fd80: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56  eSetColName(.  V
fd90: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdb0: 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f  /* Vdbe being co
fdc0: 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e  nfigured */.  in
fdd0: 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fdf0: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
fe00: 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20  n zName applies 
fe10: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c  to */.  int var,
fe20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
fe40: 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a  of the COLNAME_*
fe50: 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20   constants */.  
fe60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
fe70: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
fe80: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
fe90: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
fea0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20   name */.  void 
feb0: 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20  (*xDel)(void*)  
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
fed0: 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
fee0: 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e   strategy for zN
fef0: 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ame */.){.  int 
ff00: 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  rc;.  Mem *pColN
ff10: 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ame;.  assert( i
ff20: 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  dx<p->nResColumn
ff30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61   );.  assert( va
ff40: 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20  r<COLNAME_N );. 
ff50: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
ff60: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
ff70: 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c  assert( !zName |
ff80: 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44  | xDel!=SQLITE_D
ff90: 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65  YNAMIC );.    re
ffa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
ffb0: 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  M_BKPT;.  }.  as
ffc0: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
ffd0: 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
ffe0: 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
fff0: 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52  me[idx+var*p->nR
10000 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63  esColumn]);.  rc
10010 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
10020 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
10030 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
10040 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b  ITE_UTF8, xDel);
10050 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30  .  assert( rc!=0
10060 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70   || !zName || (p
10070 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d  ColName->flags&M
10080 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20  EM_Term)!=0 );. 
10090 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
100a0 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77  *.** A read or w
100b0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
100c0 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
100d0 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74  be active on dat
100e0 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
100f0 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  db. If a transac
10100 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
10110 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68  commit it. If th
10120 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74  ere is a.** writ
10130 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70  e-transaction sp
10140 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  anning more than
10150 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
10160 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  le, this routine
10170 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f  .** takes care o
10180 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
10190 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a  rnal trickery..*
101a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
101b0 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  eCommit(sqlite3 
101c0 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
101d0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
101e0 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
101f0 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
10200 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
10210 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
10220 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  on.             
10230 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
10240 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  e candidates for
10250 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
10260 6d 69 74 20 75 73 69 6e 67 20 61 0a 20 20 20 20  mit using a.    
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
10280 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
10290 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
102a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
102b0 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b  needXcommit = 0;
102c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
102d0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
102e0 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73  E.  /* With this
102f0 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33   option, sqlite3
10300 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65  VtabSync() is de
10310 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70  fined to be simp
10320 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  ly .  ** SQLITE_
10330 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75  OK so p is not u
10340 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55  sed. .  */.  UNU
10350 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
10360 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  ;.#endif..  /* B
10370 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
10380 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
10390 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
103a0 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
103b0 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
103c0 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
103d0 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
103e0 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
103f0 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
10400 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
10410 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
10420 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
10430 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
10440 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
10450 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
10460 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
10470 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
10480 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
10490 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
104a0 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70  e3VtabSync(db, p
104b0 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  );..  /* This lo
104c0 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61  op determines (a
104d0 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  ) if the commit 
104e0 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69  hook should be i
104f0 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20  nvoked and.  ** 
10500 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74  (b) how many dat
10510 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65  abase files have
10520 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
10530 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20  sactions, not . 
10540 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   ** including th
10550 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
10560 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e   (b) is importan
10570 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72  t because if mor
10580 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65  e than .  ** one
10590 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
105a0 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  as an open write
105b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
105c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
105d0 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75   ** file is requ
105e0 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d  ired for an atom
105f0 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20  ic commit..  */ 
10600 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
10610 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
10620 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
10630 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
10640 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
10650 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
10660 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
10670 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  t) ){.      /* W
10680 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
10690 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 20 6e  database might n
106a0 65 65 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  eed a master jou
106b0 72 6e 61 6c 20 64 65 70 65 6e 64 73 20 75 70 6f  rnal depends upo
106c0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6a  n.      ** its j
106d0 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 28 61 6d 6f  ournal mode (amo
106e0 6e 67 20 6f 74 68 65 72 20 74 68 69 6e 67 73 29  ng other things)
106f0 2e 20 20 54 68 69 73 20 6d 61 74 72 69 78 20 64  .  This matrix d
10700 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 0a  etermines which.
10710 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
10720 20 6d 6f 64 65 73 20 75 73 65 20 61 20 6d 61 73   modes use a mas
10730 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
10740 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 2a 2f 0a  which do not */.
10750 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
10760 73 74 20 75 38 20 61 4d 4a 4e 65 65 64 65 64 5b  st u8 aMJNeeded[
10770 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ] = {.        /*
10780 20 44 45 4c 45 54 45 20 20 20 2a 2f 20 20 31 2c   DELETE   */  1,
10790 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 45 52 53  .        /* PERS
107a0 49 53 54 20 20 20 2a 2f 20 31 2c 0a 20 20 20 20  IST   */ 1,.    
107b0 20 20 20 20 2f 2a 20 4f 46 46 20 20 20 20 20 20      /* OFF      
107c0 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f   */ 0,.        /
107d0 2a 20 54 52 55 4e 43 41 54 45 20 20 2a 2f 20 31  * TRUNCATE  */ 1
107e0 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d  ,.        /* MEM
107f0 4f 52 59 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20  ORY    */ 0,.   
10800 20 20 20 20 20 2f 2a 20 57 41 4c 20 20 20 20 20       /* WAL     
10810 20 20 2a 2f 20 30 0a 20 20 20 20 20 20 7d 3b 0a    */ 0.      };.
10820 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61        Pager *pPa
10830 67 65 72 3b 20 20 20 2f 2a 20 50 61 67 65 72 20  ger;   /* Pager 
10840 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
10850 70 42 74 20 2a 2f 0a 20 20 20 20 20 20 6e 65 65  pBt */.      nee
10860 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  dXcommit = 1;.  
10870 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10880 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Enter(pBt);.    
10890 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
108a0 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
108b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
108c0 3e 61 44 62 5b 69 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[i].safety_l
108d0 65 76 65 6c 21 3d 50 41 47 45 52 5f 53 59 4e 43  evel!=PAGER_SYNC
108e0 48 52 4f 4e 4f 55 53 5f 4f 46 46 0a 20 20 20 20  HRONOUS_OFF.    
108f0 20 20 20 26 26 20 61 4d 4a 4e 65 65 64 65 64 5b     && aMJNeeded[
10900 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 4a  sqlite3PagerGetJ
10910 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65  ournalMode(pPage
10920 72 29 5d 0a 20 20 20 20 20 20 29 7b 20 0a 20 20  r)].      ){ .  
10930 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 21        assert( i!
10940 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 54  =1 );.        nT
10950 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rans++;.      }.
10960 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10970 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
10980 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
10990 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
109a0 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20  Leave(pBt);.    
109b0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  }.  }.  if( rc!=
109c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
109d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
109e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
109f0 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61  re any write-tra
10a00 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c  nsactions at all
10a10 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d  , invoke the com
10a20 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66  mit hook */.  if
10a30 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26  ( needXcommit &&
10a40 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
10a50 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d  back ){.    rc =
10a60 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
10a70 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74  back(db->pCommit
10a80 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Arg);.    if( rc
10a90 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10aa0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
10ab0 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20  NT_COMMITHOOK;. 
10ac0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
10ad0 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d  he simple case -
10ae0 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
10af0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
10b00 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68  (not counting th
10b10 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61  e.  ** TEMP data
10b20 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e  base) has a tran
10b30 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20  saction active. 
10b40 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
10b50 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
10b60 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a  master-journal..
10b70 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
10b80 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
10b90 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
10ba0 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20  Filename() is a 
10bb0 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a  zero length.  **
10bc0 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e   string, it mean
10bd0 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
10be0 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20  ase is :memory: 
10bf0 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20  or a temp file. 
10c00 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63   In .  ** that c
10c10 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75  ase we do not su
10c20 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c  pport atomic mul
10c30 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c  ti-file commits,
10c40 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a   so use the .  *
10c50 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68  * simple case th
10c60 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  en too..  */.  i
10c70 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
10c80 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72  len30(sqlite3Btr
10c90 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
10ca0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20  ->aDb[0].pBt)). 
10cb0 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20    || nTrans<=1. 
10cc0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
10cd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
10ce0 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
10cf0 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
10d00 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
10d10 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
10d20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
10d30 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
10d40 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
10d50 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
10d60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f      }..    /* Do
10d70 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79   the commit only
10d80 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65   if all database
10d90 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
10da0 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e  omplete phase 1.
10db0 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20   .    ** If one 
10dc0 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d  of the BtreeComm
10dd0 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
10de0 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69  ls fails, this i
10df0 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20  ndicates an.    
10e00 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c  ** IO error whil
10e10 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  e deleting or tr
10e20 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e  uncating a journ
10e30 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75  al file. It is u
10e40 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20  nlikely,.    ** 
10e50 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  but could happen
10e60 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
10e70 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
10e80 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
10e90 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
10ea0 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
10eb0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
10ec0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
10ed0 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
10ee0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
10ef0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
10f00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
10f10 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
10f20 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30  tPhaseTwo(pBt, 0
10f30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10f40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
10f50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10f60 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
10f70 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  t(db);.    }.  }
10f80 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c  ..  /* The compl
10f90 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20  ex case - There 
10fa0 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  is a multi-file 
10fb0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
10fc0 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54  n active..  ** T
10fd0 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d  his requires a m
10fe0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10ff0 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  le to ensure the
11000 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
11010 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61    ** committed a
11020 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  tomically..  */.
11030 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11040 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73  MIT_DISKIO.  els
11050 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  e{.    sqlite3_v
11060 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70  fs *pVfs = db->p
11070 56 66 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Vfs;.    char *z
11080 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a  Master = 0;   /*
11090 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74   File-name for t
110a0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
110b0 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f  l */.    char co
110c0 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d  nst *zMainFile =
110d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
110e0 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
110f0 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71  [0].pBt);.    sq
11100 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
11110 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34  ter = 0;.    i64
11120 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
11130 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e   int res;.    in
11140 74 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30  t retryCount = 0
11150 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46  ;.    int nMainF
11160 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c  ile;..    /* Sel
11170 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ect a master jou
11180 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a  rnal file name *
11190 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20  /.    nMainFile 
111a0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
111b0 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20  0(zMainFile);.  
111c0 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
111d0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
111e0 25 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22  %s-mjXXXXXX9XXz"
111f0 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20  , zMainFile);.  
11200 20 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30    if( zMaster==0
11210 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
11220 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
11230 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20   do {.      u32 
11240 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69  iRandom;.      i
11250 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b  f( retryCount ){
11260 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74  .        if( ret
11270 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20  ryCount>100 ){. 
11280 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11290 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c  _log(SQLITE_FULL
112a0 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73  , "MJ delete: %s
112b0 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ", zMaster);.   
112c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
112d0 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
112e0 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
112f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11300 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74     }else if( ret
11310 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20  ryCount==1 ){.  
11320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
11330 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  log(SQLITE_FULL,
11340 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73   "MJ collide: %s
11350 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ", zMaster);.   
11360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11370 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b       retryCount+
11380 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
11390 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
113a0 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52  of(iRandom), &iR
113b0 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71  andom);.      sq
113c0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
113d0 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69  3, &zMaster[nMai
113e0 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58  nFile], "-mj%06X
113f0 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20  9%02X",.        
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11410 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e         (iRandom>
11420 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20 69 52  >8)&0xffffff, iR
11430 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20  andom&0xff);.   
11440 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65     /* The antipe
11450 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63  nultimate charac
11460 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65  ter of the maste
11470 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
11480 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  ust.      ** be 
11490 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d  "9" to avoid nam
114a0 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65  e collisions whe
114b0 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65  n using 8+3 file
114c0 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  names. */.      
114d0 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b  assert( zMaster[
114e0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
114f0 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27  zMaster)-3]=='9'
11500 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
11510 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61  3FileSuffix3(zMa
11520 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29  inFile, zMaster)
11530 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
11540 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
11550 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
11560 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
11570 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68  , &res);.    }wh
11580 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
11590 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20  OK && res );.   
115a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
115b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  OK ){.      /* O
115c0 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
115d0 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20  ournal. */.     
115e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
115f0 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20  penMalloc(pVfs, 
11600 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65  zMaster, &pMaste
11610 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51  r, .          SQ
11620 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
11630 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
11640 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
11650 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
11660 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f  CLUSIVE|SQLITE_O
11670 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
11680 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  AL, 0.      );. 
11690 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
116a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
116b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
116c0 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
116d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
116e0 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
116f0 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
11700 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  f each database 
11710 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e  file in the tran
11720 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  saction into the
11730 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74   new.    ** mast
11740 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
11750 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
11760 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
11770 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61  t close.    ** a
11780 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  nd delete the ma
11790 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
117a0 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76  e. All the indiv
117b0 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
117c0 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c  les.    ** still
117d0 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20   have 'null' as 
117e0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
117f0 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74  al pointer, so t
11800 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20  hey will roll.  
11810 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65    ** back indepe
11820 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69  ndently if a fai
11830 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20  lure occurs..   
11840 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
11850 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
11860 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
11870 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
11880 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  pBt;.      if( s
11890 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
118a0 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
118b0 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
118c0 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *zFile = sqlite3
118d0 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
118e0 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ame(pBt);.      
118f0 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29    if( zFile==0 )
11900 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
11910 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
11920 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72   TEMP and :memor
11930 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  y: databases */.
11940 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11950 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b    assert( zFile[
11960 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  0]!=0 );.       
11970 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
11980 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46  rite(pMaster, zF
11990 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ile, sqlite3Strl
119a0 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f  en30(zFile)+1, o
119b0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
119c0 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65  offset += sqlite
119d0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
119e0 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +1;.        if( 
119f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11a00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11a10 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
11a20 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
11a30 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
11a40 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
11a50 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
11a60 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11a70 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
11a80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11a90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11aa0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
11ab0 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20  Sync the master 
11ac0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
11ad0 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45   the IOCAP_SEQUE
11ae0 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20  NTIAL device.   
11af0 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20   ** flag is set 
11b00 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  this is not requ
11b10 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
11b20 20 69 66 28 20 30 3d 3d 28 73 71 6c 69 74 65 33   if( 0==(sqlite3
11b30 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
11b40 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29  ristics(pMaster)
11b50 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
11b60 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26  QUENTIAL).     &
11b70 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
11b80 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
11b90 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45  (pMaster, SQLITE
11ba0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20  _SYNC_NORMAL)). 
11bb0 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
11bc0 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
11bd0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
11be0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
11bf0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
11c00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
11c10 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
11c20 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
11c30 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
11c40 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20  /* Sync all the 
11c50 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65  db files involve
11c60 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  d in the transac
11c70 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63  tion. The same c
11c80 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20  all.    ** sets 
11c90 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11ca0 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61  al pointer in ea
11cb0 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ch individual jo
11cc0 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a  urnal. If.    **
11cd0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
11ce0 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65   here, do not de
11cf0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
11d00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
11d10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
11d20 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  he error occurs 
11d30 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74  during the first
11d40 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
11d50 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
11d60 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68  itPhaseOne(), th
11d70 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68  en there is a ch
11d80 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20  ance that the.  
11d90 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
11da0 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nal file will be
11db0 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77   orphaned. But w
11dc0 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20  e cannot delete 
11dd0 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61  it,.    ** in ca
11de0 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  se the master jo
11df0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
11e00 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
11e10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
11e20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20   ** file before 
11e30 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75  the failure occu
11e40 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rred..    */.   
11e50 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
11e60 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
11e70 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
11e80 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
11e90 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
11ea0 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
11eb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
11ec0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
11ed0 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d  PhaseOne(pBt, zM
11ee0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  aster);.      }.
11ef0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
11f00 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
11f10 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
11f20 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  t( rc!=SQLITE_BU
11f30 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  SY );.    if( rc
11f40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11f50 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
11f60 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
11f70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
11f80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11f90 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  Delete the maste
11fa0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
11fb0 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65  This commits the
11fc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66   transaction. Af
11fd0 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67  ter.    ** doing
11fe0 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74   this the direct
11ff0 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67  ory is synced ag
12000 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69  ain before any i
12010 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a  ndividual.    **
12020 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c   transaction fil
12030 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  es are deleted..
12040 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
12050 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
12060 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31  pVfs, zMaster, 1
12070 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
12080 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
12090 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
120a0 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29   0;.    if( rc )
120b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
120c0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
120d0 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64   All files and d
120e0 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20  irectories have 
120f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
12100 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c  ced, so the foll
12110 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c  owing.    ** cal
12120 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
12130 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
12140 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73  () are only clos
12150 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20  ing files and.  
12160 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72    ** deleting or
12170 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72   truncating jour
12180 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69  nals. If somethi
12190 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68  ng goes wrong wh
121a0 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ile.    ** this 
121b0 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20  is happening we 
121c0 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72  don't really car
121d0 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  e. The integrity
121e0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   of the.    ** t
121f0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
12200 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64  ready guaranteed
12210 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79  , but some stray
12220 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73   'cold' journals
12230 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c  .    ** may be l
12240 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74  ying around. Ret
12250 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
12260 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20  code won't help 
12270 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a  matters..    */.
12280 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75      disable_simu
12290 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
122a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  );.    sqlite3Be
122b0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
122c0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
122d0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
122e0 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
122f0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
12300 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
12310 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Bt ){.        sq
12320 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
12330 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29  PhaseTwo(pBt, 1)
12340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12350 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
12360 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
12370 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
12380 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
12390 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
123a0 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a  Commit(db);.  }.
123b0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
123c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54   rc;.}../* .** T
123d0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
123e0 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
123f0 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20  te3.nVdbeActive 
12400 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a  count variable.*
12410 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75  * matches the nu
12420 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69  mber of vdbe's i
12430 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74  n the list sqlit
12440 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72  e3.pVdbe that ar
12450 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61  e.** currently a
12460 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74  ctive. An assert
12470 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65  ion fails if the
12480 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e   two counts do n
12490 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69  ot match..** Thi
124a0 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s is an internal
124b0 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79   self-check only
124c0 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20   - it is not an 
124d0 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73  essential proces
124e0 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a  sing.** step..**
124f0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f  .** This is a no
12500 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73  -op if NDEBUG is
12510 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
12520 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
12530 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74  ic void checkAct
12540 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74  iveVdbeCnt(sqlit
12550 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
12560 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  *p;.  int cnt = 
12570 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20  0;.  int nWrite 
12580 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64  = 0;.  int nRead
12590 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e   = 0;.  p = db->
125a0 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20  pVdbe;.  while( 
125b0 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  p ){.    if( sql
125c0 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28  ite3_stmt_busy((
125d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29  sqlite3_stmt*)p)
125e0 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
125f0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65  .      if( p->re
12600 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69  adOnly==0 ) nWri
12610 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  te++;.      if( 
12620 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e  p->bIsReader ) n
12630 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Read++;.    }.  
12640 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
12650 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e    }.  assert( cn
12660 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t==db->nVdbeActi
12670 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ve );.  assert( 
12680 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62  nWrite==db->nVdb
12690 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65  eWrite );.  asse
126a0 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e  rt( nRead==db->n
126b0 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65  VdbeRead );.}.#e
126c0 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63  lse.#define chec
126d0 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78  kActiveVdbeCnt(x
126e0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
126f0 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73  If the Vdbe pass
12700 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
12710 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20  argument opened 
12720 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  a statement-tran
12730 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73  saction,.** clos
12740 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65  e it now. Argume
12750 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65  nt eOp must be e
12760 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f  ither SAVEPOINT_
12770 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53  ROLLBACK or.** S
12780 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
12790 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
127a0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
127b0 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hen the statemen
127c0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
127d0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
127e0 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50   If eOp is SAVEP
127f0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68  OINT_RELEASE, th
12800 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65  en the .** state
12810 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
12820 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
12830 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
12840 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
12850 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
12860 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
12870 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
12880 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
12890 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
128a0 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
128b0 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65  t(Vdbe *p, int e
128c0 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Op){.  sqlite3 *
128d0 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62  const db = p->db
128e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
128f0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
12900 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69   p->iStatement i
12910 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
12920 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56  ero, then this V
12930 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20  dbe opened a .  
12940 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
12950 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68  nsaction that sh
12960 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68  ould be closed h
12970 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78  ere. The only ex
12980 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  ception.  ** is 
12990 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72  that an IO error
129a0 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72   may have occurr
129b0 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65  ed, causing an e
129c0 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63  mergency rollbac
129d0 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  k..  ** In this 
129e0 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65  case (db->nState
129f0 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68  ment==0), and th
12a00 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
12a10 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o do..  */.  if(
12a20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
12a30 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  && p->iStatement
12a40 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
12a50 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61     const int iSa
12a60 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74  vepoint = p->iSt
12a70 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20  atement-1;..    
12a80 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56  assert( eOp==SAV
12a90 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
12aa0 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  || eOp==SAVEPOIN
12ab0 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20  T_RELEASE);.    
12ac0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
12ad0 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20  tement>0 );.    
12ae0 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74  assert( p->iStat
12af0 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61  ement==(db->nSta
12b00 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65  tement+db->nSave
12b10 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66  point) );..    f
12b20 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
12b30 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
12b40 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
12b50 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65  _OK;.      Btree
12b60 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
12b70 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
12b80 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
12b90 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
12ba0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
12bb0 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
12bc0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
12bd0 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
12be0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
12bf0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
12c00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
12c10 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
12c20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
12c30 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
12c40 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
12c50 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
12c60 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
12c70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12c80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12c90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
12ca0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
12cb0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12cc0 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65  }.    db->nState
12cd0 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69  ment--;.    p->i
12ce0 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a  Statement = 0;..
12cf0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12d00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
12d10 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
12d20 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
12d30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12d40 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
12d50 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  db, SAVEPOINT_RO
12d60 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
12d70 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
12d80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12d90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12da0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
12db0 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
12dc0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
12dd0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
12de0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
12df0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
12e00 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
12e10 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
12e20 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74   back, also rest
12e30 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ore the .    ** 
12e40 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
12e50 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
12e60 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20  aint counter to 
12e70 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64  the value it had
12e80 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   when .    ** th
12e90 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
12ea0 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
12eb0 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
12ec0 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
12ed0 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
12ee0 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
12ef0 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66  ns = p->nStmtDef
12f00 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Cons;.      db->
12f10 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
12f20 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d   = p->nStmtDefIm
12f30 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  mCons;.    }.  }
12f40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12f50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
12f60 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
12f70 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
12f80 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
12f90 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e  database .** han
12fa0 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  dle associated w
12fb0 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65  ith the VM passe
12fc0 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
12fd0 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
12fe0 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49  .** committed. I
12ff0 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
13000 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64  tanding deferred
13010 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
13020 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61  straint.** viola
13030 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51  tions, return SQ
13040 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65  LITE_ERROR. Othe
13050 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
13060 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
13070 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
13080 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61   FK violations a
13090 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
130a0 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
130b0 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74  ITE_ERROR, set t
130c0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
130d0 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f   VM to SQLITE_CO
130e0 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
130f0 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  KEY.** and write
13100 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
13110 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65  e to it. Then re
13120 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
13130 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  R..*/.#ifndef SQ
13140 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
13150 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65  N_KEY.int sqlite
13160 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62  3VdbeCheckFk(Vdb
13170 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72  e *p, int deferr
13180 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ed){.  sqlite3 *
13190 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
131a0 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28  ( (deferred && (
131b0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
131c0 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  s+db->nDeferredI
131d0 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c  mmCons)>0) .   |
131e0 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20  | (!deferred && 
131f0 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
13200 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d  >0) .  ){.    p-
13210 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e  >rc = SQLITE_CON
13220 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
13230 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72  EY;.    p->error
13240 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
13250 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
13260 62 65 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45  beError(p, "FORE
13270 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
13280 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20  nt failed");.   
13290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
132a0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
132b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
132c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
132d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
132e0 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20  lled the when a 
132f0 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61  VDBE tries to ha
13300 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45  lt.  If the VDBE
13310 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61  .** has made cha
13320 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nges and is in a
13330 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20  utocommit mode, 
13340 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73  then commit thos
13350 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49  e.** changes.  I
13360 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  f a rollback is 
13370 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20  needed, then do 
13380 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
13390 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
133a0 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
133b0 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61   to move the sta
133c0 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a  te of a VM from.
133d0 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  ** SQLITE_MAGIC_
133e0 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  RUN to SQLITE_MA
133f0 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73  GIC_HALT.  It is
13400 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20   harmless to.** 
13410 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56  call this on a V
13420 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  M that is in the
13430 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
13440 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  LT state..**.** 
13450 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
13460 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f  code.  If the co
13470 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63  mmit could not c
13480 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
13490 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65  of.** lock conte
134a0 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51  ntion, return SQ
134b0 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53  LITE_BUSY.  If S
134c0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
134d0 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65  turned, it.** me
134e0 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69  ans the close di
134f0 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64  d not happen and
13500 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70   needs to be rep
13510 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eated..*/.int sq
13520 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64  lite3VdbeHalt(Vd
13530 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
13540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
13560 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73  d to store trans
13570 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65  ient return code
13580 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
13590 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
135a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
135b0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67  contains the log
135c0 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  ic that determin
135d0 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e  es if a statemen
135e0 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61  t or.  ** transa
135f0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f  ction will be co
13600 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
13610 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
13620 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65  lt of the.  ** e
13630 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73  xecution of this
13640 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
13650 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  . .  **.  ** If 
13660 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
13670 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75  wing errors occu
13680 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  r:.  **.  **    
13690 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20   SQLITE_NOMEM.  
136a0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f  **     SQLITE_IO
136b0 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ERR.  **     SQL
136c0 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20  ITE_FULL.  **   
136d0 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55    SQLITE_INTERRU
136e0 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  PT.  **.  ** The
136f0 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  n the internal c
13700 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20  ache might have 
13710 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20  been left in an 
13720 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a  inconsistent.  *
13730 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65  * state.  We nee
13740 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  d to rollback th
13750 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
13760 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72  saction, if ther
13770 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f  e is.  ** one, o
13780 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
13790 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
137a0 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d  ere is no statem
137b0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
137c0 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d  .  */..  if( db-
137d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
137e0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
137f0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
13800 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75    }.  closeAllCu
13810 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20  rsors(p);.  if( 
13820 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
13830 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20  AGIC_RUN ){.    
13840 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13850 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74  ;.  }.  checkAct
13860 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
13870 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20  .  /* No commit 
13880 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64  or rollback need
13890 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ed if the progra
138a0 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20  m never started 
138b0 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53  or if the.  ** S
138c0 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65  QL statement doe
138d0 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72  s not read or wr
138e0 69 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ite a database f
138f0 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ile.  */.  if( p
13900 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49  ->pc>=0 && p->bI
13910 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69  sReader ){.    i
13920 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69  nt mrc;   /* Pri
13930 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20  mary error code 
13940 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20  from p->rc */.  
13950 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74    int eStatement
13960 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  Op = 0;.    int 
13970 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20  isSpecialError; 
13980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
13990 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27  t to true if a '
139a0 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a  special' error *
139b0 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61  /..    /* Lock a
139c0 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62  ll btrees used b
139d0 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
139e0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
139f0 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20  beEnter(p);..   
13a00 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e   /* Check for on
13a10 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
13a20 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d   errors */.    m
13a30 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66  rc = p->rc & 0xf
13a40 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c  f;.    isSpecial
13a50 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c  Error = mrc==SQL
13a60 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
13a70 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a90 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49      || mrc==SQLI
13aa0 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20  TE_INTERRUPT || 
13ab0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
13ac0 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63  ;.    if( isSpec
13ad0 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ialError ){.    
13ae0 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
13af0 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20  y was read-only 
13b00 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
13b10 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54  de is SQLITE_INT
13b20 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a  ERRUPT, .      *
13b30 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73  * no rollback is
13b40 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65   necessary. Othe
13b50 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20  rwise, at least 
13b60 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  a savepoint .   
13b70 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
13b80 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64  n must be rolled
13b90 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65   back to restore
13ba0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
13bb0 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   a .      ** con
13bc0 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
13bd0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
13be0 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61   Even if the sta
13bf0 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f  tement is read-o
13c00 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72  nly, it is impor
13c10 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a  tant to perform.
13c20 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65        ** a state
13c30 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74  ment or transact
13c40 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  ion rollback ope
13c50 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
13c60 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f  rror .      ** o
13c70 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 77 72  ccurred while wr
13c80 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
13c90 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61  rnal, sub-journa
13ca0 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20  l or database.  
13cb0 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70      ** file as p
13cc0 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74  art of an effort
13cd0 20 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68   to free up cach
13ce0 65 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e  e space (see fun
13cf0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70  ction.      ** p
13d00 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20  agerStress() in 
13d10 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f  pager.c), the ro
13d20 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72  llback is requir
13d30 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20  ed to restore . 
13d40 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65       ** the page
13d50 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e  r to a consisten
13d60 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
13d70 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  /.      if( !p->
13d80 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21  readOnly || mrc!
13d90 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
13da0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
13db0 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f   (mrc==SQLITE_NO
13dc0 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
13dd0 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75  TE_FULL) && p->u
13de0 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29  sesStmtJournal )
13df0 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
13e00 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
13e10 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
13e20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
13e30 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
13e40 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c  e forced to roll
13e50 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65   back the active
13e60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65   transaction. Be
13e70 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20  fore doing.     
13e80 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72       ** so, abor
13e90 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74  t any other stat
13ea0 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64  ements this hand
13eb0 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  le currently has
13ec0 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20   active..       
13ed0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
13ee0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
13ef0 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
13f00 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
13f10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13f20 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
13f30 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  db);.          d
13f40 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
13f50 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  1;.          p->
13f60 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
13f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13f80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
13f90 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65  ck for immediate
13fa0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f   foreign key vio
13fb0 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20  lations. */.    
13fc0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
13fd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
13fe0 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
13ff0 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  (p, 0);.    }.  
14000 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
14010 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
14020 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
14030 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
14040 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a  ve writer .    *
14050 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f  * VM, then we do
14060 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74   either a commit
14070 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20   or rollback of 
14080 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
14090 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a  saction. .    **
140a0 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  .    ** Note: Th
140b0 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75  is block also ru
140c0 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65  ns if one of the
140d0 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
140e0 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20  handled .    ** 
140f0 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72  above has occurr
14100 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed. .    */.    
14110 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62  if( !sqlite3Vtab
14120 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20  InSync(db) .    
14130 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   && db->autoComm
14140 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  it .     && db->
14150 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e  nVdbeWrite==(p->
14160 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20  readOnly==0) .  
14170 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
14180 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14190 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
141a0 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
141b0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
141c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
141d0 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
141e0 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20  Fk(p, 1);.      
141f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14200 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
14210 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65   if( NEVER(p->re
14220 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
14230 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14240 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  beLeave(p);.    
14250 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14260 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
14270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14280 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
14290 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
142a0 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  NKEY;.        }e
142b0 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20  lse{ .          
142c0 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  /* The auto-comm
142d0 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
142e0 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
142f0 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  m was successful
14300 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f   .          ** o
14310 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49  r hit an 'OR FAI
14320 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  L' constraint an
14330 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64  d there are no d
14340 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a  eferred foreign.
14350 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79            ** key
14360 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
14370 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e  hold up the tran
14380 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  saction. This me
14390 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
143a0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
143b0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
143c0 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
143d0 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  mmit(db, p);.   
143e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
143f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
14400 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c  SY && p->readOnl
14410 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  y ){.          s
14420 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
14430 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
14440 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
14450 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
14460 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14470 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
14480 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
14490 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
144a0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
144b0 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  TE_OK);.        
144c0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
144d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
144e0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
144f0 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
14500 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
14510 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
14520 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
14530 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
14540 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20  LITE_DeferFKs;. 
14550 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14560 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
14570 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
14580 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
14590 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
145a0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
145b0 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20   SQLITE_OK);.   
145c0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
145d0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
145e0 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
145f0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
14600 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
14610 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
14620 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14630 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
14640 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
14650 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
14660 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
14670 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
14680 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
14690 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
146a0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
146b0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
146c0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
146d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
146e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
146f0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
14700 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
14710 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
14720 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
14730 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
14740 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
14750 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
14760 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
14770 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
14780 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d     /* If eStatem
14790 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  entOp is non-zer
147a0 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d  o, then a statem
147b0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
147c0 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
147d0 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
147e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c  rolled back. Cal
147f0 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  l sqlite3VdbeClo
14800 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f  seStatement() to
14810 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49  .    ** do so. I
14820 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
14830 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
14840 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  r, and the curre
14850 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  nt statement.   
14860 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69   ** error code i
14870 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53  s SQLITE_OK or S
14880 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
14890 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74  , then promote t
148a0 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
148b0 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f  t statement erro
148c0 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20  r code..    */. 
148d0 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
148e0 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20  tOp ){.      rc 
148f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  = sqlite3VdbeClo
14900 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65  seStatement(p, e
14910 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20  StatementOp);.  
14920 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
14930 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
14940 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
14950 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49  ->rc&0xff)==SQLI
14960 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b  TE_CONSTRAINT ){
14970 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
14980 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
14990 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
149a0 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
149b0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72            p->zEr
149c0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
149d0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
149e0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
149f0 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
14a00 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
14a10 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
14a20 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
14a30 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
14a40 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
14a50 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
14a60 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
14a70 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
14a80 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
14a90 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
14aa0 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d  TE and no statem
14ab0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ent transaction.
14ac0 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
14ad0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64  rolled back, upd
14ae0 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
14af0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e   connection chan
14b00 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20  ge-counter. .   
14b10 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63   */.    if( p->c
14b20 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20  hangeCntOn ){.  
14b30 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65      if( eStateme
14b40 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f  ntOp!=SAVEPOINT_
14b50 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
14b60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
14b70 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
14b80 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
14b90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14ba0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
14bb0 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
14bc0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
14bd0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
14be0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
14bf0 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
14c00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
14c10 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ave(p);.  }..  /
14c20 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
14c30 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
14c40 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
14c50 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
14c60 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
14c70 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
14c80 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a  >nVdbeActive--;.
14c90 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
14ca0 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65  Only ) db->nVdbe
14cb0 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28  Write--;.    if(
14cc0 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
14cd0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b  db->nVdbeRead--;
14ce0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
14cf0 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62  >nVdbeActive>=db
14d00 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20  ->nVdbeRead );. 
14d10 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
14d20 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56  VdbeRead>=db->nV
14d30 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20  dbeWrite );.    
14d40 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
14d50 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d  eWrite>=0 );.  }
14d60 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
14d70 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
14d80 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
14d90 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64  Cnt(db);.  if( d
14da0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
14db0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
14dc0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
14dd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
14de0 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
14df0 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72  lag is set to tr
14e00 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63  ue, then any loc
14e10 6b 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c  ks that were hel
14e20 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63  d.  ** by connec
14e30 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77  tion db have now
14e40 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20   been released. 
14e50 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e  Call sqlite3Conn
14e60 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29  ectionUnlocked()
14e70 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65   .  ** to invoke
14e80 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e   any required un
14e90 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
14ea0 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  backs..  */.  if
14eb0 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
14ec0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
14ed0 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
14ee0 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  d(db);.  }..  as
14ef0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
14f00 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61  ctive>0 || db->a
14f10 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
14f20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
14f30 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  0 );.  return (p
14f40 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
14f50 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y ? SQLITE_BUSY 
14f60 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a  : SQLITE_OK);.}.
14f70 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42  ../*.** Each VDB
14f80 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75  E holds the resu
14f90 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  lt of the most r
14fa0 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74  ecent sqlite3_st
14fb0 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20  ep() call.** in 
14fc0 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75  p->rc.  This rou
14fd0 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72  tine sets that r
14fe0 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51  esult back to SQ
14ff0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64  LITE_OK..*/.void
15000 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
15010 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65  tStepResult(Vdbe
15020 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20   *p){.  p->rc = 
15030 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15040 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72  .** Copy the err
15050 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f  or code and erro
15060 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67  r message belong
15070 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20  ing to the VDBE 
15080 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
15090 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
150a0 74 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20  to its database 
150b0 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20  handle (so that 
150c0 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a  they will be .**
150d0 20 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c   returned by cal
150e0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72  ls to sqlite3_er
150f0 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69  rcode() and sqli
15100 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a  te3_errmsg())..*
15110 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
15120 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61  on does not clea
15130 72 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72  r the VDBE error
15140 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65   code or message
15150 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73  , just.** copies
15160 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74   them to the dat
15170 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
15180 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
15190 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64  TransferError(Vd
151a0 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
151b0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
151c0 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
151d0 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73  .  if( p->zErrMs
151e0 67 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65  g ){.    db->bBe
151f0 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20  nignMalloc++;.  
15200 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
15210 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15220 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d    if( db->pErr==
15230 30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73  0 ) db->pErr = s
15240 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64  qlite3ValueNew(d
15250 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
15260 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
15270 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72  Err, -1, p->zErr
15280 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Msg, SQLITE_UTF8
15290 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
152a0 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
152b0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
152c0 29 3b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69  );.    db->bBeni
152d0 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 20 20  gnMalloc--;.    
152e0 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  db->errCode = rc
152f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
15300 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
15310 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
15320 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
15330 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
15340 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  LLOG./*.** If an
15350 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
15360 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65  QLLOG hook is re
15370 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65  gistered and the
15380 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e   VM has been run
15390 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e  , .** invoke it.
153a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
153b0 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
153c0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28  (Vdbe *v){.  if(
153d0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
153e0 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20  nfig.xSqllog && 
153f0 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  v->rc==SQLITE_OK
15400 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76   && v->zSql && v
15410 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63  ->pc>=0 ){.    c
15420 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d  har *zExpanded =
15430 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61   sqlite3VdbeExpa
15440 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c  ndSql(v, v->zSql
15450 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
15460 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ->db->init.busy=
15470 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  =0 );.    if( zE
15480 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20  xpanded ){.     
15490 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
154a0 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20  nfig.xSqllog(.  
154b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
154c0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
154d0 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a  logArg, v->db, z
154e0 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20  Expanded, 1.    
154f0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
15500 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
15510 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20  zExpanded);.    
15520 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
15530 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b  define vdbeInvok
15540 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69  eSqllog(x).#endi
15550 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  f../*.** Clean u
15560 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
15570 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
15580 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
15590 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
155a0 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
155b0 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
155c0 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
155d0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
155e0 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
155f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
15600 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
15610 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
15620 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
15630 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
15640 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
15650 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
15660 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
15670 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
15680 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
15690 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
156a0 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
156b0 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
156c0 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
156d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
156e0 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
156f0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
15700 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
15710 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
15720 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
15730 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
15740 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
15750 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
15760 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
15770 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
15780 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
15790 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
157a0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
157b0 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20  VdbeHalt(p);..  
157c0 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
157d0 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
157e0 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
157f0 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
15800 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
15810 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
15820 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
15830 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
15840 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
15850 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
15860 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
15870 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
15880 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
15890 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
158a0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
158b0 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
158c0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
158d0 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
158e0 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
158f0 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
15900 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65  {.    vdbeInvoke
15910 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73  Sqllog(p);.    s
15920 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
15930 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20  erError(p);.    
15940 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
15950 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
15960 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
15970 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75  0;.    if( p->ru
15980 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65  nOnlyOnce ) p->e
15990 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65  xpired = 1;.  }e
159a0 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
159b0 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
159c0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
159d0 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
159e0 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
159f0 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
15a00 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
15a10 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
15a20 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
15a30 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
15a40 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
15a50 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
15a60 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
15a70 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
15a80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
15a90 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
15aa0 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a  (db, p->rc, p->z
15ab0 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
15ac0 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  0, p->zErrMsg);.
15ad0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15ae0 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
15af0 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
15b00 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
15b10 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
15b20 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
15b30 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
15b40 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
15b50 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
15b60 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
15b70 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
15b80 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
15b90 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
15ba0 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
15bb0 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
15bc0 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
15bd0 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
15be0 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
15bf0 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
15c00 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
15c10 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
15c20 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
15c30 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
15c40 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
15c50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15c60 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
15c70 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
15c80 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20  >zSql ){.       
15c90 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b   char c, pc = 0;
15ca0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
15cb0 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20  (out, "-- ");.  
15cc0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
15cd0 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21  c = p->zSql[i])!
15ce0 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
15cf0 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27      if( pc=='\n'
15d00 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
15d10 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
15d20 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a    putc(c, out);.
15d30 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63            pc = c
15d40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15d50 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27      if( pc!='\n'
15d60 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
15d70 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
15d80 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15d90 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
15da0 20 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b        char zHdr[
15db0 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  100];.        sq
15dc0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
15dd0 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64  izeof(zHdr), zHd
15de0 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25  r, "%6u %12llu %
15df0 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20  8llu ",.        
15e00 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
15e10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
15e20 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
15e30 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
15e40 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
15e50 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
15e60 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
15e70 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
15e80 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
15e90 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20  %s", zHdr);.    
15ea0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
15eb0 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
15ec0 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
15ed0 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
15ee0 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
15ef0 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75  .#endif.  p->iCu
15f00 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20  rrentTime = 0;. 
15f10 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
15f20 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b 0a 20 20  _MAGIC_RESET;.  
15f30 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64  return p->rc & d
15f40 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a  b->errMask;.}. .
15f50 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
15f60 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45  nd delete a VDBE
15f70 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
15f80 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
15f90 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a  eger which is.**
15fa0 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
15fb0 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  .  Write any err
15fc0 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
15fd0 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a  into *pzErrMsg..
15fe0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
15ff0 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20  beFinalize(Vdbe 
16000 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
16010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
16020 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
16030 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e  MAGIC_RUN || p->
16040 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
16050 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63  C_HALT ){.    rc
16060 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
16070 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65  set(p);.    asse
16080 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d  rt( (rc & p->db-
16090 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b  >errMask)==rc );
160a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
160b0 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72  beDelete(p);.  r
160c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
160d0 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
160e0 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e  iOp is less than
160f0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f   zero, then invo
16100 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
16110 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78  r for.** all aux
16120 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e  iliary data poin
16130 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63  ters currently c
16140 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20  ached by the VM 
16150 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65  passed as.** the
16160 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
16170 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f  .**.** Or, if iO
16180 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  p is greater tha
16190 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
161a0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73  ro, then the des
161b0 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e  tructor is.** on
161c0 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74  ly invoked for t
161d0 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64  hose auxiliary d
161e0 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65  ata pointers cre
161f0 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72  ated by the user
16200 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e   .** function in
16210 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f  voked by the OP_
16220 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  Function opcode 
16230 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  at instruction i
16240 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64  Op of .** VM pVd
16250 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65  be, and only the
16260 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  n if:.**.**    *
16270 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
16280 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
16290 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f  er is the 32nd o
162a0 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e  r later (countin
162b0 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c  g.**      from l
162c0 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f  eft to right), o
162d0 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  r.**.**    * the
162e0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
162f0 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d  it in argument m
16300 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68  ask is clear (wh
16310 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  ere the first.**
16320 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70        function p
16330 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70  arameter corresp
16340 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74  onds to bit 0 et
16350 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c.)..*/.void sql
16360 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
16370 78 44 61 74 61 28 73 71 6c 69 74 65 33 20 2a 64  xData(sqlite3 *d
16380 62 2c 20 41 75 78 44 61 74 61 20 2a 2a 70 70 2c  b, AuxData **pp,
16390 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61   int iOp, int ma
163a0 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28 20 2a 70  sk){.  while( *p
163b0 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61  p ){.    AuxData
163c0 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20   *pAux = *pp;.  
163d0 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20    if( (iOp<0).  
163e0 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f 70     || (pAux->iOp
163f0 3d 3d 69 4f 70 20 26 26 20 28 70 41 75 78 2d 3e  ==iOp && (pAux->
16400 69 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73  iArg>31 || !(mas
16410 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41  k & MASKBIT32(pA
16420 75 78 2d 3e 69 41 72 67 29 29 29 29 0a 20 20 20  ux->iArg)))).   
16430 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
16440 73 65 28 20 70 41 75 78 2d 3e 69 41 72 67 3d 3d  se( pAux->iArg==
16450 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  31 );.      if( 
16460 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b  pAux->xDelete ){
16470 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78  .        pAux->x
16480 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75  Delete(pAux->pAu
16490 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
164a0 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e    *pp = pAux->pN
164b0 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
164c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 41 75  e3DbFree(db, pAu
164d0 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
164e0 20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e       pp= &pAux->
164f0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
16500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
16510 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
16520 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
16530 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
16540 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
16550 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20  ,.** except for 
16560 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77  object itself, w
16570 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65  hich is preserve
16580 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  d..**.** The dif
16590 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
165a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
165b0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
165c0 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a  ete() is that.**
165d0 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c   VdbeDelete() al
165e0 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56  so unlinks the V
165f0 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  dbe from the lis
16600 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61  t of VMs associa
16610 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
16620 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
16630 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68  ion and frees th
16640 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e  e object itself.
16650 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16660 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
16670 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
16680 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67  e *p){.  SubProg
16690 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78  ram *pSub, *pNex
166a0 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  t;.  int i;.  as
166b0 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c  sert( p->db==0 |
166c0 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20  | p->db==db );. 
166d0 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
166e0 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
166f0 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
16700 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53  AME_N);.  for(pS
16710 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20  ub=p->pProgram; 
16720 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74  pSub; pSub=pNext
16730 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
16740 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sub->pNext;.    
16750 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
16760 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70  db, pSub->aOp, p
16770 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73  Sub->nOp);.    s
16780 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16790 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 69 66   pSub);.  }.  if
167a0 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
167b0 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20  _MAGIC_INIT ){. 
167c0 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
167d0 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e  ay(p->aVar, p->n
167e0 56 61 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Var);.    for(i=
167f0 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30  p->nzVar-1; i>=0
16800 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62  ; i--) sqlite3Db
16810 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61  Free(db, p->azVa
16820 72 5b 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74  r[i]);.    sqlit
16830 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16840 61 7a 56 61 72 29 3b 0a 20 20 20 20 73 71 6c 69  azVar);.    sqli
16850 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16860 3e 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 76  >pFree);.  }.  v
16870 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
16880 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f  b, p->aOp, p->nO
16890 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  p);.  sqlite3DbF
168a0 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
168b0 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
168c0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71  bFree(db, p->zSq
168d0 6c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  l);.#ifdef SQLIT
168e0 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
168f0 41 4e 53 54 41 54 55 53 0a 20 20 66 6f 72 28 69  ANSTATUS.  for(i
16900 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20  =0; i<p->nScan; 
16910 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
16920 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
16930 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  Scan[i].zName);.
16940 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
16950 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e  ree(db, p->aScan
16960 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
16970 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
16980 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
16990 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
169a0 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
169b0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
169c0 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
169d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
169e0 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
169f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16a00 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
16a10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16a20 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20  ClearObject(db, 
16a30 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p);.  if( p->pPr
16a40 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
16a50 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
16a60 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
16a70 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
16a80 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
16a90 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
16aa0 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
16ab0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
16ac0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
16ad0 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
16ae0 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
16af0 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70  _MAGIC_DEAD;.  p
16b00 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->db = 0;.  sqli
16b10 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
16b20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  ;.}../*.** The c
16b30 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20  ursor "p" has a 
16b40 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65  pending seek ope
16b50 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  ration that has 
16b60 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20  not yet been.** 
16b70 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65  carried out.  Se
16b80 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f  ek the cursor no
16b90 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  w.  If an error 
16ba0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a  occurs, return.*
16bb0 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
16bc0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
16bd0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
16be0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
16bf0 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
16c00 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
16c10 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a  .  int res, rc;.
16c20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
16c30 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ST.  extern int 
16c40 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
16c50 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ount;.#endif.  a
16c60 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72  ssert( p->deferr
16c70 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73  edMoveto );.  as
16c80 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
16c90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
16ca0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
16cb0 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63  PE_BTREE );.  rc
16cc0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
16cd0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d  ovetoUnpacked(p-
16ce0 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20  >uc.pCursor, 0, 
16cf0 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
16d00 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28   0, &res);.  if(
16d10 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
16d20 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20  .  if( res!=0 ) 
16d30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
16d40 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64  RRUPT_BKPT;.#ifd
16d50 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
16d60 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
16d70 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
16d80 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
16d90 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  eto = 0;.  p->ca
16da0 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
16db0 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72  E_STALE;.  retur
16dc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16dd0 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20  /*.** Something 
16de0 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72  has moved cursor
16df0 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63   "p" out of plac
16e00 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f  e.  Maybe the ro
16e10 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e  w it was.** poin
16e20 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74  ted to was delet
16e30 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
16e40 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20  r it.  Or maybe 
16e50 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a  the btree was.**
16e60 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68   rebalanced.  Wh
16e70 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65  atever the cause
16e80 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65  , try to restore
16e90 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63   "p" to the plac
16ea0 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f  e it.** is suppo
16eb0 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69  sed to be pointi
16ec0 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20  ng.  If the row 
16ed0 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
16ee0 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a  from under the.*
16ef0 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68  * cursor, set th
16f00 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
16f10 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  t to a NULL row.
16f20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
16f30 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68  QLITE_NOINLINE h
16f40 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
16f50 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
16f60 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65  .  int isDiffere
16f70 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73  ntRow, rc;.  ass
16f80 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65  ert( p->eCurType
16f90 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
16fa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
16fb0 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
16fc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16fd0 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
16fe0 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  Moved(p->uc.pCur
16ff0 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  sor) );.  rc = s
17000 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
17010 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70  rRestore(p->uc.p
17020 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65  Cursor, &isDiffe
17030 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63  rentRow);.  p->c
17040 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
17050 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20  HE_STALE;.  if( 
17060 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29  isDifferentRow )
17070 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b   p->nullRow = 1;
17080 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17090 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
170a0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
170b0 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  cursor is valid.
170c0 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75    Restore the cu
170d0 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20  rsor.** if need 
170e0 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20  be.  Return any 
170f0 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74  I/O error from t
17100 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61  he restore opera
17110 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
17120 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65  ite3VdbeCursorRe
17130 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72  store(VdbeCursor
17140 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
17150 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
17160 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
17170 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
17180 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
17190 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b  ->uc.pCursor) ){
171a0 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
171b0 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
171c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
171d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
171e0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
171f0 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61   cursor p is rea
17200 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  dy to read or wr
17210 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77  ite the row to w
17220 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c  hich it.** was l
17230 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20  ast positioned. 
17240 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
17250 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20   code if an OOM 
17260 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72  fault or I/O err
17270 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75  or.** prevents u
17280 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69  s from positioni
17290 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
172a0 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73   its correct pos
172b0 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
172c0 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
172d0 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
172e0 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
172f0 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
17300 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
17310 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65  If no move is pe
17320 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20  nding, check to 
17330 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68  see if the row h
17340 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74  as been.** delet
17350 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
17360 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  r the cursor and
17370 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b   if it has, mark
17380 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61   the row as.** a
17390 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a   NULL row..**.**
173a0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
173b0 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
173c0 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  ng to the correc
173d0 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72  t row and that r
173e0 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65  ow has.** not be
173f0 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
17400 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
17410 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20  rsor, then this 
17420 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
17430 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
17440 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
17450 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  to(VdbeCursor **
17460 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b  pp, int *piCol){
17470 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
17480 20 3d 20 2a 70 70 3b 0a 20 20 69 66 28 20 70 2d   = *pp;.  if( p-
17490 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
174a0 50 45 5f 42 54 52 45 45 20 29 7b 0a 20 20 20 20  PE_BTREE ){.    
174b0 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  if( p->deferredM
174c0 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 20 20 69  oveto ){.      i
174d0 6e 74 20 69 4d 61 70 3b 0a 20 20 20 20 20 20 69  nt iMap;.      i
174e0 66 28 20 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26  f( p->aAltMap &&
174f0 20 28 69 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74   (iMap = p->aAlt
17500 4d 61 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30  Map[1+*piCol])>0
17510 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
17520 3d 20 70 2d 3e 70 41 6c 74 43 75 72 73 6f 72 3b  = p->pAltCursor;
17530 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20  .        *piCol 
17540 3d 20 69 4d 61 70 20 2d 20 31 3b 0a 20 20 20 20  = iMap - 1;.    
17550 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17560 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
17570 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
17580 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28  eDeferredMoveto(
17590 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
175a0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
175b0 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
175c0 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  uc.pCursor) ){. 
175d0 20 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64       return hand
175e0 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
175f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17610 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
17620 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
17630 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
17640 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
17650 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
17660 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
17670 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17680 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
17690 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
176a0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
176b0 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
176c0 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
176d0 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
176e0 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
176f0 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
17700 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
17710 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
17720 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
17730 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
17740 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
17750 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
17760 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
17770 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
17780 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
17790 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
177a0 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
177b0 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
177c0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
177d0 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
177e0 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
177f0 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
17800 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
17810 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
17820 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
17830 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
17840 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
17850 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
17860 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
17870 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
17880 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
17890 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
178a0 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
178b0 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
178c0 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
178d0 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
178e0 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61  data blob separa
178f0 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
17900 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
17910 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
17920 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
17930 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
17940 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
17950 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
17960 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
17970 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
17980 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
17990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
179a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
179b0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
179c0 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
179d0 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
179e0 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
179f0 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
17a00 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
17a10 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
17a20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
17a30 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
17a40 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
17a50 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
17a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a70 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
17a80 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17a90 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
17aa0 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
17ab0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17ac0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ae0 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
17af0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
17b00 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
17b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
17b20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
17b30 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
17b40 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
17b50 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
17b60 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
17b70 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
17b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
17b90 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
17ba0 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
17bb0 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
17bd0 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
17be0 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
17bf0 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c10 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
17c20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
17c30 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
17c40 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
17c50 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
17c60 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
17c70 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
17c80 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
17c90 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
17ca0 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
17cb0 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
17cc0 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
17cd0 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
17ce0 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
17cf0 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
17d00 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
17d10 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
17d20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
17d30 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
17d40 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
17d50 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
17d60 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
17d70 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
17d80 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e  ormat, u32 *pLen
17d90 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
17da0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
17db0 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74  u32 n;..  assert
17dc0 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69  ( pLen!=0 );.  i
17dd0 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
17de0 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  l ){.    *pLen =
17df0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   0;.    return 0
17e00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
17e10 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  s&MEM_Int ){.   
17e20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
17e30 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c  hether to use 1,
17e40 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79   2, 4, 6 or 8 by
17e50 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69  tes. */.#   defi
17e60 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28  ne MAX_6BYTE (((
17e70 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29  (i64)0x00008000)
17e80 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34  <<32)-1).    i64
17e90 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   i = pMem->u.i;.
17ea0 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69      u64 u;.    i
17eb0 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
17ec0 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73  u = ~i;.    }els
17ed0 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a  e{.      u = i;.
17ee0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c      }.    if( u<
17ef0 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20 69 66  =127 ){.      if
17f00 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69  ( (i&1)==i && fi
17f10 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
17f20 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20          *pLen = 
17f30 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
17f40 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20 20 20  n 8+(u32)u;.    
17f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17f60 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20 20 20   *pLen = 1;.    
17f70 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
17f80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
17f90 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 7b 20  if( u<=32767 ){ 
17fa0 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74 75 72  *pLen = 2; retur
17fb0 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 2; }.    if( u
17fc0 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a 70 4c  <=8388607 ){ *pL
17fd0 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e 20 33  en = 3; return 3
17fe0 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 32  ; }.    if( u<=2
17ff0 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a 70 4c  147483647 ){ *pL
18000 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e 20 34  en = 4; return 4
18010 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d  ; }.    if( u<=M
18020 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70 4c 65  AX_6BYTE ){ *pLe
18030 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20 35 3b  n = 6; return 5;
18040 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38   }.    *pLen = 8
18050 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
18060 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
18070 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
18080 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72  *pLen = 8;.    r
18090 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
180a0 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
180b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
180c0 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
180d0 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61  MEM_Blob) );.  a
180e0 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d  ssert( pMem->n>=
180f0 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29  0 );.  n = (u32)
18100 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66  pMem->n;.  if( f
18110 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
18120 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d  ){.    n += pMem
18130 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20  ->u.nZero;.  }. 
18140 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72 65   *pLen = n;.  re
18150 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32  turn ((n*2) + 12
18160 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53   + ((flags&MEM_S
18170 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a  tr)!=0));.}../*.
18180 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66 6f 72  ** The sizes for
18190 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 6c 65   serial types le
181a0 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73  ss than 128.*/.s
181b0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 73  tatic const u8 s
181c0 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
181d0 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  izes[] = {.     
181e0 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20 20 32     /*  0   1   2
181f0 20 20 20 33 20 20 20 34 20 20 20 35 20 20 20 36     3   4   5   6
18200 20 20 20 37 20 20 20 38 20 20 20 39 20 2a 2f 20     7   8   9 */ 
18210 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30    ./*   0 */   0
18220 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34  ,  1,  2,  3,  4
18230 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20 20 30  ,  6,  8,  8,  0
18240 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20  ,  0,./*  10 */ 
18250 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
18260 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c    1,  1,  2,  2,
18270 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20    3,  3,./*  20 
18280 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35 2c 20  */   4,  4,  5, 
18290 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37 2c 20   5,  6,  6,  7, 
182a0 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20   7,  8,  8,./*  
182b0 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31  30 */   9,  9, 1
182c0 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c 20 31  0, 10, 11, 11, 1
182d0 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f  2, 12, 13, 13,./
182e0 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20 31 34  *  40 */  14, 14
182f0 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20 31 36  , 15, 15, 16, 16
18300 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20 31 38  , 17, 17, 18, 18
18310 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c  ,./*  50 */  19,
18320 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c   19, 20, 20, 21,
18330 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c   21, 22, 22, 23,
18340 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20   23,./*  60 */  
18350 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35 2c 20  24, 24, 25, 25, 
18360 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37 2c 20  26, 26, 27, 27, 
18370 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a  28, 28,./*  70 *
18380 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c 20 33  /  29, 29, 30, 3
18390 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c 20 33  0, 31, 31, 32, 3
183a0 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38  2, 33, 33,./*  8
183b0 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20 33 35  0 */  34, 34, 35
183c0 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20 33 37  , 35, 36, 36, 37
183d0 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a  , 37, 38, 38,./*
183e0 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c    90 */  39, 39,
183f0 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c   40, 40, 41, 41,
18400 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c   42, 42, 43, 43,
18410 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34 2c 20  ./* 100 */  44, 
18420 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36 2c 20  44, 45, 45, 46, 
18430 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38 2c 20  46, 47, 47, 48, 
18440 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34  48,./* 110 */  4
18450 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c 20 35  9, 49, 50, 50, 5
18460 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c 20 35  1, 51, 52, 52, 5
18470 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f  3, 53,./* 120 */
18480 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20 35 35    54, 54, 55, 55
18490 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20 35 37  , 56, 56, 57, 57
184a0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .};../*.** Retur
184b0 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
184c0 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
184d0 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
184e0 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
184f0 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
18500 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
18510 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
18520 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
18530 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a  al_type>=128 ){.
18540 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
18550 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
18560 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
18570 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
18580 31 32 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  12 .            
18590 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  || sqlite3SmallT
185a0 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
185b0 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74  type]==(serial_t
185c0 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20  ype - 12)/2 );. 
185d0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
185e0 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
185f0 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
18600 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33 56 64  }.}.u8 sqlite3Vd
18610 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54  beOneByteSerialT
18620 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69 61 6c  ypeLen(u8 serial
18630 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  _type){.  assert
18640 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
18650 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  8 );.  return sq
18660 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
18670 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
18680 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ;  .}../*.** If 
18690 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63  we are on an arc
186a0 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d  hitecture with m
186b0 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61  ixed-endian floa
186c0 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20  ting .** points 
186d0 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20  (ex: ARM7) then 
186e0 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34  swap the lower 4
186f0 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20   bytes with the 
18700 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65  .** upper 4 byte
18710 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  s.  Return the r
18720 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  esult..**.** For
18730 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75   most architectu
18740 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e  res, this is a n
18750 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74  o-op..**.** (lat
18760 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f  er):  It is repo
18770 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20  rted to me that 
18780 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  the mixed-endian
18790 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41   problem.** on A
187a0 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20  RM7 is an issue 
187b0 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69  with GCC, not wi
187c0 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70  th the ARM7 chip
187d0 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74  .  It seems.** t
187e0 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f  hat early versio
187f0 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64  ns of GCC stored
18800 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f   the two words o
18810 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c  f a 64-bit.** fl
18820 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67  oat in the wrong
18830 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61   order.  And tha
18840 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  t error has been
18850 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65   propagated.** e
18860 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20  ver since.  The 
18870 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63  blame is not nec
18880 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43  essarily with GC
18890 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43  C, though..** GC
188a0 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73  C might have jus
188b0 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72  t copying the pr
188c0 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69  oblem from a pri
188d0 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20  or compiler..** 
188e0 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74  I am also told t
188f0 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f  hat newer versio
18900 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66  ns of GCC that f
18910 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e  ollow a differen
18920 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65  t.** ABI get the
18930 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68   byte order righ
18940 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70  t..**.** Develop
18950 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65  ers using SQLite
18960 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75   on an ARM7 shou
18970 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72  ld compile and r
18980 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c  un their.** appl
18990 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44  ication using -D
189a0 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61  SQLITE_DEBUG=1 a
189b0 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57  t least once.  W
189c0 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61  ith DEBUG.** ena
189d0 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72  bled, some asser
189e0 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e  ts below will en
189f0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79  sure that the by
18a00 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66  te order of.** f
18a10 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
18a20 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e  lues is correct.
18a30 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d  .**.** (2007-08-
18a40 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56  30)  Frank van V
18a50 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20  ugt has studied 
18a60 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f  this problem clo
18a70 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20  sely.** and has 
18a80 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67  send his finding
18a90 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20  s to the SQLite 
18aa0 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61  developers.  Fra
18ab0 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61  nk.** writes tha
18ac0 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72  t some Linux ker
18ad0 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74  nels offer float
18ae0 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61  ing point hardwa
18af0 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20  re.** emulation 
18b00 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33  that uses only 3
18b10 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20  2-bit mantissas 
18b20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c  instead of a ful
18b30 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73  l .** 48-bits as
18b40 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
18b50 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20   IEEE standard. 
18b60 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a   (This is the.**
18b70 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54   CONFIG_FPE_FAST
18b80 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e  FPE option.)  On
18b90 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66   such systems, f
18ba0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
18bb0 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62   byte swapping b
18bc0 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70  ecomes very comp
18bd0 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f  licated.  To avo
18be0 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20  id problems,.** 
18bf0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79  the necessary by
18c00 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63  te swapping is c
18c10 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67  arried out using
18c20 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
18c30 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  r.** rather than
18c40 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e   a 64-bit float.
18c50 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20    Frank assures 
18c60 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  us that the code
18c70 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66   here.** works f
18c80 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65  or him.  We, the
18c90 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76   developers, hav
18ca0 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65  e no way to inde
18cb0 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72  pendently.** ver
18cc0 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72  ify this, but Fr
18cd0 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f  ank seems to kno
18ce0 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c  w what he is tal
18cf0 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f  king about.** so
18d00 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a   we trust him..*
18d10 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
18d20 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
18d30 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20  IT_FLOAT.static 
18d40 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36  u64 floatSwap(u6
18d50 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b  4 in){.  union {
18d60 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
18d70 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b  u32 i[2];.  } u;
18d80 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72  .  u32 t;..  u.r
18d90 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69   = in;.  t = u.i
18da0 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20  [0];.  u.i[0] = 
18db0 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d  u.i[1];.  u.i[1]
18dc0 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75   = t;.  return u
18dd0 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73  .r;.}.# define s
18de0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
18df0 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61  oat(X)  X = floa
18e00 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23  tSwap(X).#else.#
18e10 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
18e20 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a  dEndianFloat(X).
18e30 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
18e40 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a  ite the serializ
18e50 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72  ed data blob for
18e60 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
18e70 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a  d in pMem into .
18e80 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73  ** buf. It is as
18e90 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
18ea0 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61  aller has alloca
18eb0 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73  ted sufficient s
18ec0 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pace..** Return 
18ed0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
18ee0 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a  tes written..**.
18ef0 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61  ** nBuf is the a
18f00 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c  mount of space l
18f10 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54  eft in buf[].  T
18f20 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
18f30 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20  ponsible.** for 
18f40 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67  allocating enoug
18f50 68 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d  h space to buf[]
18f60 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74   to hold the ent
18f70 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75  ire field, exclu
18f80 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  sive.** of the p
18f90 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74  Mem->u.nZero byt
18fa0 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72  es for a MEM_Zer
18fb0 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52  o value..**.** R
18fc0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
18fd0 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
18fe0 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
18ff0 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
19000 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
19010 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
19020 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
19030 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
19040 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
19050 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
19060 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
19070 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69  []..*/ .u32 sqli
19080 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
19090 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70  (u8 *buf, Mem *p
190a0 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f  Mem, u32 serial_
190b0 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e  type){.  u32 len
190c0 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  ;..  /* Integer 
190d0 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66  and Real */.  if
190e0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37  ( serial_type<=7
190f0 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e   && serial_type>
19100 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a  0 ){.    u64 v;.
19110 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69      u32 i;.    i
19120 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
19130 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  7 ){.      asser
19140 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69  t( sizeof(v)==si
19150 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20  zeof(pMem->u.r) 
19160 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
19170 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20  &v, &pMem->u.r, 
19180 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
19190 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
191a0 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
191b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
191c0 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
191d0 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
191e0 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
191f0 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
19200 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ];.    assert( i
19210 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  >0 );.    do{.  
19220 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28      buf[--i] = (
19230 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
19240 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
19250 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20 20  }while( i );.   
19260 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
19270 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
19280 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
19290 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
192a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
192b0 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
192c0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
192d0 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a  )?pMem->u.nZero:
192e0 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
192f0 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56  == (int)sqlite3V
19300 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
19310 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
19320 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d  .    len = pMem-
19330 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e  >n;.    if( len>
19340 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66 2c 20  0 ) memcpy(buf, 
19350 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
19360 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
19370 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
19380 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
19390 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
193a0 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22  .}../* Input "x"
193b0 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   is a sequence o
193c0 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61  f unsigned chara
193d0 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65  cters that repre
193e0 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e  sent a.** big-en
193f0 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52  dian integer.  R
19400 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61  eturn the equiva
19410 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65  lent native inte
19420 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f  ger.*/.#define O
19430 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  NE_BYTE_INT(x)  
19440 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23    ((i8)(x)[0]).#
19450 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f  define TWO_BYTE_
19460 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28  INT(x)    (256*(
19470 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b  i8)((x)[0])|(x)[
19480 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45  1]).#define THRE
19490 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28  E_BYTE_INT(x)  (
194a0 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30  65536*(i8)((x)[0
194b0 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28  ])|((x)[1]<<8)|(
194c0 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[2]).#define F
194d0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29  OUR_BYTE_UINT(x)
194e0 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c    (((u32)(x)[0]<
194f0 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  <24)|((x)[1]<<16
19500 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
19510 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[3]).#define FO
19520 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28  UR_BYTE_INT(x) (
19530 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78  16777216*(i8)((x
19540 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  )[0])|((x)[1]<<1
19550 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
19560 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  x)[3])../*.** De
19570 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
19580 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
19590 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
195a0 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
195b0 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
195c0 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
195d0 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
195e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
195f0 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
19600 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
19610 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77  mplemented as tw
19620 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  o separate routi
19630 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61  nes for performa
19640 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20  nce..** The few 
19650 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69  cases that requi
19660 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  re local variabl
19670 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75  es are broken ou
19680 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74  t into a separat
19690 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20  e.** routine so 
196a0 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73  that in most cas
196b0 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  es the overhead 
196c0 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74  of moving the st
196d0 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69  ack pointer.** i
196e0 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73  s avoided..*/ .s
196f0 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54 45  tatic u32 SQLITE
19700 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c  _NOINLINE serial
19710 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
19720 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
19730 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
19740 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
19750 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
19760 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
19770 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
19780 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
19790 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
197a0 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
197b0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
197c0 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
197d0 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
197e0 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
197f0 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20  YTE_UINT(buf);. 
19800 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59   u32 y = FOUR_BY
19810 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a  TE_UINT(buf+4);.
19820 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20    x = (x<<32) + 
19830 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  y;.  if( serial_
19840 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f  type==6 ){.    /
19850 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19860 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c  -29851-52272 Val
19870 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
19880 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  an 64-bit.    **
19890 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
198a0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
198b0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
198c0 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d  64*)&x;.    pMem
198d0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
198e0 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  t;.    testcase(
198f0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
19900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
19910 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
19920 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65  7343-49114 Value
19930 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
19940 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20 36   IEEE 754-2008 6
19950 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f  4-bit.    ** flo
19960 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62  ating point numb
19970 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  er. */.#if !defi
19980 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
19990 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
199a0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
199b0 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  NT).    /* Verif
199c0 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
199d0 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
199e0 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
199f0 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79  e same.    ** by
19a00 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
19a10 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
19a20 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
19a30 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a  _FLOAT is.    **
19a40 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
19a50 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
19a60 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
19a70 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
19a80 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a  ** endian..    *
19a90 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
19aa0 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
19ab0 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
19ac0 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  2;.    static co
19ad0 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
19ae0 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20  1.0;.    u64 t2 
19af0 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69  = t1;.    swapMi
19b00 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
19b10 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2);.    assert( 
19b20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
19b30 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
19b40 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
19b50 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
19b60 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
19b70 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
19b80 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
19b90 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70  )==8 );.    swap
19ba0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
19bb0 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (x);.    memcpy(
19bc0 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20  &pMem->u.r, &x, 
19bd0 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
19be0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71  pMem->flags = sq
19bf0 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d  lite3IsNaN(pMem-
19c00 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  >u.r) ? MEM_Null
19c10 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d   : MEM_Real;.  }
19c20 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75  .  return 8;.}.u
19c30 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
19c40 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
19c50 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19c60 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
19c70 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
19c80 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
19c90 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
19ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
19cb0 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
19cc0 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
19cd0 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
19ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
19cf0 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
19d00 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
19d10 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
19d20 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
19d30 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
19d40 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
19d50 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
19d60 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
19d70 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
19d80 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
19d90 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f  0: {  /* Null */
19da0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
19db0 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30  CE-OF: R-24078-0
19dc0 39 33 37 35 20 56 61 6c 75 65 20 69 73 20 61 20  9375 Value is a 
19dd0 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70  NULL. */.      p
19de0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
19df0 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
19e00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19e10 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  se 1: {.      /*
19e20 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19e30 34 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75  44885-25196 Valu
19e40 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77  e is an 8-bit tw
19e50 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20  os-complement.  
19e60 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
19e70 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
19e80 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  .i = ONE_BYTE_IN
19e90 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
19ea0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
19eb0 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
19ec0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
19ed0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
19ee0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
19ef0 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
19f00 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
19f10 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
19f20 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39  DENCE-OF: R-4979
19f30 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69 73  4-35026 Value is
19f40 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36   a big-endian 16
19f50 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
19f60 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
19f70 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
19f80 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f  pMem->u.i = TWO_
19f90 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
19fa0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
19fb0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
19fc0 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
19fd0 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
19fe0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
19ff0 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
1a000 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
1a010 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1a020 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1a030 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56   R-37839-54301 V
1a040 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1a050 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20  dian 24-bit.    
1a060 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1a070 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1a080 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1a090 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
1a0a0 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
1a0b0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1a0c0 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1a0d0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1a0e0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1a0f0 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
1a100 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
1a110 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1a120 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1a130 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34  DENCE-OF: R-0184
1a140 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69 73  9-26079 Value is
1a150 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32   a big-endian 32
1a160 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
1a170 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
1a180 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1a190 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
1a1a0 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1a1b0 23 69 66 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a  #ifdef __HP_cc .
1a1c0 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72        /* Work ar
1a1d0 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65 78 74 65  ound a sign-exte
1a1e0 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20 74 68 65  nsion bug in the
1a1f0 20 48 50 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72   HP compiler for
1a200 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20   HP/UX */.      
1a210 69 66 28 20 62 75 66 5b 30 5d 26 30 78 38 30 20  if( buf[0]&0x80 
1a220 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30  ) pMem->u.i |= 0
1a230 78 66 66 66 66 66 66 66 66 38 30 30 30 30 30 30  xffffffff8000000
1a240 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  0LL;.#endif.    
1a250 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1a260 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
1a270 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1a280 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1a290 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20  turn 4;.    }.  
1a2a0 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
1a2b0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1a2c0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
1a2d0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a2e0 35 30 33 38 35 2d 30 39 36 37 34 20 56 61 6c 75  50385-09674 Valu
1a2f0 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1a300 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 48-bit.      *
1a310 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1a320 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1a330 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1a340 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
1a350 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  uf+2) + (((i64)1
1a360 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
1a370 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
1a380 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1a390 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
1a3a0 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
1a3b0 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
1a3c0 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
1a3d0 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
1a3e0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1a3f0 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
1a400 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
1a410 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
1a420 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65      /* These use
1a430 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
1a440 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20  , so do them in 
1a450 61 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  a separate routi
1a460 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ne.      ** to a
1a470 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d  void having to m
1a480 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f  ove the frame po
1a490 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d  inter in the com
1a4a0 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  mon case */.    
1a4b0 20 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47    return serialG
1a4c0 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79  et(buf,serial_ty
1a4d0 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  pe,pMem);.    }.
1a4e0 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
1a4f0 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
1a500 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
1a510 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
1a520 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1a530 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32 38 39  OF: R-12976-2289
1a540 33 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69  3 Value is the i
1a550 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20  nteger 0. */.   
1a560 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a570 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31 32 31  F: R-18143-12121
1a580 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e   Value is the in
1a590 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20  teger 1. */.    
1a5a0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65    pMem->u.i = se
1a5b0 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20  rial_type-8;.   
1a5c0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1a5d0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1a5e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1a5f0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
1a600 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1a610 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33 31 35  -OF: R-14606-315
1a620 36 34 20 56 61 6c 75 65 20 69 73 20 61 20 42 4c  64 Value is a BL
1a630 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d 31 32  OB that is (N-12
1a640 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20 20 20  )/2 bytes in.   
1a650 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20     ** length..  
1a660 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
1a670 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30 31 34  OF: R-28401-0014
1a680 30 20 56 61 6c 75 65 20 69 73 20 61 20 73 74 72  0 Value is a str
1a690 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78 74 20  ing in the text 
1a6a0 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20  encoding and.   
1a6b0 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62     ** (N-13)/2 b
1a6c0 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
1a6d0 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
1a6e0 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b  const u16 aFlag[
1a6f0 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d  ] = { MEM_Blob|M
1a700 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74  EM_Ephem, MEM_St
1a710 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20  r|MEM_Ephem };. 
1a720 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
1a730 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20  char *)buf;.    
1a740 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72    pMem->n = (ser
1a750 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
1a760 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1a770 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c  s = aFlag[serial
1a780 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20  _type&1];.      
1a790 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a  return pMem->n;.
1a7a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a7b0 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68  rn 0;.}./*.** Th
1a7c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1a7d0 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
1a7e0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
1a7f0 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52  for an UnpackedR
1a800 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
1a810 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  re large enough 
1a820 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20  to be used with 
1a830 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1a840 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20  dUnpack() if.** 
1a850 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1a860 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
1a870 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  to KeyInfo struc
1a880 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a  ture pKeyInfo..*
1a890 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69  *.** The space i
1a8a0 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74  s either allocat
1a8b0 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
1a8c0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72  DbMallocRaw() or
1a8d0 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20   from within.** 
1a8e0 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75  the unaligned bu
1a8f0 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20  ffer passed via 
1a900 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74  the second and t
1a910 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28  hird arguments (
1a920 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74  presumably.** st
1a930 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74  ack space). If t
1a940 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20  he former, then 
1a950 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
1a960 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74  o a pointer that
1a970 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76   should.** be ev
1a980 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62  entually freed b
1a990 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
1a9a0 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
1a9b0 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a  (). Or, if the .
1a9c0 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f  ** allocation co
1a9d0 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70  mes from the pSp
1a9e0 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66  ace/szSpace buff
1a9f0 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73  er, *ppFree is s
1aa00 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65  et to NULL.** be
1aa10 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1aa20 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
1aa30 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
1aa40 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
1aa50 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  */.UnpackedRecor
1aa60 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c  d *sqlite3VdbeAl
1aa70 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
1aa80 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  d(.  KeyInfo *pK
1aa90 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1aaa0 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
1aab0 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72  ion of the recor
1aac0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  d */.  char *pSp
1aad0 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
1aae0 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67         /* Unalig
1aaf0 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61  ned space availa
1ab00 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  ble */.  int szS
1ab10 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
1ab20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1ab30 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20   of pSpace[] in 
1ab40 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
1ab50 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20 20 20  **ppFree        
1ab60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1ab70 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64  T: Caller should
1ab80 20 66 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74   free this point
1ab90 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63  er */.){.  Unpac
1aba0 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20  kedRecord *p;   
1abb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1abc0 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f  packed record to
1abd0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
1abe0 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   nOff;          
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ac00 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65  Increment pSpace
1ac10 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67   by nOff to alig
1ac20 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  n it */.  int nB
1ac30 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
1ac40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1ac50 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
1ac60 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a  uired for *p */.
1ac70 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f  .  /* We want to
1ac80 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74   shift the point
1ac90 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63  er pSpace up suc
1aca0 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62  h that it is 8-b
1acb0 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a  yte aligned..  *
1acc0 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20  * Thus, we need 
1acd0 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76  to calculate a v
1ace0 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77  alue, nOff, betw
1acf0 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20  een 0 and 7, to 
1ad00 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62  shift .  ** it b
1ad10 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73  y.  If pSpace is
1ad20 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20   already 8-byte 
1ad30 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68  aligned, nOff sh
1ad40 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20  ould be zero..  
1ad50 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d  */.  nOff = (8 -
1ad60 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
1ad70 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29  INT(pSpace) & 7)
1ad80 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d  ) & 7;.  nByte =
1ad90 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55   ROUND8(sizeof(U
1ada0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
1adb0 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70  + sizeof(Mem)*(p
1adc0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1add0 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  1);.  if( nByte>
1ade0 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a  szSpace+nOff ){.
1adf0 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
1ae00 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65  dRecord *)sqlite
1ae10 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65  3DbMallocRaw(pKe
1ae20 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65  yInfo->db, nByte
1ae30 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d  );.    *ppFree =
1ae40 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20   (char *)p;.    
1ae50 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
1ae60 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1ae70 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
1ae80 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66  ord*)&pSpace[nOf
1ae90 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20  f];.    *ppFree 
1aea0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61  = 0;.  }..  p->a
1aeb0 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63  Mem = (Mem*)&((c
1aec0 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73  har*)p)[ROUND8(s
1aed0 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
1aee0 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72  cord))];.  asser
1aef0 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
1af00 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1af10 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
1af20 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
1af30 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
1af40 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65  nField + 1;.  re
1af50 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1af60 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
1af70 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
1af80 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
1af90 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  y[], populate th
1afa0 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65  e .** UnpackedRe
1afb0 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
1afc0 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
1afd0 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
1afe0 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  with the.** cont
1aff0 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f  ents of the deco
1b000 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a  ded record..*/ .
1b010 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1b020 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20  RecordUnpack(.  
1b030 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1b040 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o,     /* Inform
1b050 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
1b060 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f  record format */
1b070 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
1b080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1b090 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20  e of the binary 
1b0a0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
1b0b0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1b0c0 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79     /* The binary
1b0d0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70   record */.  Unp
1b0e0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20  ackedRecord *p  
1b0f0 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
1b100 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62  this structure b
1b110 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1b120 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
1b130 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1b140 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
1b150 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
1b160 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33  ;.  int d; .  u3
1b170 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  2 idx;          
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b190 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b   Offset in aKey[
1b1a0 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  ] to read from *
1b1b0 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  /.  u16 u;      
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1d0 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
1b1e0 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
1b1f0 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d    u32 szHdr;.  M
1b200 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d  em *pMem = p->aM
1b210 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c  em;..  p->defaul
1b220 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65  t_rc = 0;.  asse
1b230 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1b240 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29  LIGNMENT(pMem) )
1b250 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
1b260 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
1b270 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b  r);.  d = szHdr;
1b280 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  u = 0;.  whil
1b290 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20  e( idx<szHdr && 
1b2a0 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75  d<=nKey ){.    u
1b2b0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
1b2c0 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
1b2d0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64  arint32(&aKey[id
1b2e0 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  x], serial_type)
1b2f0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
1b300 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1b310 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20  .    pMem->db = 
1b320 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1b330 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73    /* pMem->flags
1b340 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33   = 0; // sqlite3
1b350 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1b360 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f  will set this fo
1b370 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  r us */.    pMem
1b380 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  ->szMalloc = 0;.
1b390 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b      pMem->z = 0;
1b3a0 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65  .    d += sqlite
1b3b0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1b3c0 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f  aKey[d], serial_
1b3d0 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  type, pMem);.   
1b3e0 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28   pMem++;.    if(
1b3f0 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c   (++u)>=p->nFiel
1b400 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  d ) break;.  }. 
1b410 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79   assert( u<=pKey
1b420 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31  Info->nField + 1
1b430 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20   );.  p->nField 
1b440 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  = u;.}..#if SQLI
1b450 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
1b460 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
1b470 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20  pares two index 
1b480 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  or table record 
1b490 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65  keys in the same
1b4a0 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73   way.** as the s
1b4b0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1b4c0 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e  Compare() routin
1b4d0 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65  e. Unlike VdbeRe
1b4e0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a  cordCompare(),.*
1b4f0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1b500 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64  deserializes and
1b510 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73   compares values
1b520 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71   using the.** sq
1b530 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1b540 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  et() and sqlite3
1b550 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e  MemCompare() fun
1b560 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73  ctions. It is us
1b570 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  ed.** in assert(
1b580 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
1b590 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
1b5a0 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69  optimized code i
1b5b0 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  n.** sqlite3Vdbe
1b5c0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1b5d0 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20  returns results 
1b5e0 77 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70  with these two p
1b5f0 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a  rimitives..**.**
1b600 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1b610 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  the result of co
1b620 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69  mparison is equi
1b630 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65  valent to desire
1b640 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75  dResult..** Retu
1b650 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 72  rn false if ther
1b660 65 20 69 73 20 61 20 64 69 73 61 67 72 65 65 6d  e is a disagreem
1b670 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
1b680 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1b690 70 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74  pareDebug(.  int
1b6a0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1b6b0 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
1b6c0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  ft key */.  cons
1b6d0 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  t UnpackedRecord
1b6e0 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67   *pPKey2, /* Rig
1b6f0 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1b700 64 65 73 69 72 65 64 52 65 73 75 6c 74 20 20 20  desiredResult   
1b710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
1b720 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29  rect answer */.)
1b730 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20  {.  u32 d1;     
1b740 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1b750 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1b760 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
1b770 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  t */.  u32 idx1;
1b780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1b790 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1b7a0 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65  of next header e
1b7b0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
1b7c0 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f  szHdr1;        /
1b7d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1b7e0 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
1b7f0 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
1b800 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  t rc = 0;.  cons
1b810 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1b820 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
1b830 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1b840 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f  pKey1;.  KeyInfo
1b850 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65   *pKeyInfo;.  Me
1b860 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49  m mem1;..  pKeyI
1b870 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
1b880 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b  eyInfo;.  if( pK
1b890 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20  eyInfo->db==0 ) 
1b8a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31  return 1;.  mem1
1b8b0 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
1b8c0 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20  >enc;.  mem1.db 
1b8d0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1b8e0 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20    /* mem1.flags 
1b8f0 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65  = 0;  // Will be
1b900 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
1b910 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1b920 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f  lGet() */.  VVA_
1b930 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  ONLY( mem1.szMal
1b940 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
1b950 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
1b960 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1b970 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c   */..  /* Compil
1b980 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e  ers may complain
1b990 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69   that mem1.u.i i
1b9a0 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e  s potentially un
1b9b0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
1b9c0 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69  * We could initi
1b9d0 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f  alize it, as sho
1b9e0 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65  wn here, to sile
1b9f0 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61  nce those compla
1ba00 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69  ints..  ** But i
1ba10 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69  n fact, mem1.u.i
1ba20 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75   will never actu
1ba30 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69  ally be used uni
1ba40 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20  nitialized, and 
1ba50 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  doing .  ** the 
1ba60 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74  unnecessary init
1ba70 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61  ialization has a
1ba80 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61   measurable nega
1ba90 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  tive performance
1baa0 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69  .  ** impact, si
1bab0 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
1bac0 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20   is a very high 
1bad0 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c  runner.  And so,
1bae0 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20   we choose.  ** 
1baf0 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f  to ignore the co
1bb00 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20  mpiler warnings 
1bb10 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76  and leave this v
1bb20 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61  ariable uninitia
1bb30 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a  lized..  */.  /*
1bb40 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20    mem1.u.i = 0; 
1bb50 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20   // not needed, 
1bb60 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20  here to silence 
1bb70 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
1bb80 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20   */.  .  idx1 = 
1bb90 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1bba0 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66  1, szHdr1);.  if
1bbb0 28 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29  ( szHdr1>98307 )
1bbc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1bbd0 4f 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73  ORRUPT;.  d1 = s
1bbe0 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28  zHdr1;.  assert(
1bbf0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1bc00 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
1bc10 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
1bc20 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  eld || CORRUPT_D
1bc30 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1bc40 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1bc50 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
1bc60 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
1bc70 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
1bc80 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
1bc90 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1bca0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
1bcb0 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
1bcc0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
1bcd0 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
1bce0 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
1bcf0 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
1bd00 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
1bd10 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
1bd20 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
1bd30 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65  e1 );..    /* Ve
1bd40 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20  rify that there 
1bd50 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70  is enough key sp
1bd60 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f  ace remaining to
1bd70 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20   avoid.    ** a 
1bd80 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e  buffer overread.
1bd90 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c    The "d1+serial
1bda0 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70  _type1+2" subexp
1bdb0 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  ression will.   
1bdc0 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72   ** always be gr
1bdd0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
1bde0 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e  ual to the amoun
1bdf0 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65  t of required ke
1be00 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  y space..    ** 
1be10 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69  Use that approxi
1be20 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20  mation to avoid 
1be30 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69  the more expensi
1be40 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ve call to.    *
1be50 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
1be60 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20  ialTypeLen() in 
1be70 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
1be80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1be90 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
1bea0 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20  2>(u32)nKey1.   
1beb0 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56    && d1+sqlite3V
1bec0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1bed0 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28  (serial_type1)>(
1bee0 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29  u32)nKey1 .    )
1bef0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
1bf00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74     }..    /* Ext
1bf10 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
1bf20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
1bf30 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
1bf40 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1bf50 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1bf60 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
1bf70 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
1bf80 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
1bf90 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
1bfa0 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
1bfb0 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
1bfc0 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65  y2->aMem[i], pKe
1bfd0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29  yInfo->aColl[i])
1bfe0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
1bff0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1c000 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1c010 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
1c020 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ment below */.  
1c030 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
1c040 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1c050 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c060 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20  -rc;  /* Invert 
1c070 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44  the result for D
1c080 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20  ESC sort order. 
1c090 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
1c0a0 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61   goto debugCompa
1c0b0 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  reEnd;.    }.   
1c0c0 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20   i++;.  }while( 
1c0d0 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
1c0e0 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  <pPKey2->nField 
1c0f0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
1c100 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
1c110 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
1c120 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
1c130 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
1c140 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
1c150 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
1c160 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
1c170 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
1c180 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
1c190 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
1c1a0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1c1b0 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f  ase(&mem1)..  */
1c1c0 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
1c1d0 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  szMalloc==0 );..
1c1e0 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
1c1f0 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
1c200 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
1c210 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
1c220 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
1c230 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
1c240 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
1c250 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  . Return the def
1c260 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
1c270 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ue.  */.  rc = p
1c280 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1c290 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65  c;..debugCompare
1c2a0 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72  End:.  if( desir
1c2b0 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72  edResult==0 && r
1c2c0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
1c2d0 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1c2e0 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29  sult<0 && rc<0 )
1c2f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1c300 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30   desiredResult>0
1c310 20 26 26 20 72 63 3e 30 20 29 20 72 65 74 75 72   && rc>0 ) retur
1c320 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55  n 1;.  if( CORRU
1c330 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31  PT_DB ) return 1
1c340 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
1c350 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1c360 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
1c370 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1c380 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
1c390 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  DEBUG./*.** Coun
1c3a0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1c3b0 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63  fields (a.k.a. c
1c3c0 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72  olumns) in the r
1c3d0 65 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a  ecord given by.*
1c3e0 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68  * pKey,nKey.  Th
1c3f0 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  e verify that th
1c400 69 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73  is count is less
1c410 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1c420 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67  o the.** limit g
1c430 69 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f  iven by pKeyInfo
1c440 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 4b 65 79 49  ->nField + pKeyI
1c450 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a  nfo->nXField..**
1c460 0a 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73  .** If this cons
1c470 74 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61  traint is not sa
1c480 74 69 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e  tisfied, it mean
1c490 73 20 74 68 61 74 20 74 68 65 20 68 69 67 68 2d  s that the high-
1c4a0 73 70 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63  speed.** vdbeRec
1c4b0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
1c4c0 61 6e 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f  and vdbeRecordCo
1c4d0 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f  mpareString() ro
1c4e0 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e  utines will.** n
1c4f0 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
1c500 79 2e 20 20 49 66 20 74 68 69 73 20 61 73 73 65  y.  If this asse
1c510 72 74 28 29 20 65 76 65 72 20 66 69 72 65 73 2c  rt() ever fires,
1c520 20 69 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61   it probably mea
1c530 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b  ns.** that the K
1c540 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f 72  eyInfo.nField or
1c550 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64   KeyInfo.nXField
1c560 20 76 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d   values were com
1c570 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65  puted.** incorre
1c580 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ctly..*/.static 
1c590 76 6f 69 64 20 76 64 62 65 41 73 73 65 72 74 46  void vdbeAssertF
1c5a0 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
1c5b0 69 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65  imits(.  int nKe
1c5c0 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  y, const void *p
1c5d0 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65  Key,   /* The re
1c5e0 63 6f 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a  cord to verify *
1c5f0 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e  / .  const KeyIn
1c600 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20  fo *pKeyInfo    
1c610 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69     /* Compare si
1c620 7a 65 20 77 69 74 68 20 74 68 69 73 20 4b 65 79  ze with this Key
1c630 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Info */.){.  int
1c640 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75   nField = 0;.  u
1c650 33 32 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20  32 szHdr;.  u32 
1c660 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73  idx;.  u32 notUs
1c670 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  ed;.  const unsi
1c680 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
1c690 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1c6a0 64 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20  d char*)pKey;.. 
1c6b0 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20   if( CORRUPT_DB 
1c6c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20  ) return;.  idx 
1c6d0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1c6e0 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73  ey, szHdr);.  as
1c6f0 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b  sert( nKey>=0 );
1c700 0a 20 20 61 73 73 65 72 74 28 20 73 7a 48 64 72  .  assert( szHdr
1c710 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20  <=(u32)nKey );. 
1c720 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64   while( idx<szHd
1c730 72 20 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20  r ){.    idx += 
1c740 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1c750 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a  +idx, notUsed);.
1c760 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20      nField++;.  
1c770 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65  }.  assert( nFie
1c780 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  ld <= pKeyInfo->
1c790 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d  nField+pKeyInfo-
1c7a0 3e 6e 58 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65  >nXField );.}.#e
1c7b0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62  lse.# define vdb
1c7c0 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
1c7d0 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c  tWithinLimits(A,
1c7e0 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  B,C).#endif../*.
1c7f0 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61  ** Both *pMem1 a
1c800 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69  nd *pMem2 contai
1c810 6e 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e  n string values.
1c820 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f   Compare the two
1c830 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67   values.** using
1c840 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1c850 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41  equence pColl. A
1c860 73 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20  s usual, return 
1c870 61 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72  a negative , zer
1c880 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
1c890 20 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31   value if *pMem1
1c8a0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1c8b0 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74  qual to or great
1c8c0 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65  er than .** *pMe
1c8d0 6d 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  m2, respectively
1c8e0 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69  . Similar in spi
1c8f0 72 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70  rit to "rc = (*p
1c900 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29  Mem1) - (*pMem2)
1c910 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ;"..*/.static in
1c920 74 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  t vdbeCompareMem
1c930 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20  String(.  const 
1c940 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f  Mem *pMem1,.  co
1c950 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a  nst Mem *pMem2,.
1c960 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20    const CollSeq 
1c970 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72  *pColl,.  u8 *pr
1c980 63 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20  cErr            
1c990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1c9a0 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73  an OOM occurs, s
1c9b0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
1c9c0 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  EM */.){.  if( p
1c9d0 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c  Mem1->enc==pColl
1c9e0 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20  ->enc ){.    /* 
1c9f0 54 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20  The strings are 
1ca00 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
1ca10 6f 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e  orrect encoding.
1ca20 20 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20    Call the.     
1ca30 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ** comparison fu
1ca40 6e 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20  nction directly 
1ca50 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  */.    return pC
1ca60 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
1ca70 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c  >pUser,pMem1->n,
1ca80 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e  pMem1->z,pMem2->
1ca90 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d  n,pMem2->z);.  }
1caa0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
1cab0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64  ;.    const void
1cac0 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69   *v1, *v2;.    i
1cad0 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d  nt n1, n2;.    M
1cae0 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63  em c1;.    Mem c
1caf0 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  2;.    sqlite3Vd
1cb00 62 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70  beMemInit(&c1, p
1cb10 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75  Mem1->db, MEM_Nu
1cb20 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
1cb30 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c  VdbeMemInit(&c2,
1cb40 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f   pMem1->db, MEM_
1cb50 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Null);.    sqlit
1cb60 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
1cb70 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c  Copy(&c1, pMem1,
1cb80 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
1cb90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1cba0 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20  hallowCopy(&c2, 
1cbb0 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem2, MEM_Ephem
1cbc0 29 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69  );.    v1 = sqli
1cbd0 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
1cbe0 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31  lite3_value*)&c1
1cbf0 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
1cc00 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20     n1 = v1==0 ? 
1cc10 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32  0 : c1.n;.    v2
1cc20 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
1cc30 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ext((sqlite3_val
1cc40 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e  ue*)&c2, pColl->
1cc50 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76  enc);.    n2 = v
1cc60 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b  2==0 ? 0 : c2.n;
1cc70 0a 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d  .    rc = pColl-
1cc80 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
1cc90 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20  er, n1, v1, n2, 
1cca0 76 32 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31  v2);.    if( (v1
1ccb0 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 26 26  ==0 || v2==0) &&
1ccc0 20 70 72 63 45 72 72 20 29 20 2a 70 72 63 45 72   prcErr ) *prcEr
1ccd0 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  r = SQLITE_NOMEM
1cce0 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69 74  _BKPT;.    sqlit
1ccf0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1cd00 28 26 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  (&c1);.    sqlit
1cd10 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1cd20 28 26 63 32 29 3b 0a 20 20 20 20 72 65 74 75 72  (&c2);.    retur
1cd30 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  n rc;.  }.}../*.
1cd40 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 70 42 6c  ** The input pBl
1cd50 6f 62 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ob is guaranteed
1cd60 20 74 6f 20 62 65 20 61 20 42 6c 6f 62 20 74 68   to be a Blob th
1cd70 61 74 20 69 73 20 6e 6f 74 20 6d 61 72 6b 65 64  at is not marked
1cd80 0a 2a 2a 20 77 69 74 68 20 4d 45 4d 5f 5a 65 72  .** with MEM_Zer
1cd90 6f 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  o.  Return true 
1cda0 69 66 20 69 74 20 63 6f 75 6c 64 20 62 65 20 61  if it could be a
1cdb0 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73   zero-blob..*/.s
1cdc0 74 61 74 69 63 20 69 6e 74 20 69 73 41 6c 6c 5a  tatic int isAllZ
1cdd0 65 72 6f 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ero(const char *
1cde0 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
1cdf0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
1ce00 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <n; i++){.    if
1ce10 28 20 7a 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  ( z[i] ) return 
1ce20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1ce30 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  1;.}../*.** Comp
1ce40 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20  are two blobs.  
1ce50 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c  Return negative,
1ce60 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
1ce70 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  ve if the first.
1ce80 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  ** is less than,
1ce90 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
1cea0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73  eater than the s
1ceb0 65 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 69 76  econd, respectiv
1cec0 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62  ely..** If one b
1ced0 6c 6f 62 20 69 73 20 61 20 70 72 65 66 69 78 20  lob is a prefix 
1cee0 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 74 68  of the other, th
1cef0 65 6e 20 74 68 65 20 73 68 6f 72 74 65 72 20 69  en the shorter i
1cf00 73 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f  s the lessor..*/
1cf10 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
1cf20 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69  OINLINE int sqli
1cf30 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63  te3BlobCompare(c
1cf40 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63  onst Mem *pB1, c
1cf50 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a  onst Mem *pB2){.
1cf60 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e    int c;.  int n
1cf70 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e  1 = pB1->n;.  in
1cf80 74 20 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a  t n2 = pB2->n;..
1cf90 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69    /* It is possi
1cfa0 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 42 6c  ble to have a Bl
1cfb0 6f 62 20 76 61 6c 75 65 20 74 68 61 74 20 68 61  ob value that ha
1cfc0 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20  s some non-zero 
1cfd0 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c  content.  ** fol
1cfe0 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 63 6f  lowed by zero co
1cff0 6e 74 65 6e 74 2e 20 20 42 75 74 20 74 68 61 74  ntent.  But that
1d000 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 75 70 20 66   only comes up f
1d010 6f 72 20 42 6c 6f 62 73 20 66 6f 72 6d 65 64 0a  or Blobs formed.
1d020 20 20 2a 2a 20 62 79 20 74 68 65 20 4f 50 5f 4d    ** by the OP_M
1d030 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
1d040 2c 20 61 6e 64 20 73 75 63 68 20 42 6c 6f 62 73  , and such Blobs
1d050 20 6e 65 76 65 72 20 67 65 74 20 70 61 73 73 65   never get passe
1d060 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69  d into.  ** sqli
1d070 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 2e  te3MemCompare().
1d080 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
1d090 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  B1->flags & MEM_
1d0a0 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d  Zero)==0 || n1==
1d0b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
1d0c0 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  pB2->flags & MEM
1d0d0 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d  _Zero)==0 || n2=
1d0e0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 42  =0 );..  if( (pB
1d0f0 31 2d 3e 66 6c 61 67 73 7c 70 42 32 2d 3e 66 6c  1->flags|pB2->fl
1d100 61 67 73 29 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  ags) & MEM_Zero 
1d110 29 7b 0a 20 20 20 20 69 66 28 20 70 42 31 2d 3e  ){.    if( pB1->
1d120 66 6c 61 67 73 20 26 20 70 42 32 2d 3e 66 6c 61  flags & pB2->fla
1d130 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
1d140 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42  .      return pB
1d150 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70 42 32  1->u.nZero - pB2
1d160 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d  ->u.nZero;.    }
1d170 65 6c 73 65 20 69 66 28 20 70 42 31 2d 3e 66 6c  else if( pB1->fl
1d180 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
1d190 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 41  {.      if( !isA
1d1a0 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c 20 70  llZero(pB2->z, p
1d1b0 42 32 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20  B2->n) ) return 
1d1c0 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1d1d0 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20   pB1->u.nZero - 
1d1e0 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n2;.    }else{. 
1d1f0 20 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a       if( !isAllZ
1d200 65 72 6f 28 70 42 31 2d 3e 7a 2c 20 70 42 31 2d  ero(pB1->z, pB1-
1d210 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  >n) ) return +1;
1d220 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 31  .      return n1
1d230 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b   - pB2->u.nZero;
1d240 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 20 3d  .    }.  }.  c =
1d250 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20   memcmp(pB1->z, 
1d260 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20  pB2->z, n1>n2 ? 
1d270 6e 32 20 3a 20 6e 31 29 3b 0a 20 20 69 66 28 20  n2 : n1);.  if( 
1d280 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20  c ) return c;.  
1d290 72 65 74 75 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a  return n1 - n2;.
1d2a0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f  }../*.** Do a co
1d2b0 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e  mparison between
1d2c0 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64   a 64-bit signed
1d2d0 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61 20 36   integer and a 6
1d2e0 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70  4-bit floating-p
1d2f0 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20  oint.** number. 
1d300 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
1d310 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
1d320 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74  ive if the first
1d330 20 28 69 36 34 29 20 69 73 20 6c 65 73 73 20 74   (i64) is less t
1d340 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f  han,.** equal to
1d350 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
1d360 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28 64 6f  n the second (do
1d370 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  uble)..*/.static
1d380 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 74 46   int sqlite3IntF
1d390 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36 34 20  loatCompare(i64 
1d3a0 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20  i, double r){.  
1d3b0 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44  if( sizeof(LONGD
1d3c0 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b  OUBLE_TYPE)>8 ){
1d3d0 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f  .    LONGDOUBLE_
1d3e0 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f  TYPE x = (LONGDO
1d3f0 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20 20  UBLE_TYPE)i;.   
1d400 20 69 66 28 20 78 3c 72 20 29 20 72 65 74 75 72   if( x<r ) retur
1d410 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78 3e  n -1;.    if( x>
1d420 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
1d430 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1d440 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 79 3b  else{.    i64 y;
1d450 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20  .    double s;. 
1d460 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33 33 37     if( r<-922337
1d470 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 30 20  2036854775808.0 
1d480 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1d490 20 69 66 28 20 72 3e 39 32 32 33 33 37 32 30 33   if( r>922337203
1d4a0 36 38 35 34 37 37 35 38 30 37 2e 30 20 29 20 72  6854775807.0 ) r
1d4b0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20  eturn -1;.    y 
1d4c0 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20 69 66  = (i64)r;.    if
1d4d0 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e 20 2d  ( i<y ) return -
1d4e0 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79 20 29  1;.    if( i>y )
1d4f0 7b 0a 20 20 20 20 20 20 69 66 28 20 79 3d 3d 53  {.      if( y==S
1d500 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26 26  MALLEST_INT64 &&
1d510 20 72 3e 30 2e 30 20 29 20 72 65 74 75 72 6e 20   r>0.0 ) return 
1d520 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1d530 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   +1;.    }.    s
1d540 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20   = (double)i;.  
1d550 20 20 69 66 28 20 73 3c 72 20 29 20 72 65 74 75    if( s<r ) retu
1d560 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73  rn -1;.    if( s
1d570 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  >r ) return +1;.
1d580 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1d590 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  }.}../*.** Compa
1d5a0 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f  re the values co
1d5b0 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 74  ntained by the t
1d5c0 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c  wo memory cells,
1d5d0 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65   returning.** ne
1d5e0 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20  gative, zero or 
1d5f0 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d  positive if pMem
1d600 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
1d610 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
1d620 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65  ater.** than pMe
1d630 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65  m2. Sorting orde
1d640 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73  r is NULL's firs
1d650 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e  t, followed by n
1d660 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72 73  umbers (integers
1d670 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73  .** and reals) s
1d680 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c  orted numericall
1d690 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  y, followed by t
1d6a0 65 78 74 20 6f 72 64 65 72 65 64 20 62 79 20 74  ext ordered by t
1d6b0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  he collating.** 
1d6c0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61  sequence pColl a
1d6d0 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27  nd finally blob'
1d6e0 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d  s ordered by mem
1d6f0 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f  cmp()..**.** Two
1d700 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
1d710 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61   considered equa
1d720 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  l by this functi
1d730 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1d740 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e  e3MemCompare(con
1d750 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63  st Mem *pMem1, c
1d760 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c  onst Mem *pMem2,
1d770 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a   const CollSeq *
1d780 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31  pColl){.  int f1
1d790 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62  , f2;.  int comb
1d7a0 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66  ined_flags;..  f
1d7b0 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73  1 = pMem1->flags
1d7c0 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e  ;.  f2 = pMem2->
1d7d0 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65  flags;.  combine
1d7e0 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b  d_flags = f1|f2;
1d7f0 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62  .  assert( (comb
1d800 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d  ined_flags & MEM
1d810 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20  _RowSet)==0 );. 
1d820 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
1d830 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69  ue is NULL, it i
1d840 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
1d850 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76  other. If both v
1d860 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e  alues.  ** are N
1d870 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  ULL, return 0.. 
1d880 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
1d890 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  ed_flags&MEM_Nul
1d8a0 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
1d8b0 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20  (f2&MEM_Null) - 
1d8c0 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  (f1&MEM_Null);. 
1d8d0 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73   }..  /* At leas
1d8e0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f  t one of the two
1d8f0 20 76 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d   values is a num
1d900 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ber.  */.  if( c
1d910 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d  ombined_flags&(M
1d920 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
1d930 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20   ){.    if( (f1 
1d940 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21  & f2 & MEM_Int)!
1d950 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1d960 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65  pMem1->u.i < pMe
1d970 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e  m2->u.i ) return
1d980 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70   -1;.      if( p
1d990 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d  Mem1->u.i > pMem
1d9a0 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20  2->u.i ) return 
1d9b0 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  +1;.      return
1d9c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1d9d0 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d  ( (f1 & f2 & MEM
1d9e0 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
1d9f0 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1da00 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29  r < pMem2->u.r )
1da10 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1da20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72    if( pMem1->u.r
1da30 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20   > pMem2->u.r ) 
1da40 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20  return +1;.     
1da50 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1da60 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d  .    if( (f1&MEM
1da70 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1da80 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65    if( (f2&MEM_Re
1da90 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1daa0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1dab0 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
1dac0 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d  pMem1->u.i, pMem
1dad0 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  2->u.r);.      }
1dae0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
1daf0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d  turn -1;.      }
1db00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1db10 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20  f1&MEM_Real)!=0 
1db20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32  ){.      if( (f2
1db30 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a  &MEM_Int)!=0 ){.
1db40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
1db50 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
1db60 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e  ompare(pMem2->u.
1db70 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a  i, pMem1->u.r);.
1db80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1db90 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1dba0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1dbb0 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d    return +1;.  }
1dbc0 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61  ..  /* If one va
1dbd0 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  lue is a string 
1dbe0 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73  and the other is
1dbf0 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72   a blob, the str
1dc00 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a  ing is less..  *
1dc10 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 73 74  * If both are st
1dc20 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75  rings, compare u
1dc30 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
1dc40 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  ng functions..  
1dc50 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
1dc60 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20  d_flags&MEM_Str 
1dc70 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26  ){.    if( (f1 &
1dc80 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a   MEM_Str)==0 ){.
1dc90 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1dca0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1dcb0 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  2 & MEM_Str)==0 
1dcc0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1dcd0 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  -1;.    }..    a
1dce0 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e  ssert( pMem1->en
1dcf0 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c  c==pMem2->enc ||
1dd00 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c   pMem1->db->mall
1dd10 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1dd20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
1dd30 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
1dd40 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
1dd50 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1dd60 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d  TE_UTF16LE || pM
1dd70 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1dd80 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20  _UTF16BE );..   
1dd90 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
1dda0 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20  n sequence must 
1ddb0 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68  be defined at th
1ddc0 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69  is point, even i
1ddd0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65  f.    ** the use
1dde0 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f  r deletes the co
1ddf0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1de00 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20   after the vdbe 
1de10 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a  program is.    *
1de20 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73  * compiled (this
1de30 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20   was not always 
1de40 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a  the case)..    *
1de50 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
1de60 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78  Coll || pColl->x
1de70 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  Cmp );..    if( 
1de80 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
1de90 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72  eturn vdbeCompar
1dea0 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31  eMemString(pMem1
1deb0 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20  , pMem2, pColl, 
1dec0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  0);.    }.    /*
1ded0 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   If a NULL point
1dee0 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73  er was passed as
1def0 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e   the collate fun
1df00 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f  ction, fall thro
1df10 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ugh.    ** to th
1df20 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20  e blob case and 
1df30 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  use memcmp().  *
1df40 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74  /.  }. .  /* Bot
1df50 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  h values must be
1df60 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65   blobs.  Compare
1df70 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
1df80 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71    */.  return sq
1df90 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
1dfa0 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a  (pMem1, pMem2);.
1dfb0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  }.../*.** The fi
1dfc0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
1dfd0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1dfe0 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c  tion is a serial
1dff0 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f  -type that.** co
1e000 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
1e010 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61  integer - all va
1e020 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61  lues between 1 a
1e030 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a  nd 9 inclusive .
1e040 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65  ** except 7. The
1e050 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74   second points t
1e060 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1e070 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72  ining an integer
1e080 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c   value.** serial
1e090 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  ized according t
1e0a0 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54  o serial_type. T
1e0b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
1e0c0 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64  erializes.** and
1e0d0 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
1e0e0 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ue..*/.static i6
1e0f0 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  4 vdbeRecordDeco
1e100 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c  deInt(u32 serial
1e110 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20  _type, const u8 
1e120 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b  *aKey){.  u32 y;
1e130 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
1e140 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c  PT_DB || (serial
1e150 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69  _type>=1 && seri
1e160 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65  al_type<=9 && se
1e170 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b  rial_type!=7) );
1e180 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1e190 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1e1a0 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31  se 0:.    case 1
1e1b0 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1e1c0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1e1d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f  ;.      return O
1e1e0 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  NE_BYTE_INT(aKey
1e1f0 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20  );.    case 2:. 
1e200 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1e210 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1e220 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f       return TWO_
1e230 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1e240 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20      case 3:.    
1e250 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1e260 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1e270 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42    return THREE_B
1e280 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1e290 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20     case 4: {.   
1e2a0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1e2b0 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1e2c0 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
1e2d0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1e2e0 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
1e2f0 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a  (int*)&y;.    }.
1e300 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20      case 5: {.  
1e310 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1e320 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1e330 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f      return FOUR_
1e340 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
1e350 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1e360 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1e370 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aKey);.    }.   
1e380 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20   case 6: {.     
1e390 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
1e3a0 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1e3b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1e3c0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1e3d0 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
1e3e0 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
1e3f0 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
1e400 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1e410 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20  64*)&x;.    }.  
1e420 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72  }..  return (ser
1e430 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d  ial_type - 8);.}
1e440 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1e450 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
1e460 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
1e470 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
1e480 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
1e490 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
1e4a0 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
1e4b0 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
1e4c0 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
1e4d0 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
1e4e0 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
1e4f0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1e500 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
1e510 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
1e520 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
1e530 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
1e540 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
1e550 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
1e560 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
1e570 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79  VDBE.  The pPKey
1e580 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65  2.** key must be
1e590 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75   a parsed key su
1e5a0 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66  ch as obtained f
1e5b0 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
1e5c0 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a  beParseRecord..*
1e5d0 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
1e5e0 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   bSkip is non-ze
1e5f0 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ro, it is assume
1e600 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
1e610 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  r has already.**
1e620 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
1e630 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1e640 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72  s of the keys ar
1e650 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b  e equal..**.** K
1e660 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
1e670 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
1e680 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
1e690 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49  ber of fields. I
1e6a0 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73  f all .** fields
1e6b0 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
1e6c0 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71  both keys are eq
1e6d0 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32  ual, then pPKey2
1e6e0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20  ->default_rc is 
1e6f0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
1e700 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20  .** If database 
1e710 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69  corruption is di
1e720 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50  scovered, set pP
1e730 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f  Key2->errCode to
1e740 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
1e750 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30  UPT and return 0
1e760 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  . If an OOM erro
1e770 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1e780 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72  , .** pPKey2->er
1e790 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  rCode is set to 
1e7a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
1e7b0 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  , if it is not N
1e7c0 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c  ULL, the.** mall
1e7d0 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73  oc-failed flag s
1e7e0 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  et on database h
1e7f0 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70  andle (pPKey2->p
1e800 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f  KeyInfo->db)..*/
1e810 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1e820 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
1e830 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65  hSkip(.  int nKe
1e840 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1e850 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
1e860 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1e870 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1e880 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  ,         /* Rig
1e890 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1e8a0 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20  bSkip           
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1e8c0 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65  f true, skip the
1e8d0 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a   first field */.
1e8e0 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
1e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e900 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1e910 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1e920 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
1e930 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
1e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e950 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1e960 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63   next field to c
1e970 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20  ompare */.  u32 
1e980 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20  szHdr1;         
1e990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1e9a0 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65  ize of record he
1e9b0 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ader in bytes */
1e9c0 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9e0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
1e9f0 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65  first type in he
1ea00 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ader */.  int rc
1ea10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1ea20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1ea30 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d  urn value */.  M
1ea40 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79  em *pRhs = pPKey
1ea50 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f  2->aMem;       /
1ea60 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20  * Next field of 
1ea70 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72  pPKey2 to compar
1ea80 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
1ea90 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
1eaa0 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63  2->pKeyInfo;.  c
1eab0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1eac0 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1ead0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1eae0 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20   *)pKey1;.  Mem 
1eaf0 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62  mem1;..  /* If b
1eb00 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68  Skip is true, th
1eb10 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  en the caller ha
1eb20 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d  s already determ
1eb30 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
1eb40 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65  rst.  ** two ele
1eb50 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79  ments in the key
1eb60 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78  s are equal. Fix
1eb70 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61   the various sta
1eb80 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a  ck variables so.
1eb90 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
1eba0 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f  outine begins co
1ebb0 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73  mparing at the s
1ebc0 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a  econd field. */.
1ebd0 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20    if( bSkip ){. 
1ebe0 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69     u32 s1;.    i
1ebf0 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72  dx1 = 1 + getVar
1ec00 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
1ec10 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31   s1);.    szHdr1
1ec20 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20   = aKey1[0];.   
1ec30 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73   d1 = szHdr1 + s
1ec40 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1ec50 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20  TypeLen(s1);.   
1ec60 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73   i = 1;.    pRhs
1ec70 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1ec80 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
1ec90 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
1eca0 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  1);.    d1 = szH
1ecb0 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  dr1;.    if( d1>
1ecc0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1ecd0 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32  ){ .      pPKey2
1ece0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1ecf0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1ed00 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
1ed10 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74  n 0;  /* Corrupt
1ed20 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
1ed30 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56   i = 0;.  }..  V
1ed40 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
1ed50 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1ed60 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1ed70 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1ed80 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nts */.  assert(
1ed90 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1eda0 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32  o->nField+pPKey2
1edb0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  ->pKeyInfo->nXFi
1edc0 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
1edd0 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43  eld .       || C
1ede0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
1edf0 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1ee00 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1ee10 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
1ee20 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1ee30 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29  Info->nField>0 )
1ee40 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
1ee50 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
1ee60 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
1ee70 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
1ee80 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53  ype;..    /* RHS
1ee90 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a   is an integer *
1eea0 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e  /.    if( pRhs->
1eeb0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
1eec0 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
1eed0 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1eee0 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1];.      testca
1eef0 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1ef00 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1ef10 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30   serial_type>=10
1ef20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1ef30 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1ef40 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1ef50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1ef60 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1ef70 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1ef80 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1ef90 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
1efa0 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1efb0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1efc0 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20  &mem1);.        
1efd0 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74  rc = -sqlite3Int
1efe0 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68  FloatCompare(pRh
1eff0 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72  s->u.i, mem1.u.r
1f000 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1f010 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20          i64 lhs 
1f020 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  = vdbeRecordDeco
1f030 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70  deInt(serial_typ
1f040 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a  e, &aKey1[d1]);.
1f050 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20          i64 rhs 
1f060 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20  = pRhs->u.i;.   
1f070 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73       if( lhs<rhs
1f080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1f090 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1f0a0 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73  else if( lhs>rhs
1f0b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1f0c0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1f0d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f0e0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65      /* RHS is re
1f0f0 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  al */.    else i
1f100 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1f110 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
1f120 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
1f130 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
1f140 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1f150 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20  ype>=10 ){.     
1f160 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
1f170 65 73 20 31 32 20 6f 72 20 67 72 65 61 74 65 72  es 12 or greater
1f180 20 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64   are strings and
1f190 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20   blobs (greater 
1f1a0 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  than.        ** 
1f1b0 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20  numbers). Types 
1f1c0 31 30 20 61 6e 64 20 31 31 20 61 72 65 20 63 75  10 and 11 are cu
1f1d0 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65  rrently "reserve
1f1e0 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20  d for future .  
1f1f0 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73        ** use", s
1f200 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61  o it doesn't rea
1f210 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74 20  lly matter what 
1f220 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63  the results of c
1f230 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20  omparing.       
1f240 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62   ** them to numb
1f250 65 72 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e  eric values are.
1f260 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
1f270 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1f280 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1f290 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1f2a0 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1f2b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1f2c0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1f2d0 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1f2e0 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
1f2f0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1f300 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
1f310 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1f320 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75  mem1.u.r<pRhs->u
1f330 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .r ){.          
1f340 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1f350 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d       }else if( m
1f360 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e  em1.u.r>pRhs->u.
1f370 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
1f380 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1f390 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1f3a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
1f3b0 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c  c = sqlite3IntFl
1f3c0 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e  oatCompare(mem1.
1f3d0 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b  u.i, pRhs->u.r);
1f3e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f3f0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1f400 20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e 67   RHS is a string
1f410 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1f420 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1f430 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
1f440 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1f450 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c  y1[idx1], serial
1f460 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65  _type);.      te
1f470 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1f480 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1f490 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1f4a0 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  <12 ){.        r
1f4b0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1f4c0 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c  lse if( !(serial
1f4d0 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
1f4e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
1f4f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f500 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20         mem1.n = 
1f510 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
1f520 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20  2) / 2;.        
1f530 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65  testcase( (d1+me
1f540 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64  m1.n)==(unsigned
1f550 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1f560 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1f570 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69  mem1.n+1)==(unsi
1f580 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1f590 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65        if( (d1+me
1f5a0 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65  m1.n) > (unsigne
1f5b0 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  d)nKey1 ){.     
1f5c0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
1f5d0 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
1f5e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1f5f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1f600 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f610 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e     /* Corruption
1f620 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
1f630 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  e if( pKeyInfo->
1f640 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20  aColl[i] ){.    
1f650 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d        mem1.enc =
1f660 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
1f670 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64            mem1.d
1f680 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
1f690 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1f6a0 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  .flags = MEM_Str
1f6b0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1f6c0 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65  .z = (char*)&aKe
1f6d0 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20  y1[d1];.        
1f6e0 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61    rc = vdbeCompa
1f6f0 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20  reMemString(.   
1f700 20 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31             &mem1
1f710 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f  , pRhs, pKeyInfo
1f720 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b  ->aColl[i], &pPK
1f730 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  ey2->errCode.   
1f740 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1f750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f760 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49     int nCmp = MI
1f770 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e  N(mem1.n, pRhs->
1f780 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  n);.          rc
1f790 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
1f7a0 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e  [d1], pRhs->z, n
1f7b0 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cmp);.          
1f7c0 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
1f7d0 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e   mem1.n - pRhs->
1f7e0 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n; .        }.  
1f7f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1f800 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f   /* RHS is a blo
1f810 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  b */.    else if
1f820 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1f830 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
1f840 20 20 61 73 73 65 72 74 28 20 28 70 52 68 73 2d    assert( (pRhs-
1f850 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1f860 6f 29 3d 3d 30 20 7c 7c 20 70 52 68 73 2d 3e 6e  o)==0 || pRhs->n
1f870 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 67 65 74  ==0 );.      get
1f880 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1f890 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  idx1], serial_ty
1f8a0 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  pe);.      testc
1f8b0 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1f8c0 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1f8d0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
1f8e0 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65   || (serial_type
1f8f0 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20   & 0x01) ){.    
1f900 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1f910 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f920 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65    int nStr = (se
1f930 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20  rial_type - 12) 
1f940 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73  / 2;.        tes
1f950 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29  tcase( (d1+nStr)
1f960 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1f970 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
1f980 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b  tcase( (d1+nStr+
1f990 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  1)==(unsigned)nK
1f9a0 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ey1 );.        i
1f9b0 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28  f( (d1+nStr) > (
1f9c0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1f9d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65  {.          pPKe
1f9e0 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
1f9f0 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1fa00 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
1fa10 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1fa20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
1fa30 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
1fa40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 68     }else if( pRh
1fa50 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  s->flags & MEM_Z
1fa60 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ero ){.         
1fa70 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28   if( !isAllZero(
1fa80 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 61 4b  (const char*)&aK
1fa90 65 79 31 5b 64 31 5d 2c 6e 53 74 72 29 20 29 7b  ey1[d1],nStr) ){
1faa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1fab0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
1fac0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1fad0 20 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52    rc = nStr - pR
1fae0 68 73 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20  hs->u.nZero;.   
1faf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fb00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1fb10 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
1fb20 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b  (nStr, pRhs->n);
1fb30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1fb40 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31  memcmp(&aKey1[d1
1fb50 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70  ], pRhs->z, nCmp
1fb60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1fb70 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53   rc==0 ) rc = nS
1fb80 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20  tr - pRhs->n;.  
1fb90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1fba0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1fbb0 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20  S is null */.   
1fbc0 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72   else{.      ser
1fbd0 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1fbe0 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63  [idx1];.      rc
1fbf0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21   = (serial_type!
1fc00 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  =0);.    }..    
1fc10 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1fc20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
1fc30 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
1fc40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1fc50 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1fc60 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
1fc70 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1fc80 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1fc90 50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20  PKey2, rc) );.  
1fca0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
1fcb0 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  .szMalloc==0 ); 
1fcc0 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
1fcd0 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72  below */.      r
1fce0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1fcf0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52  .    i++;.    pR
1fd00 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20  hs++;.    d1 += 
1fd10 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1fd20 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
1fd30 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20  type);.    idx1 
1fd40 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74  += sqlite3Varint
1fd50 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
1fd60 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31  ;.  }while( idx1
1fd70 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72  <(unsigned)szHdr
1fd80 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
1fd90 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e  Field && d1<=(un
1fda0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1fdb0 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
1fdc0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
1fdd0 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
1fde0 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
1fdf0 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
1fe00 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
1fe10 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
1fe20 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
1fe30 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
1fe40 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
1fe50 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
1fe60 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1fe70 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61  (&mem1).  */.  a
1fe80 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1fe90 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lloc==0 );..  /*
1fea0 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
1feb0 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f  s that one or bo
1fec0 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  th of the keys r
1fed0 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
1fee0 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68   and.  ** all th
1fef0 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
1ff00 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
1ff10 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65  qual. Return the
1ff20 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a   default_rc.  **
1ff30 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73   value.  */.  as
1ff40 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
1ff50 20 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65   .       || vdbe
1ff60 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1ff70 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
1ff80 20 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d   pPKey2, pPKey2-
1ff90 3e 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20  >default_rc) .  
1ffa0 20 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f       || pKeyInfo
1ffb0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1ffc0 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79 32  ed.  );.  pPKey2
1ffd0 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ->eqSeen = 1;.  
1ffe0 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64  return pPKey2->d
1fff0 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74  efault_rc;.}.int
20000 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20010 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74  rdCompare(.  int
20020 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
20030 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20  id *pKey1,   /* 
20040 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
20050 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
20060 4b 65 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a  Key2          /*
20070 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
20080 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
20090 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
200a0 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
200b0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
200c0 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   0);.}.../*.** T
200d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
200e0 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72  an optimized ver
200f0 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
20100 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20110 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20  () .** that (a) 
20120 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
20130 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20  of pPKey2 is an 
20140 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29  integer, and (b)
20150 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66   the .** size-of
20160 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61  -header varint a
20170 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28  t the start of (
20180 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74  pKey1/nKey1) fit
20190 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a  s in a single.**
201a0 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c   byte (i.e. is l
201b0 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a  ess than 128)..*
201c0 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f  *.** To avoid co
201d0 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66  ncerns about buf
201e0 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74  fer overreads, t
201f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
20200 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73  nly used.** on s
20210 63 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65  chemas where the
20220 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68   maximum valid h
20230 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33  eader size is 63
20240 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a   bytes or less..
20250 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
20260 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
20270 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  nt(.  int nKey1,
20280 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
20290 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
202a0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
202b0 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
202c0 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
202d0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
202e0 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73   *aKey = &((cons
202f0 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63  t u8*)pKey1)[*(c
20300 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26  onst u8*)pKey1 &
20310 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65   0x3F];.  int se
20320 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f  rial_type = ((co
20330 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31  nst u8*)pKey1)[1
20340 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ];.  int res;.  
20350 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a  u32 y;.  u64 x;.
20360 20 20 69 36 34 20 76 3b 0a 20 20 69 36 34 20 6c    i64 v;.  i64 l
20370 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72  hs;..  vdbeAsser
20380 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
20390 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70  nLimits(nKey1, p
203a0 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b  Key1, pPKey2->pK
203b0 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72  eyInfo);.  asser
203c0 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29  t( (*(u8*)pKey1)
203d0 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50  <=0x3F || CORRUP
203e0 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68  T_DB );.  switch
203f0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
20400 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
20410 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
20420 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
20430 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f   lhs = ONE_BYTE_
20440 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
20450 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
20460 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
20470 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20480 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
20490 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
204a0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f  .      lhs = TWO
204b0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
204c0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
204d0 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
204e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
204f0 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
20500 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
20510 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
20520 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
20530 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
20540 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
20550 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20560 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
20570 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
20580 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
20590 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
205a0 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
205b0 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29       lhs = (i64)
205c0 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20  *(int*)&y;.     
205d0 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
205e0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
205f0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20600 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
20610 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
20620 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55  .      lhs = FOU
20630 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
20640 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
20650 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
20660 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
20670 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
20680 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20690 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
206a0 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67   { /* 8-byte sig
206b0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
206c0 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59       x = FOUR_BY
206d0 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
206e0 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
206f0 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
20700 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
20710 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78   lhs = *(i64*)&x
20720 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20730 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
20740 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20750 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20    case 8: .     
20760 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20   lhs = 0;.      
20770 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
20780 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31  9:.      lhs = 1
20790 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
207a0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
207b0 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65   could be remove
207c0 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  d without changi
207d0 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
207e0 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a  f running.    **
207f0 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c   this code. Incl
20800 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 73 20  uding it causes 
20810 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20  gcc to generate 
20820 61 20 66 61 73 74 65 72 20 73 77 69 74 63 68 20  a faster switch 
20830 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
20840 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e  t (since the ran
20850 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 61 72  ge of switch tar
20860 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20  gets now starts 
20870 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20  at zero and.    
20880 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73  ** is contiguous
20890 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  ) but does not c
208a0 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61  ause any duplica
208b0 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65  te code to be ge
208c0 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28  nerated.    ** (
208d0 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 65 72  as gcc is clever
208e0 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69   enough to combi
208f0 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20  ne the two like 
20900 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20  cases). Other . 
20910 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20     ** compilers 
20920 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72  might be similar
20930 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20  .  */ .    case 
20940 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20  0: case 7:.     
20950 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
20960 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20970 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
20980 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66  PKey2);..    def
20990 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
209a0 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
209b0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
209c0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
209d0 29 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 70 50  );.  }..  v = pP
209e0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e  Key2->aMem[0].u.
209f0 69 3b 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29  i;.  if( v>lhs )
20a00 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
20a10 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20  y2->r1;.  }else 
20a20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20  if( v<lhs ){.   
20a30 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
20a40 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  2;.  }else if( p
20a50 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
20a60 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
20a70 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
20a80 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65  e two keys are e
20a90 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68  qual. Compare th
20aa0 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20  e trailing .    
20ab0 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20  ** fields.  */. 
20ac0 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
20ad0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
20ae0 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
20af0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
20b00 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
20b10 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69   /* The first fi
20b20 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20  elds of the two 
20b30 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20 61  keys are equal a
20b40 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
20b50 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20  trailing.    ** 
20b60 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70  fields. Return p
20b70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
20b80 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  c in this case. 
20b90 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  */.    res = pPK
20ba0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
20bb0 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53  .    pPKey2->eqS
20bc0 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  een = 1;.  }..  
20bd0 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
20be0 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
20bf0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
20c00 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72  ey2, res) );.  r
20c10 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
20c20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20c30 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
20c40 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
20c50 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
20c60 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
20c70 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
20c80 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
20c90 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74  s a string, that
20ca0 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20 66   (b) the first f
20cb0 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65  ield.** uses the
20cc0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
20cd0 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28  nce BINARY and (
20ce0 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  c) that the size
20cf0 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
20d00 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61  t .** at the sta
20d10 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
20d20 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
20d30 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74  ngle byte..*/.st
20d40 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
20d50 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
20d60 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
20d70 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
20d80 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
20d90 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
20da0 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
20db0 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
20dc0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
20dd0 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
20de0 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20  8*)pKey1;.  int 
20df0 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69  serial_type;.  i
20e00 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72  nt res;..  asser
20e10 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  t( pPKey2->aMem[
20e20 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  0].flags & MEM_S
20e30 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65  tr );.  vdbeAsse
20e40 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
20e50 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20  inLimits(nKey1, 
20e60 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70  pKey1, pPKey2->p
20e70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56  KeyInfo);.  getV
20e80 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
20e90 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
20ea0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
20eb0 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73  pe<12 ){.    res
20ec0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20   = pPKey2->r1;  
20ed0 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b      /* (pKey1/nK
20ee0 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72  ey1) is a number
20ef0 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20   or a null */.  
20f00 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
20f10 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
20f20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50  ){ .    res = pP
20f30 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f  Key2->r2;      /
20f40 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
20f50 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d  is a blob */.  }
20f60 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
20f70 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72  mp;.    int nStr
20f80 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20  ;.    int szHdr 
20f90 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20  = aKey1[0];..   
20fa0 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
20fb0 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20  type-12) / 2;.  
20fc0 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e    if( (szHdr + n
20fd0 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a  Str) > nKey1 ){.
20fe0 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
20ff0 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
21000 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
21010 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
21020 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
21030 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n */.    }.    n
21040 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79  Cmp = MIN( pPKey
21050 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53  2->aMem[0].n, nS
21060 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  tr );.    res = 
21070 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a  memcmp(&aKey1[sz
21080 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d  Hdr], pPKey2->aM
21090 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a  em[0].z, nCmp);.
210a0 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
210b0 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e  ){.      res = n
210c0 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d  Str - pPKey2->aM
210d0 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69  em[0].n;.      i
210e0 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
210f0 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d       if( pPKey2-
21100 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20  >nField>1 ){.   
21110 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c         res = sql
21120 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
21130 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
21140 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
21150 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  y2, 1);.        
21160 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21170 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64   res = pPKey2->d
21180 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20  efault_rc;.     
21190 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53       pPKey2->eqS
211a0 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
211b0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
211c0 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
211d0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
211e0 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->r2;.      }els
211f0 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  e{.        res =
21200 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
21210 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
21220 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
21230 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
21240 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r2;.    }else{. 
21250 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
21260 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  2->r1;.    }.  }
21270 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
21280 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
21290 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
212a0 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20   pPKey2, res).  
212b0 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
212c0 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b  DB.       || pPK
212d0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
212e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
212f0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65    );.  return re
21300 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
21310 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
21320 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  an sqlite3VdbeRe
21330 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f  cordCompare() co
21340 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f  mpatible functio
21350 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f  n.** suitable fo
21360 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69  r comparing seri
21370 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74  alized records t
21380 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72  o the unpacked r
21390 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20  ecord passed.** 
213a0 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
213b0 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43  ment..*/.RecordC
213c0 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56 64  ompare sqlite3Vd
213d0 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e  beFindCompare(Un
213e0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29  packedRecord *p)
213f0 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63  {.  /* varintRec
21400 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
21410 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64  and varintRecord
21420 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20  CompareString() 
21430 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a  both assume.  **
21440 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
21450 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
21460 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74  that occurs at t
21470 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
21480 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74   record.  ** fit
21490 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  s in a single by
214a0 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20  te (i.e. is 127 
214b0 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74  or less). varint
214c0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
214d0 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73  ().  ** also ass
214e0 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20  umes that it is 
214f0 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64  safe to overread
21500 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74 20   a buffer by at 
21510 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20  least the .  ** 
21520 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65  maximum possible
21530 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73 69   legal header si
21540 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e  ze plus 8 bytes.
21550 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20 69   Because there i
21560 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65  s.  ** guarantee
21570 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  d to be at least
21580 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36   74 (but not 136
21590 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  ) bytes of paddi
215a0 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ng following eac
215b0 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61  h.  ** buffer pa
215c0 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65  ssed to varintRe
215d0 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
215e0 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63   this makes it c
215f0 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a  onvenient to.  *
21600 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65  * limit the size
21610 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 74   of the header t
21620 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63 61  o 64 bytes in ca
21630 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66 69  ses where the fi
21640 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69  rst field.  ** i
21650 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20  s an integer..  
21660 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69  **.  ** The easi
21670 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72  est way to enfor
21680 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73  ce this limit is
21690 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c   to consider onl
216a0 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20  y records with. 
216b0 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72   ** 13 fields or
216c0 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66 69   less. If the fi
216d0 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20  rst field is an 
216e0 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78  integer, the max
216f0 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20  imum legal.  ** 
21700 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 28  header size is (
21710 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79  12*5 + 1 + 1) by
21720 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28  tes.  */.  if( (
21730 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  p->pKeyInfo->nFi
21740 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66  eld + p->pKeyInf
21750 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20  o->nXField)<=13 
21760 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  ){.    int flags
21770 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c   = p->aMem[0].fl
21780 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ags;.    if( p->
21790 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
217a0 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20  rder[0] ){.     
217b0 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20   p->r1 = 1;.    
217c0 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20    p->r2 = -1;.  
217d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
217e0 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20  ->r1 = -1;.     
217f0 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20   p->r2 = 1;.    
21800 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  }.    if( (flags
21810 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20   & MEM_Int) ){. 
21820 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
21830 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
21840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
21850 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
21860 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65  M_Real );.    te
21870 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
21880 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  MEM_Null );.    
21890 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
218a0 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
218b0 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28    if( (flags & (
218c0 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c  MEM_Real|MEM_Nul
218d0 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20  l|MEM_Blob))==0 
218e0 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  && p->pKeyInfo->
218f0 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20  aColl[0]==0 ){. 
21900 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
21910 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a  gs & MEM_Str );.
21920 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
21930 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
21940 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ring;.    }.  }.
21950 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
21960 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
21970 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75  re;.}../*.** pCu
21980 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69  r points at an i
21990 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74  ndex entry creat
219a0 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  ed using the OP_
219b0 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
219c0 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72  e..** Read the r
219d0 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66  owid (the last f
219e0 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f  ield in the reco
219f0 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74  rd) and store it
21a00 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52   in *rowid..** R
21a10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
21a20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
21a30 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72  rks, or an error
21a40 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
21a50 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68  .**.** pCur migh
21a60 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  t be pointing to
21a70 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66   text obtained f
21a80 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  rom a corrupt da
21a90 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
21aa0 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63  So the content c
21ab0 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
21ac0 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74  .  Do appropriat
21ad0 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20  e checks on the 
21ae0 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  content..*/.int 
21af0 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
21b00 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  wid(sqlite3 *db,
21b10 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
21b20 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20   i64 *rowid){.  
21b30 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
21b40 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
21b50 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20  2 szHdr;        
21b60 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68  /* Size of the h
21b70 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74  eader */.  u32 t
21b80 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20  ypeRowid;    /* 
21b90 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  Serial type of t
21ba0 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33  he rowid */.  u3
21bb0 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20  2 lenRowid;     
21bc0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72  /* Size of the r
21bd0 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c  owid */.  Mem m,
21be0 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68   v;..  /* Get th
21bf0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
21c00 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79  dex entry.  Only
21c10 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73   indices entries
21c20 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68   of less.  ** th
21c30 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70  an 2GiB are supp
21c40 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c  ort - anything l
21c50 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74  arge must be dat
21c60 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
21c70 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75  ..  ** Any corru
21c80 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
21c90 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65  d in sqlite3Btre
21ca0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
21cb0 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a   though, so.  **
21cc0 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73   this code can s
21cd0 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61  afely assume tha
21ce0 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32  t nCellKey is 32
21cf0 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61  -bits  .  */.  a
21d00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
21d10 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
21d20 28 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c  (pCur) );.  nCel
21d30 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74  lKey = sqlite3Bt
21d40 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70  reePayloadSize(p
21d50 43 75 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Cur);.  assert( 
21d60 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49  (nCellKey & SQLI
21d70 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36  TE_MAX_U32)==(u6
21d80 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20  4)nCellKey );.. 
21d90 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
21da0 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
21db0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
21dc0 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  try */.  sqlite3
21dd0 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
21de0 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
21df0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
21e00 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
21e10 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26  (u32)nCellKey, &
21e20 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
21e30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21e40 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64   }..  /* The ind
21e50 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65  ex entry must be
21e60 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65  gin with a heade
21e70 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69  r size */.  (voi
21e80 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
21e90 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
21ea0 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
21eb0 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  r==3 );.  testca
21ec0 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29  se( szHdr==m.n )
21ed0 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
21ee0 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74  (szHdr<3 || (int
21ef0 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20  )szHdr>m.n) ){. 
21f00 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
21f10 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
21f20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74  }..  /* The last
21f30 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e   field of the in
21f40 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  dex should be an
21f50 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52   integer - the R
21f60 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66  OWID..  ** Verif
21f70 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  y that the last 
21f80 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20  entry really is 
21f90 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  an integer. */. 
21fa0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
21fb0 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
21fc0 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
21fd0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
21fe0 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20  ypeRowid==1 );. 
21ff0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
22000 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73  owid==2 );.  tes
22010 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
22020 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
22030 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20  e( typeRowid==4 
22040 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
22050 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20  ypeRowid==5 );. 
22060 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
22070 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73  owid==6 );.  tes
22080 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
22090 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==8 );.  testcas
220a0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20  e( typeRowid==9 
220b0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
220c0 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c  y(typeRowid<1 ||
220d0 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20   typeRowid>9 || 
220e0 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b  typeRowid==7) ){
220f0 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
22100 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
22110 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
22120 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
22130 65 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64  eSizes[typeRowid
22140 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  ];.  testcase( (
22150 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c  u32)m.n==szHdr+l
22160 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28  enRowid );.  if(
22170 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d   unlikely((u32)m
22180 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  .n<szHdr+lenRowi
22190 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  d) ){.    goto i
221a0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
221b0 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ion;.  }..  /* F
221c0 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72  etch the integer
221d0 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
221e0 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  the index record
221f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
22200 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
22210 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
22220 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
22230 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
22240 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
22250 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
22260 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
22270 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
22280 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61  p here if databa
22290 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
222a0 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20   detected after 
222b0 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  m has been.  ** 
222c0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65  allocated.  Free
222d0 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e   the m object an
222e0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
222f0 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f  CORRUPT. */.idx_
22300 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
22310 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e  :.  testcase( m.
22320 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20  szMalloc!=0 );. 
22330 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
22340 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
22350 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22360 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a  UPT_BKPT;.}../*.
22370 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b  ** Compare the k
22380 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ey of the index 
22390 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
223a0 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67  r pC is pointing
223b0 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74   to against.** t
223c0 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e  he key string in
223d0 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69   pUnpacked.  Wri
223e0 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20  te into *pRes a 
223f0 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69  number.** that i
22400 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  s negative, zero
22410 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
22420 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e   pC is less than
22430 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f  , equal to,.** o
22440 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  r greater than p
22450 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72  Unpacked.  Retur
22460 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
22470 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55  uccess..**.** pU
22480 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65  npacked is eithe
22490 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75  r created withou
224a0 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20  t a rowid or is 
224b0 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61  truncated so tha
224c0 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68  t it.** omits th
224d0 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
224e0 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61  nd.  The rowid a
224f0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
22500 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20   index entry.** 
22510 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65  is ignored as we
22520 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73  ll.  Hence, this
22530 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f   routine only co
22540 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69  mpares the prefi
22550 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b  xes .** of the k
22560 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65  eys prior to the
22570 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f   final rowid, no
22580 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  t the entire key
22590 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
225a0 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
225b0 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
225c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
225d0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
225e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
225f0 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
22600 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22610 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
22620 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
22630 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  nst */.  Unpacke
22640 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b  dRecord *pUnpack
22650 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70  ed,       /* Unp
22660 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
22670 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72   key */.  int *r
22680 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
22690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
226a0 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
226b0 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
226c0 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
226d0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
226e0 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
226f0 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20  Cur;.  Mem m;.. 
22700 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75   assert( pC->eCu
22710 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
22720 54 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20 3d  TREE );.  pCur =
22730 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b   pC->uc.pCursor;
22740 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
22750 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
22760 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
22770 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  nCellKey = sqlit
22780 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69  e3BtreePayloadSi
22790 7a 65 28 70 43 75 72 29 3b 0a 20 20 2f 2a 20 6e  ze(pCur);.  /* n
227a0 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77  CellKey will alw
227b0 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30  ays be between 0
227c0 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20   and 0xffffffff 
227d0 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
227e0 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72  ay.  ** that btr
227f0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
22800 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56   and sqlite3GetV
22810 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d  arint32() are im
22820 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69  plemented */.  i
22830 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c  f( nCellKey<=0 |
22840 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66  | nCellKey>0x7ff
22850 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65  fffff ){.    *re
22860 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
22870 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
22880 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
22890 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
228a0 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63  &m, db, 0);.  rc
228b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
228c0 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
228d0 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65   0, (u32)nCellKe
228e0 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  y, &m);.  if( rc
228f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
22900 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20  c;.  }.  *res = 
22910 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
22920 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e  dCompare(m.n, m.
22930 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  z, pUnpacked);. 
22940 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
22950 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
22960 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22970 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
22980 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
22990 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
229a0 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
229b0 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
229c0 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
229d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
229e0 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
229f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
22a00 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
22a10 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
22a20 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
22a30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
22a40 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
22a50 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
22a60 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
22a70 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
22a80 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
22a90 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
22aa0 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
22ab0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
22ac0 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
22ad0 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
22ae0 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
22af0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
22b00 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
22b10 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
22b20 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
22b30 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
22b40 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
22b50 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22b60 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
22b70 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
22b80 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
22b90 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
22ba0 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
22bb0 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
22bc0 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
22bd0 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
22be0 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
22bf0 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
22c00 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
22c10 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
22c20 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
22c30 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
22c40 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
22c50 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
22c60 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
22c70 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
22c80 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
22c90 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
22ca0 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
22cb0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
22cc0 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76  s obsolete..*/.v
22cd0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
22ce0 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
22cf0 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
22d00 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
22d10 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
22d20 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
22d30 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
22d40 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
22d50 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
22d60 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
22d70 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e  d with the Vdbe.
22d80 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
22d90 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20  ite3VdbeDb(Vdbe 
22da0 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
22db0 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >db;.}../*.** Re
22dc0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
22dd0 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  o an sqlite3_val
22de0 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
22df0 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
22e00 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  e bound.** param
22e10 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20  eter iVar of VM 
22e20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  v. Except, if th
22e30 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51  e value is an SQ
22e40 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a  L NULL, return .
22e50 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e  ** 0 instead. Un
22e60 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c  less it is NULL,
22e70 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20   apply affinity 
22e80 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20  aff (one of the 
22e90 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20  SQLITE_AFF_*.** 
22ea0 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68  constants) to th
22eb0 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  e value before r
22ec0 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a  eturning it..**.
22ed0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
22ee0 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72  value must be fr
22ef0 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
22f00 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  r using sqlite3V
22f10 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  alueFree()..*/.s
22f20 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71  qlite3_value *sq
22f30 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
22f40 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20  dValue(Vdbe *v, 
22f50 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66  int iVar, u8 aff
22f60 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
22f70 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29  r>0 );.  if( v )
22f80 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  {.    Mem *pMem 
22f90 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d  = &v->aVar[iVar-
22fa0 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  1];.    if( 0==(
22fb0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
22fc0 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20  M_Null) ){.     
22fd0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
22fe0 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61  pRet = sqlite3Va
22ff0 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20  lueNew(v->db);. 
23000 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b       if( pRet ){
23010 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
23020 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d  VdbeMemCopy((Mem
23030 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a   *)pRet, pMem);.
23040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
23050 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
23060 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c  y(pRet, aff, SQL
23070 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
23080 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
23090 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pRet;.    }.  }.
230a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
230b0 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53  *.** Configure S
230c0 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72  QL variable iVar
230d0 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67   so that binding
230e0 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20   a new value to 
230f0 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f  it signals.** to
23100 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d   sqlite3_reoptim
23110 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72  ize() that re-pr
23120 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74  eparing the stat
23130 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74  ement may result
23140 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20  .** in a better 
23150 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76  query plan..*/.v
23160 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
23170 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a  etVarmask(Vdbe *
23180 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20  v, int iVar){.  
23190 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
231a0 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20  ;.  if( iVar>32 
231b0 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  ){.    v->expmas
231c0 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a  k = 0xffffffff;.
231d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e    }else{.    v->
231e0 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32  expmask |= ((u32
231f0 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b  )1 << (iVar-1));
23200 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
23210 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
23220 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54  UALTABLE./*.** T
23230 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65  ransfer error me
23240 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20  ssage text from 
23250 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e  an sqlite3_vtab.
23260 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
23270 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
23280 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
23290 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
232a0 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72  into a Vdbe.zErr
232b0 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
232c0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
232d0 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
232e0 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f  te3DbMalloc)..*/
232f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61  .void sqlite3Vta
23300 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64  bImportErrmsg(Vd
23310 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  be *p, sqlite3_v
23320 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 69  tab *pVtab){.  i
23330 66 28 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  f( pVtab->zErrMs
23340 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
23350 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
23360 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23370 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
23380 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
23390 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
233a0 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72  p(db, pVtab->zEr
233b0 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
233c0 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
233d0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 56 74  ErrMsg);.    pVt
233e0 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ab->zErrMsg = 0;
233f0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
23400 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
23410 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69  TUALTABLE */..#i
23420 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
23430 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
23440 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K../*.** If the 
23450 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
23460 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c  is not NULL, rel
23470 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61 74  ease any allocat
23480 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20  ions associated 
23490 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6d 65 6d  .** with the mem
234a0 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68 65  ory cells in the
234b0 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61 79   p->aMem[] array
234c0 2e 20 41 6c 73 6f 20 66 72 65 65 20 74 68 65 20  . Also free the 
234d0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a  UnpackedRecord.*
234e0 2a 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  * structure itse
234f0 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c 69 74 65  lf, using sqlite
23500 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  3DbFree()..**.**
23510 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
23520 73 20 75 73 65 64 20 74 6f 20 66 72 65 65 20 55  s used to free U
23530 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
23540 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61 74  ructures allocat
23550 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 64 62  ed by.** the vdb
23560 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20  eUnpackRecord() 
23570 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69  function found i
23580 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a  n vdbeapi.c..*/.
23590 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
235a0 46 72 65 65 55 6e 70 61 63 6b 65 64 28 73 71 6c  FreeUnpacked(sql
235b0 69 74 65 33 20 2a 64 62 2c 20 55 6e 70 61 63 6b  ite3 *db, Unpack
235c0 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20  edRecord *p){.  
235d0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
235e0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
235f0 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b   i<p->nField; i+
23600 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  +){.      Mem *p
23610 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69  Mem = &p->aMem[i
23620 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ];.      if( pMe
23630 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  m->zMalloc ) sql
23640 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
23650 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  se(pMem);.    }.
23660 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
23670 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  e(db, p);.  }.}.
23680 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
23690 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
236a0 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 64 65  E_HOOK */..#ifde
236b0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
236c0 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f  PREUPDATE_HOOK./
236d0 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
236e0 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e  pre-update hook.
236f0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 55   If this is an U
23700 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
23710 70 72 65 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c  pre-update call,
23720 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f 72 20  .** then cursor 
23730 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
23740 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68  cond argument sh
23750 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74 68  ould point to th
23760 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74  e row about.** t
23770 6f 20 62 65 20 75 70 64 61 74 65 20 6f 72 20 64  o be update or d
23780 65 6c 65 74 65 64 2e 20 49 66 20 74 68 65 20 61  eleted. If the a
23790 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73  pplication calls
237a0 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61   sqlite3_preupda
237b0 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65  te_old(),.** the
237c0 20 72 65 71 75 69 72 65 64 20 76 61 6c 75 65 20   required value 
237d0 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f  will be read fro
237e0 6d 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75  m the row the cu
237f0 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  rsor points to..
23800 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
23810 64 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b  dbePreUpdateHook
23820 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
23830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23840 20 20 20 20 2f 2a 20 56 64 62 65 20 70 72 65 2d      /* Vdbe pre-
23850 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 69  update hook is i
23860 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56  nvoked by */.  V
23870 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  dbeCursor *pCsr,
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23890 2a 20 43 75 72 73 6f 72 20 74 6f 20 67 72 61 62  * Cursor to grab
238a0 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66 72   old.* values fr
238b0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  om */.  int op, 
238c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238d0 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
238e0 45 5f 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  E_INSERT, UPDATE
238f0 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20   or DELETE */.  
23900 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
23910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23920 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65  /* Database name
23930 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
23940 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
23950 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65        /* Modifie
23960 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34  d table */.  i64
23970 20 69 4b 65 79 31 2c 20 20 20 20 20 20 20 20 20   iKey1,         
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23990 49 6e 69 74 69 61 6c 20 6b 65 79 20 76 61 6c 75  Initial key valu
239a0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20  e */.  int iReg 
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239c0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
239d0 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63  er for new.* rec
239e0 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ord */.){.  sqli
239f0 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b  te3 *db = v->db;
23a00 0a 20 20 69 36 34 20 69 4b 65 79 32 3b 0a 20 20  .  i64 iKey2;.  
23a10 50 72 65 55 70 64 61 74 65 20 70 72 65 75 70 64  PreUpdate preupd
23a20 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ate;.  const cha
23a30 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e  r *zTbl = pTab->
23a40 7a 4e 61 6d 65 3b 0a 20 20 73 74 61 74 69 63 20  zName;.  static 
23a50 63 6f 6e 73 74 20 75 38 20 66 61 6b 65 53 6f 72  const u8 fakeSor
23a60 74 4f 72 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61  tOrder = 0;..  a
23a70 73 73 65 72 74 28 20 64 62 2d 3e 70 50 72 65 55  ssert( db->pPreU
23a80 70 64 61 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65  pdate==0 );.  me
23a90 6d 73 65 74 28 26 70 72 65 75 70 64 61 74 65 2c  mset(&preupdate,
23aa0 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 65 55 70   0, sizeof(PreUp
23ab0 64 61 74 65 29 29 3b 0a 20 20 69 66 28 20 6f 70  date));.  if( op
23ac0 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20  ==SQLITE_UPDATE 
23ad0 29 7b 0a 20 20 20 20 69 4b 65 79 32 20 3d 20 76  ){.    iKey2 = v
23ae0 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69  ->aMem[iReg].u.i
23af0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
23b00 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20  Key2 = iKey1;.  
23b10 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73  }..  assert( pCs
23b20 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d  r->nField==pTab-
23b30 3e 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c  >nCol .       ||
23b40 20 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d   (pCsr->nField==
23b50 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20  pTab->nCol+1 && 
23b60 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54  op==SQLITE_DELET
23b70 45 20 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20  E && iReg==-1). 
23b80 20 29 3b 0a 0a 20 20 70 72 65 75 70 64 61 74 65   );..  preupdate
23b90 2e 76 20 3d 20 76 3b 0a 20 20 70 72 65 75 70 64  .v = v;.  preupd
23ba0 61 74 65 2e 70 43 73 72 20 3d 20 70 43 73 72 3b  ate.pCsr = pCsr;
23bb0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6f 70 20  .  preupdate.op 
23bc0 3d 20 6f 70 3b 0a 20 20 70 72 65 75 70 64 61 74  = op;.  preupdat
23bd0 65 2e 69 4e 65 77 52 65 67 20 3d 20 69 52 65 67  e.iNewReg = iReg
23be0 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65  ;.  preupdate.ke
23bf0 79 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20  yinfo.db = db;. 
23c00 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e   preupdate.keyin
23c10 66 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  fo.enc = ENC(db)
23c20 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65  ;.  preupdate.ke
23c30 79 69 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70  yinfo.nField = p
23c40 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65  Tab->nCol;.  pre
23c50 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61  update.keyinfo.a
23c60 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
23c70 29 26 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b  )&fakeSortOrder;
23c80 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65  .  preupdate.iKe
23c90 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72  y1 = iKey1;.  pr
23ca0 65 75 70 64 61 74 65 2e 69 4b 65 79 32 20 3d 20  eupdate.iKey2 = 
23cb0 69 4b 65 79 32 3b 0a 20 20 70 72 65 75 70 64 61  iKey2;.  preupda
23cc0 74 65 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  te.pTab = pTab;.
23cd0 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  .  db->pPreUpdat
23ce0 65 20 3d 20 26 70 72 65 75 70 64 61 74 65 3b 0a  e = &preupdate;.
23cf0 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65    db->xPreUpdate
23d00 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50 72  Callback(db->pPr
23d10 65 55 70 64 61 74 65 41 72 67 2c 20 64 62 2c 20  eUpdateArg, db, 
23d20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69  op, zDb, zTbl, i
23d30 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20 20  Key1, iKey2);.  
23d40 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d  db->pPreUpdate =
23d50 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   0;.  sqlite3DbF
23d60 72 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74  ree(db, preupdat
23d70 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20 76 64  e.aRecord);.  vd
23d80 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64  beFreeUnpacked(d
23d90 62 2c 20 70 72 65 75 70 64 61 74 65 2e 70 55 6e  b, preupdate.pUn
23da0 70 61 63 6b 65 64 29 3b 0a 20 20 76 64 62 65 46  packed);.  vdbeF
23db0 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20  reeUnpacked(db, 
23dc0 70 72 65 75 70 64 61 74 65 2e 70 4e 65 77 55 6e  preupdate.pNewUn
23dd0 70 61 63 6b 65 64 29 3b 0a 20 20 69 66 28 20 70  packed);.  if( p
23de0 72 65 75 70 64 61 74 65 2e 61 4e 65 77 20 29 7b  reupdate.aNew ){
23df0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
23e00 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d  for(i=0; i<pCsr-
23e10 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20  >nField; i++){. 
23e20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23e30 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 72 65 75  MemRelease(&preu
23e40 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a  pdate.aNew[i]);.
23e50 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
23e60 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65 75  3DbFree(db, preu
23e70 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a 20 20 7d  pdate.aNew);.  }
23e80 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
23e90 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
23ea0 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a           DATE_HOOK */.