/ Hex Artifact Content
Login

Artifact 6194de3a1c44acc4027612240e1d9d664070814f:


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 5a 65 72 6f 28 64 62  3DbMallocZero(db
02d0: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
02e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
02f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0300: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
0310: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
0320: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
0330: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0340: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0350: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0360: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0370: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0390: 20 70 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61   p->pParse = pPa
03a0: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
03b0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30  Parse->aLabel==0
03c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
03d0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20  arse->nLabel==0 
03e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
03f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30  rse->nOpAlloc==0
0400: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   );.  return p;.
0410: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
0420: 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 6e 67  the error string
0430: 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 65 2e   stored in Vdbe.
0440: 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 64 20  zErrMsg.*/.void 
0450: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
0460: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
0470: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
0480: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
0490: 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  p;.  sqlite3DbFr
04a0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a 45 72  ee(p->db, p->zEr
04b0: 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 61 72  rMsg);.  va_star
04c0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
04d0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73    p->zErrMsg = s
04e0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
04f0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
0500: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
0510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d  ;.}../*.** Remem
0520: 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 72 69  ber the SQL stri
0530: 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 72 65  ng for a prepare
0540: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  d statement..*/.
0550: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0560: 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20  SetSql(Vdbe *p, 
0570: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
0580: 6e 74 20 6e 2c 20 69 6e 74 20 69 73 50 72 65 70  nt n, int isPrep
0590: 61 72 65 56 32 29 7b 0a 20 20 61 73 73 65 72 74  areV2){.  assert
05a0: 28 20 69 73 50 72 65 70 61 72 65 56 32 3d 3d 31  ( isPrepareV2==1
05b0: 20 7c 7c 20 69 73 50 72 65 70 61 72 65 56 32 3d   || isPrepareV2=
05c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
05d0: 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 64   ) return;.#if d
05e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
05f0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 64 65  IT_TRACE) && !de
0600: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
0610: 42 4c 45 5f 53 51 4c 4c 4f 47 29 0a 20 20 69 66  BLE_SQLLOG).  if
0620: 28 20 21 69 73 50 72 65 70 61 72 65 56 32 20 29  ( !isPrepareV2 )
0630: 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a   return;.#endif.
0640: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71    assert( p->zSq
0650: 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71  l==0 );.  p->zSq
0660: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
0670: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e  NDup(p->db, z, n
0680: 29 3b 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72  );.  p->isPrepar
0690: 65 56 32 20 3d 20 28 75 38 29 69 73 50 72 65 70  eV2 = (u8)isPrep
06a0: 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  areV2;.}../*.** 
06b0: 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61  Return the SQL a
06c0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
06d0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
06e0: 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ent.*/.const cha
06f0: 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73  r *sqlite3_sql(s
0700: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
0710: 6d 74 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d  mt){.  Vdbe *p =
0720: 20 28 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a   (Vdbe *)pStmt;.
0730: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 70    return (p && p
0740: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 29 20 3f  ->isPrepareV2) ?
0750: 20 70 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a   p->zSql : 0;.}.
0760: 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20  ./*.** Swap all 
0770: 63 6f 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20  content between 
0780: 74 77 6f 20 56 44 42 45 20 73 74 72 75 63 74 75  two VDBE structu
0790: 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  res..*/.void sql
07a0: 69 74 65 33 56 64 62 65 53 77 61 70 28 56 64 62  ite3VdbeSwap(Vdb
07b0: 65 20 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29  e *pA, Vdbe *pB)
07c0: 7b 0a 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70  {.  Vdbe tmp, *p
07d0: 54 6d 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d  Tmp;.  char *zTm
07e0: 70 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a  p;.  tmp = *pA;.
07f0: 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a    *pA = *pB;.  *
0800: 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70  pB = tmp;.  pTmp
0810: 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pA->pNext;.  
0820: 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e  pA->pNext = pB->
0830: 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65  pNext;.  pB->pNe
0840: 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d  xt = pTmp;.  pTm
0850: 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20  p = pA->pPrev;. 
0860: 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d   pA->pPrev = pB-
0870: 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50  >pPrev;.  pB->pP
0880: 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54  rev = pTmp;.  zT
0890: 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20  mp = pA->zSql;. 
08a0: 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e   pA->zSql = pB->
08b0: 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c  zSql;.  pB->zSql
08c0: 20 3d 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69   = zTmp;.  pB->i
08d0: 73 50 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d  sPrepareV2 = pA-
08e0: 3e 69 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a  >isPrepareV2;.}.
08f0: 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68  ./*.** Resize th
0900: 65 20 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79  e Vdbe.aOp array
0910: 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61   so that it is a
0920: 74 20 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d  t least nOp elem
0930: 65 6e 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20  ents larger .** 
0940: 74 68 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74  than its current
0950: 20 73 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75   size. nOp is gu
0960: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
0970: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
0980: 6c 0a 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a  l.** to 1024/siz
0990: 65 6f 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49  eof(Op)..**.** I
09a0: 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f  f an out-of-memo
09b0: 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ry error occurs 
09c0: 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74  while resizing t
09d0: 68 65 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e  he array, return
09e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
09f0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 56  . In this case V
0a00: 64 62 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73  dbe.aOp and Pars
0a10: 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69  e.nOpAlloc remai
0a20: 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  n .** unchanged 
0a30: 28 74 68 69 73 20 69 73 20 73 6f 20 74 68 61 74  (this is so that
0a40: 20 61 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72   any opcodes alr
0a50: 65 61 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63  eady allocated c
0a60: 61 6e 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63  an be .** correc
0a70: 74 6c 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20  tly deallocated 
0a80: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72  along with the r
0a90: 65 73 74 20 6f 66 20 74 68 65 20 56 64 62 65 29  est of the Vdbe)
0aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0ab0: 67 72 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65  growOpArray(Vdbe
0ac0: 20 2a 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20   *v, int nOp){. 
0ad0: 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20   VdbeOp *pNew;. 
0ae0: 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70   Parse *p = v->p
0af0: 50 61 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65  Parse;..  /* The
0b00: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0b10: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70  LLOC_STRESS comp
0b20: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
0b30: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66  is designed to f
0b40: 6f 72 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66  orce.  ** more f
0b50: 72 65 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73  requent reallocs
0b60: 20 61 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69   and hence provi
0b70: 64 65 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  de more opportun
0b80: 69 74 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20  ities for .  ** 
0b90: 73 69 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61  simulated OOM fa
0ba0: 75 6c 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45  ults.  SQLITE_TE
0bb0: 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  ST_REALLOC_STRES
0bc0: 53 20 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75  S is generally u
0bd0: 73 65 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  sed.  ** during 
0be0: 74 65 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57  testing only.  W
0bf0: 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  ith SQLITE_TEST_
0c00: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67  REALLOC_STRESS g
0c10: 72 6f 77 20 74 68 65 20 6f 70 20 61 72 72 61 79  row the op array
0c20: 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e  .  ** by the min
0c30: 69 6d 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71  imum* amount req
0c40: 75 69 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20  uired until the 
0c50: 73 69 7a 65 20 72 65 61 63 68 65 73 20 35 31 32  size reaches 512
0c60: 2e 20 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f  .  Normal.  ** o
0c70: 70 65 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75  peration (withou
0c80: 74 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  t SQLITE_TEST_RE
0c90: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73  ALLOC_STRESS) is
0ca0: 20 74 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63   to double the c
0cb0: 75 72 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65  urrent.  ** size
0cc0: 20 6f 66 20 74 68 65 20 6f 70 20 61 72 72 61 79   of the op array
0cd0: 20 6f 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73   or add 1KB of s
0ce0: 70 61 63 65 2c 20 77 68 69 63 68 65 76 65 72 20  pace, whichever 
0cf0: 69 73 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23  is smaller. */.#
0d00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
0d10: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
0d20: 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70  .  int nNew = (p
0d30: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20  ->nOpAlloc>=512 
0d40: 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20  ? p->nOpAlloc*2 
0d50: 3a 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f  : p->nOpAlloc+nO
0d60: 70 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  p);.#else.  int 
0d70: 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c  nNew = (p->nOpAl
0d80: 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  loc ? p->nOpAllo
0d90: 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34  c*2 : (int)(1024
0da0: 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20  /sizeof(Op)));. 
0db0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
0dc0: 52 28 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a  R(nOp);.#endif..
0dd0: 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28    assert( nOp<=(
0de0: 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29  1024/sizeof(Op))
0df0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
0e00: 65 77 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  ew>=(p->nOpAlloc
0e10: 2b 6e 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20  +nOp) );.  pNew 
0e20: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
0e30: 6f 63 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70  oc(p->db, v->aOp
0e40: 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70  , nNew*sizeof(Op
0e50: 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  ));.  if( pNew )
0e60: 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  {.    p->nOpAllo
0e70: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
0e80: 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70  locSize(p->db, p
0e90: 4e 65 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29 3b  New)/sizeof(Op);
0ea0: 0a 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e  .    v->aOp = pN
0eb0: 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ew;.  }.  return
0ec0: 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f   (pNew ? SQLITE_
0ed0: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  OK : SQLITE_NOME
0ee0: 4d 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  M);.}..#ifdef SQ
0ef0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68  LITE_DEBUG./* Th
0f00: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
0f10: 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20  st a convenient 
0f20: 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62  place to set a b
0f30: 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77  reakpoint that w
0f40: 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65  ill.** fire afte
0f50: 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73  r each opcode is
0f60: 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69   inserted and di
0f70: 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a  splayed using.**
0f80: 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64   "PRAGMA vdbe_ad
0f90: 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f  doptrace=on"..*/
0fa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
0fb0: 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69  t_addop_breakpoi
0fc0: 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  nt(void){.  stat
0fd0: 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  ic int n = 0;.  
0fe0: 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n++;.}.#endif../
0ff0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69  *.** Add a new i
1000: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
1010: 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75  e list of instru
1020: 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69  ctions current i
1030: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20  n the.** VDBE.  
1040: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
1050: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
1060: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
1070: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a   Parameters:.**.
1080: 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20  **    p         
1090: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
10a0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20   the VDBE.**.** 
10b0: 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20     op           
10c0: 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f     The opcode fo
10d0: 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  r this instructi
10e0: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20  on.**.**    p1, 
10f0: 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72  p2, p3      Oper
1100: 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ands.**.** Use t
1110: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
1120: 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e  solveLabel() fun
1130: 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20  ction to fix an 
1140: 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74  address and.** t
1150: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  he sqlite3VdbeCh
1160: 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f  angeP4() functio
1170: 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  n to change the 
1180: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a  value of the P4.
1190: 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69  ** operand..*/.i
11a0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
11b0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
11c0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
11d0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
11e0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
11f0: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
1200: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
1210: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
1220: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
1230: 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f  ssert( op>0 && o
1240: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20  p<0xff );.  if( 
1250: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  p->pParse->nOpAl
1260: 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66  loc<=i ){.    if
1270: 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c  ( growOpArray(p,
1280: 20 31 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74   1) ){.      ret
1290: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
12a0: 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70  .  p->nOp++;.  p
12b0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
12c0: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
12d0: 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e   (u8)op;.  pOp->
12e0: 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70  p5 = 0;.  pOp->p
12f0: 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70  1 = p1;.  pOp->p
1300: 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70  2 = p2;.  pOp->p
1310: 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70  3 = p3;.  pOp->p
1320: 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  4.p = 0;.  pOp->
1330: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
1340: 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  SED;.#ifdef SQLI
1350: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
1360: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70  N_COMMENTS.  pOp
1370: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a  ->zComment = 0;.
1380: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1390: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
13a0: 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20   p->db->flags & 
13b0: 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
13c0: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74  Trace ){.    int
13d0: 20 6a 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72   jj, kk;.    Par
13e0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e  se *pParse = p->
13f0: 70 50 61 72 73 65 3b 0a 20 20 20 20 66 6f 72 28  pParse;.    for(
1400: 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49  jj=kk=0; jj<SQLI
1410: 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 6a  TE_N_COLCACHE; j
1420: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  j++){.      stru
1430: 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 78 20  ct yColCache *x 
1440: 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61  = pParse->aColCa
1450: 63 68 65 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20  che + jj;.      
1460: 69 66 28 20 78 2d 3e 69 4c 65 76 65 6c 3e 70 50  if( x->iLevel>pP
1470: 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65  arse->iCacheLeve
1480: 6c 20 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d 30 20  l || x->iReg==0 
1490: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14a0: 20 20 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d    printf(" r[%d]
14b0: 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52  ={%d:%d}", x->iR
14c0: 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78  eg, x->iTable, x
14d0: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
14e0: 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20    kk++;.    }.  
14f0: 20 20 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74    if( kk ) print
1500: 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c  f("\n");.    sql
1510: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
1520: 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  0, i, &p->aOp[i]
1530: 29 3b 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f  );.    test_addo
1540: 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a  p_breakpoint();.
1550: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
1560: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
1570: 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30   pOp->cycles = 0
1580: 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30  ;.  pOp->cnt = 0
1590: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
15a0: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
15b0: 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63  RAGE.  pOp->iSrc
15c0: 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Line = 0;.#endif
15d0: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69  .  return i;.}.i
15e0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
15f0: 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp0(Vdbe *p, in
1600: 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  t op){.  return 
1610: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1620: 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30  3(p, op, 0, 0, 0
1630: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
1640: 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20  VdbeAddOp1(Vdbe 
1650: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1660: 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  p1){.  return sq
1670: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1680: 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29  p, op, p1, 0, 0)
1690: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
16a0: 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a  dbeAddOp2(Vdbe *
16b0: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
16c0: 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65  1, int p2){.  re
16d0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
16e0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
16f0: 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  , p2, 0);.}.../*
1700: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
1710: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
1720: 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20  the p4 value as 
1730: 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e  a pointer..*/.in
1740: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1750: 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  Op4(.  Vdbe *p, 
1760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1770: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
1780: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
1790: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
17a0: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
17b0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17d0: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
17e0: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
17f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
1800: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1810: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
1820: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
1830: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  and */.  const c
1840: 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20  har *zP4,    /* 
1850: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a  The P4 operand *
1860: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20  /.  int p4type  
1870: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70          /* P4 op
1880: 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b  erand type */.){
1890: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
18a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
18b0: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
18c0: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
18d0: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64  eChangeP4(p, add
18e0: 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b  r, zP4, p4type);
18f0: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1900: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  }../*.** Add an 
1910: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c  opcode that incl
1920: 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75  udes the p4 valu
1930: 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36  e with a P4_INT6
1940: 34 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73  4 type..*/.int s
1950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1960: 44 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c  Dup8(.  Vdbe *p,
1970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1980: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
1990: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
19a0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
19b0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
19c0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19e0: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
19f0: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1a00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1a10: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1a20: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1a30: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1a40: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1a50: 75 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a  u8 *zP4,      /*
1a60: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1a70: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
1a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
1a90: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
1aa0: 7b 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79  {.  char *p4copy
1ab0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1ac0: 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56 64 62  ocRaw(sqlite3Vdb
1ad0: 65 44 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66  eDb(p), 8);.  if
1ae0: 28 20 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70  ( p4copy ) memcp
1af0: 79 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38  y(p4copy, zP4, 8
1b00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1b10: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c  te3VdbeAddOp4(p,
1b20: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c   op, p1, p2, p3,
1b30: 20 70 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29   p4copy, p4type)
1b40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1b50: 6e 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61  n OP_ParseSchema
1b60: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
1b70: 6f 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e  outine is broken
1b80: 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c   out from.** sql
1b90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 29  ite3VdbeAddOp4()
1ba0: 20 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20   since it needs 
1bb0: 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f  to also needs to
1bc0: 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73   mark all btrees
1bd0: 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65  .** as having be
1be0: 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  en used..**.** T
1bf0: 68 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67  he zWhere string
1c00: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1c10: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
1c20: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
1c30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1c40: 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73  will take owners
1c50: 68 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  hip of the alloc
1c60: 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  ated memory..*/.
1c70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1c80: 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70  AddParseSchemaOp
1c90: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
1ca0: 62 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29  b, char *zWhere)
1cb0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74  {.  int j;.  int
1cc0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1cd0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f  dbeAddOp3(p, OP_
1ce0: 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
1cf0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
1d00: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70  e3VdbeChangeP4(p
1d10: 2c 20 61 64 64 72 2c 20 7a 57 68 65 72 65 2c 20  , addr, zWhere, 
1d20: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66  P4_DYNAMIC);.  f
1d30: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d  or(j=0; j<p->db-
1d40: 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74  >nDb; j++) sqlit
1d50: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
1d60: 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, j);.}../*.** 
1d70: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1d80: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1d90: 70 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69  p4 value as an i
1da0: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  nteger..*/.int s
1db0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1dc0: 49 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  Int(.  Vdbe *p, 
1dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1de0: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
1df0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
1e00: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
1e10: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
1e20: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e40: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
1e50: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
1e60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
1e70: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1e80: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
1e90: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
1ea0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20  and */.  int p4 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec0: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61  The P4 operand a
1ed0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
1ee0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  ){.  int addr = 
1ef0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f00: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
1f10: 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   p3);.  sqlite3V
1f20: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
1f30: 64 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f  ddr, SQLITE_INT_
1f40: 54 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49  TO_PTR(p4), P4_I
1f50: 4e 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  NT32);.  return 
1f60: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
1f70: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
1f80: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
1f90: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
1fa0: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
1fb0: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
1fc0: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
1fd0: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
1fe0: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1ff0: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
2000: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
2010: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
2020: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
2030: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
2040: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
2050: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
2060: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
2070: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
2080: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
2090: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
20a0: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
20b0: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
20c0: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
20d0: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
20e0: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
20f0: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
2100: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
2110: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
2120: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
2130: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
2140: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
2150: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
2160: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
2170: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
2180: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
2190: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
21a0: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
21b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ed..**.** Zero i
21c0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
21d0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
21e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
21f0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65  beMakeLabel(Vdbe
2200: 20 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *v){.  Parse *p
2210: 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = v->pParse;.  
2220: 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65  int i = p->nLabe
2230: 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76  l++;.  assert( v
2240: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2250: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
2260: 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30  ( (i & (i-1))==0
2270: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
2280: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  l = sqlite3DbRea
2290: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62  llocOrFree(p->db
22a0: 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20  , p->aLabel, .  
22b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a       (i*2+1)*siz
22e0: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
22f0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
2300: 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70  >aLabel ){.    p
2310: 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31  ->aLabel[i] = -1
2320: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
2330: 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  1-i;.}../*.** Re
2340: 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20  solve label "x" 
2350: 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73  to be the addres
2360: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
2370: 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20  struction to.** 
2380: 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68  be inserted.  Th
2390: 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20  e parameter "x" 
23a0: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
23b0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
23c0: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
23d0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
23e0: 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  abel()..*/.void 
23f0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2400: 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c  veLabel(Vdbe *v,
2410: 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65   int x){.  Parse
2420: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
2430: 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b  .  int j = -1-x;
2440: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
2450: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2460: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
2470: 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  ( j<p->nLabel );
2480: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6a 3e  .  if( ALWAYS(j>
2490: 3d 30 29 20 26 26 20 70 2d 3e 61 4c 61 62 65 6c  =0) && p->aLabel
24a0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
24b0: 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20  l[j] = v->nOp;. 
24c0: 20 7d 0a 20 20 70 2d 3e 69 46 69 78 65 64 4f 70   }.  p->iFixedOp
24d0: 20 3d 20 76 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d   = v->nOp - 1;.}
24e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65  ../*.** Mark the
24f0: 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61   VDBE as one tha
2500: 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75  t can only be ru
2510: 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76  n one time..*/.v
2520: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
2530: 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20  unOnlyOnce(Vdbe 
2540: 2a 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c  *p){.  p->runOnl
2550: 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69  yOnce = 1;.}..#i
2560: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2570: 47 20 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65  G /* sqlite3Asse
2580: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67  rtMayAbort() log
2590: 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ic */../*.** The
25a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20   following type 
25b0: 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  and function are
25c0: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
25d0: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63   through all opc
25e0: 6f 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62  odes.** in a Vdb
25f0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61  e main program a
2600: 6e 64 20 65 61 63 68 20 6f 66 20 74 68 65 20 73  nd each of the s
2610: 75 62 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69  ub-programs (tri
2620: 67 67 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a  ggers) it may .*
2630: 2a 20 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c  * invoke directl
2640: 79 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e  y or indirectly.
2650: 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73   It should be us
2660: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
2670: 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  *.**   Op *pOp;.
2680: 2a 2a 20 20 20 56 64 62 65 4f 70 49 74 65 72 20  **   VdbeOpIter 
2690: 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d  sIter;.**.**   m
26a0: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
26b0: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
26c0: 0a 2a 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20  .**   sIter.v = 
26d0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
26f0: 20 76 20 69 73 20 6f 66 20 74 79 70 65 20 56 64   v is of type Vd
2700: 62 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28  be* .**   while(
2710: 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65   (pOp = opIterNe
2720: 78 74 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a  xt(&sIter)) ){.*
2730: 2a 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65  *     // Do some
2740: 74 68 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a  thing with pOp.*
2750: 2a 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74  *   }.**   sqlit
2760: 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
2770: 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a  sIter.apSub);.**
2780: 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72   .*/.typedef str
2790: 75 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 56  uct VdbeOpIter V
27a0: 64 62 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63  dbeOpIter;.struc
27b0: 74 20 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20  t VdbeOpIter {. 
27c0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
27e0: 64 62 65 20 74 6f 20 69 74 65 72 61 74 65 20 74  dbe to iterate t
27f0: 68 72 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64  hrough the opcod
2800: 65 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72  es of */.  SubPr
2810: 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20  ogram **apSub;  
2820: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
2830: 66 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f  f subprograms */
2840: 0a 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20  .  int nSub;    
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2860: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
2870: 65 73 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20  es in apSub */. 
2880: 20 69 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20   int iAddr;     
2890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
28a0: 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69  ddress of next i
28b0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65  nstruction to re
28c0: 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53  turn */.  int iS
28d0: 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ub;             
28e0: 20 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e       /* 0 = main
28f0: 20 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69   program, 1 = fi
2900: 72 73 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  rst sub-program 
2910: 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69  etc. */.};.stati
2920: 63 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74  c Op *opIterNext
2930: 28 56 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b  (VdbeOpIter *p){
2940: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e  .  Vdbe *v = p->
2950: 76 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20  v;.  Op *pRet = 
2960: 30 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20  0;.  Op *aOp;.  
2970: 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20  int nOp;..  if( 
2980: 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62  p->iSub<=p->nSub
2990: 20 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e   ){..    if( p->
29a0: 69 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iSub==0 ){.     
29b0: 20 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20   aOp = v->aOp;. 
29c0: 20 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f       nOp = v->nO
29d0: 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
29e0: 20 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53      aOp = p->apS
29f0: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61  ub[p->iSub-1]->a
2a00: 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20  Op;.      nOp = 
2a10: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62  p->apSub[p->iSub
2a20: 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  -1]->nOp;.    }.
2a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
2a40: 41 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20  Addr<nOp );..   
2a50: 20 70 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e   pRet = &aOp[p->
2a60: 69 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69  iAddr];.    p->i
2a70: 41 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Addr++;.    if( 
2a80: 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b  p->iAddr==nOp ){
2a90: 0a 20 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b  .      p->iSub++
2aa0: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72  ;.      p->iAddr
2ab0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 0;.    }.  . 
2ac0: 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74     if( pRet->p4t
2ad0: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
2ae0: 41 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  AM ){.      int 
2af0: 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62  nByte = (p->nSub
2b00: 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  +1)*sizeof(SubPr
2b10: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69  ogram*);.      i
2b20: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
2b30: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20  j=0; j<p->nSub; 
2b40: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
2b50: 28 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70  ( p->apSub[j]==p
2b60: 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d  Ret->p4.pProgram
2b70: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2b80: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70  }.      if( j==p
2b90: 2d 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ->nSub ){.      
2ba0: 20 20 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c    p->apSub = sql
2bb0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
2bc0: 72 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70  ree(v->db, p->ap
2bd0: 53 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  Sub, nByte);.   
2be0: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53       if( !p->apS
2bf0: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ub ){.          
2c00: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
2c10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c20: 20 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e     p->apSub[p->n
2c30: 53 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70  Sub++] = pRet->p
2c40: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
2c50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c60: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2c70: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
2c80: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 70 72   Check if the pr
2c90: 6f 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20  ogram stored in 
2ca0: 74 68 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65  the VM associate
2cb0: 64 20 77 69 74 68 20 70 50 61 72 73 65 20 6d 61  d with pParse ma
2cc0: 79 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42  y.** throw an AB
2cd0: 4f 52 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63  ORT exception (c
2ce0: 61 75 73 69 6e 67 20 74 68 65 20 73 74 61 74 65  ausing the state
2cf0: 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e  ment, but not en
2d00: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2d10: 0a 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  .** to be rolled
2d20: 20 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e   back). This con
2d30: 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69  dition is true i
2d40: 66 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  f the main progr
2d50: 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62  am or any.** sub
2d60: 2d 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69  -programs contai
2d70: 6e 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  ns any of the fo
2d80: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2d90: 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68   *  OP_Halt with
2da0: 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54   P1=SQLITE_CONST
2db0: 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f  RAINT and P2=OE_
2dc0: 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f  Abort..**   *  O
2dd0: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74  P_HaltIfNull wit
2de0: 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  h P1=SQLITE_CONS
2df0: 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45  TRAINT and P2=OE
2e00: 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20  _Abort..**   *  
2e10: 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20  OP_Destroy.**   
2e20: 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a  *  OP_VUpdate.**
2e30: 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65     *  OP_VRename
2e40: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f  .**   *  OP_FkCo
2e50: 75 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30  unter with P2==0
2e60: 20 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65   (immediate fore
2e70: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
2e80: 6e 74 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43  nt).**   *  OP_C
2e90: 72 65 61 74 65 54 61 62 6c 65 20 61 6e 64 20 4f  reateTable and O
2ea0: 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20  P_InitCoroutine 
2eb0: 28 66 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c  (for CREATE TABL
2ec0: 45 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29  E AS SELECT ...)
2ed0: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63  .**.** Then chec
2ee0: 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  k that the value
2ef0: 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f   of Parse.mayAbo
2f00: 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e  rt is true if an
2f10: 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65  .** ABORT may be
2f20: 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73   thrown, or fals
2f30: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74  e otherwise. Ret
2f40: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64  urn true if it d
2f50: 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72  oes.** match, or
2f60: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
2f70: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2f80: 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62  is intended to b
2f90: 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72  e used as.** par
2fa0: 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73  t of an assert s
2fb0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20  tatement in the 
2fc0: 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61  compiler. Simila
2fd0: 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  r to:.**.**   as
2fe0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
2ff0: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
3000: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70  pParse->pVdbe, p
3010: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
3020: 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   );.*/.int sqlit
3030: 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41  e3VdbeAssertMayA
3040: 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e  bort(Vdbe *v, in
3050: 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69  t mayAbort){.  i
3060: 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b  nt hasAbort = 0;
3070: 0a 20 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e  .  int hasFkCoun
3080: 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ter = 0;.  int h
3090: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20  asCreateTable = 
30a0: 30 3b 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74  0;.  int hasInit
30b0: 43 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20  Coroutine = 0;. 
30c0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65   Op *pOp;.  Vdbe
30d0: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20  OpIter sIter;.  
30e0: 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30  memset(&sIter, 0
30f0: 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29  , sizeof(sIter))
3100: 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  ;.  sIter.v = v;
3110: 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  ..  while( (pOp 
3120: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
3130: 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ter))!=0 ){.    
3140: 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70  int opcode = pOp
3150: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66  ->opcode;.    if
3160: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73  ( opcode==OP_Des
3170: 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  troy || opcode==
3180: 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70  OP_VUpdate || op
3190: 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65  code==OP_VRename
31a0: 20 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f   .     || ((opco
31b0: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f  de==OP_Halt || o
31c0: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66  pcode==OP_HaltIf
31d0: 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20  Null) .      && 
31e0: 28 28 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d  ((pOp->p1&0xff)=
31f0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
3200: 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f  NT && pOp->p2==O
3210: 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b  E_Abort)).    ){
3220: 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20  .      hasAbort 
3230: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
3240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3250: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74  opcode==OP_Creat
3260: 65 54 61 62 6c 65 20 29 20 68 61 73 43 72 65 61  eTable ) hasCrea
3270: 74 65 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  teTable = 1;.   
3280: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
3290: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20  InitCoroutine ) 
32a0: 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  hasInitCoroutine
32b0: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
32c0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
32d0: 4e 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70  N_KEY.    if( op
32e0: 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74  code==OP_FkCount
32f0: 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30  er && pOp->p1==0
3300: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29   && pOp->p2==1 )
3310: 7b 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75  {.      hasFkCou
3320: 6e 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  nter = 1;.    }.
3330: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c  #endif.  }.  sql
3340: 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
3350: 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a  , sIter.apSub);.
3360: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  .  /* Return tru
3370: 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d  e if hasAbort==m
3380: 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61  ayAbort. Or if a
3390: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
33a0: 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49  occurred..  ** I
33b0: 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c  f malloc failed,
33c0: 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28   then the while(
33d0: 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79  ) loop above may
33e0: 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74   not have iterat
33f0: 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ed.  ** through 
3400: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20  all opcodes and 
3410: 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20  hasAbort may be 
3420: 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  set incorrectly.
3430: 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75   Return.  ** tru
3440: 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20  e for this case 
3450: 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61  to prevent the a
3460: 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63  ssert() in the c
3470: 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a  allers frame.  *
3480: 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20  * from failing. 
3490: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76   */.  return ( v
34a0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
34b0: 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d  ed || hasAbort==
34c0: 6d 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46  mayAbort || hasF
34d0: 6b 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20  kCounter.       
34e0: 20 20 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72         || (hasCr
34f0: 65 61 74 65 54 61 62 6c 65 20 26 26 20 68 61 73  eateTable && has
3500: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 29  InitCoroutine) )
3510: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
3520: 4c 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65  LITE_DEBUG - the
3530: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
3540: 79 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f  yAbort() functio
3550: 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70  n */../*.** Loop
3560: 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f   through the pro
3570: 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  gram looking for
3580: 20 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20   P2 values that 
3590: 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20  are negative.** 
35a0: 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  on jump instruct
35b0: 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68  ions.  Each such
35c0: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
35d0: 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a  l.  Resolve the.
35e0: 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  ** label by sett
35f0: 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65  ing the P2 value
3600: 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
3610: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a  non-zero value..
3620: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3630: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
3640: 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f  e after all opco
3650: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  des have been in
3660: 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61  serted..**.** Va
3670: 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63  riable *pMaxFunc
3680: 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74  Args is set to t
3690: 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  he maximum value
36a0: 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d   of any P2 argum
36b0: 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50  ent .** to an OP
36c0: 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67  _Function, OP_Ag
36d0: 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c  gStep or OP_VFil
36e0: 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73  ter opcode. This
36f0: 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   is used by .** 
3700: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
3710: 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74  eady() to size t
3720: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
3730: 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  array..**.** The
3740: 20 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c   Op.opflags fiel
3750: 64 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20  d is set on all 
3760: 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74  opcodes..*/.stat
3770: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50  ic void resolveP
3780: 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c  2Values(Vdbe *p,
3790: 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72   int *pMaxFuncAr
37a0: 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gs){.  int i;.  
37b0: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a  int nMaxArgs = *
37c0: 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20  pMaxFuncArgs;.  
37d0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65  Op *pOp;.  Parse
37e0: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
37f0: 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61  arse;.  int *aLa
3800: 62 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c  bel = pParse->aL
3810: 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f  abel;.  p->readO
3820: 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49  nly = 1;.  p->bI
3830: 73 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66  sReader = 0;.  f
3840: 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69  or(pOp=p->aOp, i
3850: 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b  =p->nOp-1; i>=0;
3860: 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i--, pOp++){.  
3870: 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f    u8 opcode = pO
3880: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20  p->opcode;..    
3890: 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65  /* NOTE: Be sure
38a0: 20 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63   to update mkopc
38b0: 6f 64 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64  odeh.awk when ad
38c0: 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67  ding or removing
38d0: 0a 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72  .    ** cases fr
38e0: 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20  om this switch! 
38f0: 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  */.    switch( o
3900: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63  pcode ){.      c
3910: 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  ase OP_Transacti
3920: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  on: {.        if
3930: 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70  ( pOp->p2!=0 ) p
3940: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
3950: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20          /* fall 
3960: 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  thru */.      }.
3970: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75        case OP_Au
3980: 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20  toCommit:.      
3990: 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e  case OP_Savepoin
39a0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  t: {.        p->
39b0: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
39c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
39d0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
39e0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
39f0: 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63      case OP_Chec
3a00: 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20  kpoint:.#endif. 
3a10: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63       case OP_Vac
3a20: 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20  uum:.      case 
3a30: 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20  OP_JournalMode: 
3a40: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61  {.        p->rea
3a50: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
3a60: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
3a70: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
3a80: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  ak;.      }.#ifn
3a90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3aa0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
3ab0: 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61     case OP_VUpda
3ac0: 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  te: {.        if
3ad0: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
3ae0: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
3af0: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
3b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3b10: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46        case OP_VF
3b20: 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20  ilter: {.       
3b30: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
3b40: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d  assert( p->nOp -
3b50: 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20   i >= 3 );.     
3b60: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
3b70: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  1].opcode==OP_In
3b80: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20  teger );.       
3b90: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
3ba0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  .        if( n>n
3bb0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
3bc0: 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  gs = n;.        
3bd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
3be0: 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65  endif.      case
3bf0: 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20   OP_Next:.      
3c00: 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70  case OP_NextIfOp
3c10: 65 6e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  en:.      case O
3c20: 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a  P_SorterNext: {.
3c30: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
3c40: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
3c50: 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20  e3BtreeNext;.   
3c60: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
3c70: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
3c80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3c90: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3ca0: 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20   OP_Prev:.      
3cb0: 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70  case OP_PrevIfOp
3cc0: 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f  en: {.        pO
3cd0: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d  p->p4.xAdvance =
3ce0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
3cf0: 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70  vious;.        p
3d00: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3d10: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
3d20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3d30: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e      }..    pOp->
3d40: 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  opflags = sqlite
3d50: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
3d60: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28  opcode];.    if(
3d70: 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26   (pOp->opflags &
3d80: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
3d90: 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a  && pOp->p2<0 ){.
3da0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31        assert( -1
3db0: 2d 70 4f 70 2d 3e 70 32 3c 70 50 61 72 73 65 2d  -pOp->p2<pParse-
3dc0: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
3dd0: 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65   pOp->p2 = aLabe
3de0: 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20  l[-1-pOp->p2];. 
3df0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
3e00: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
3e10: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b  pParse->aLabel);
3e20: 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65  .  pParse->aLabe
3e30: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  l = 0;.  pParse-
3e40: 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a  >nLabel = 0;.  *
3e50: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
3e60: 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72  MaxArgs;.  asser
3e70: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21  t( p->bIsReader!
3e80: 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a  =0 || DbMaskAllZ
3e90: 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  ero(p->btreeMask
3ea0: 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ) );.}../*.** Re
3eb0: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
3ec0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
3ed0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
3ee0: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
3ef0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3f00: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
3f10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3f20: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3f30: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
3f40: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
3f50: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3f60: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
3f70: 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  r to the array o
3f80: 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69  f opcodes associ
3f90: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
3fa0: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
3fb0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
3fc0: 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61  nt. It is the ca
3fd0: 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
3fe0: 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e  lity.** to arran
3ff0: 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72  ge for the retur
4000: 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20  ned array to be 
4010: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
4020: 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76   using the .** v
4030: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29  dbeFreeOpArray()
4040: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
4050: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
4060: 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20  g, *pnOp is set 
4070: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
4080: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
4090: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61  returned.** arra
40a0: 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41  y. Also, *pnMaxA
40b0: 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  rg is set to the
40c0: 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63   larger of its c
40d0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64  urrent value and
40e0: 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20   .** the number 
40f0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
4100: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
4110: 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f  rray required to
4120: 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a   execute the .**
4130: 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61   returned progra
4140: 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  m..*/.VdbeOp *sq
4150: 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41  lite3VdbeTakeOpA
4160: 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e  rray(Vdbe *p, in
4170: 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e  t *pnOp, int *pn
4180: 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f  MaxArg){.  VdbeO
4190: 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *aOp = p->aOp;
41a0: 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26  .  assert( aOp &
41b0: 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  & !p->db->malloc
41c0: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20  Failed );..  /* 
41d0: 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74  Check that sqlit
41e0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
41f0: 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ) was not called
4200: 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   on this VM */. 
4210: 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41   assert( DbMaskA
4220: 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d  llZero(p->btreeM
4230: 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c  ask) );..  resol
4240: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e  veP2Values(p, pn
4250: 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70  MaxArg);.  *pnOp
4260: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e   = p->nOp;.  p->
4270: 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  aOp = 0;.  retur
4280: 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aOp;.}../*.** 
4290: 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74  Add a whole list
42a0: 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   of operations t
42b0: 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
42c0: 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74  stack.  Return t
42d0: 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66  he.** address of
42e0: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
42f0: 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69  tion added..*/.i
4300: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
4310: 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c  dOpList(Vdbe *p,
4320: 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70   int nOp, VdbeOp
4330: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c  List const *aOp,
4340: 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 29 7b 0a 20   int iLineno){. 
4350: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73   int addr;.  ass
4360: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
4370: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
4380: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
4390: 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73 65   nOp > p->pParse
43a0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72  ->nOpAlloc && gr
43b0: 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f 70  owOpArray(p, nOp
43c0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
43d0: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  0;.  }.  addr = 
43e0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c  p->nOp;.  if( AL
43f0: 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20  WAYS(nOp>0) ){. 
4400: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64     int i;.    Vd
4410: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
4420: 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66  pIn = aOp;.    f
4430: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
4440: 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20  ++, pIn++){.    
4450: 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e    int p2 = pIn->
4460: 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  p2;.      VdbeOp
4470: 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70   *pOut = &p->aOp
4480: 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20  [i+addr];.      
4490: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70  pOut->opcode = p
44a0: 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  In->opcode;.    
44b0: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e    pOut->p1 = pIn
44c0: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ->p1;.      if( 
44d0: 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p2<0 ){.        
44e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f  assert( sqlite3O
44f0: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f  pcodeProperty[pO
4500: 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  ut->opcode] & OP
4510: 46 4c 47 5f 4a 55 4d 50 20 29 3b 0a 20 20 20 20  FLG_JUMP );.    
4520: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61      pOut->p2 = a
4530: 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a  ddr + ADDR(p2);.
4540: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4550: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
4560: 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p2;.      }.    
4570: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e    pOut->p3 = pIn
4580: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p3;.      pOut
4590: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
45a0: 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75  TUSED;.      pOu
45b0: 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  t->p4.p = 0;.   
45c0: 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b     pOut->p5 = 0;
45d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
45e0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
45f0: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 70 4f 75  MMENTS.      pOu
4600: 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  t->zComment = 0;
4610: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4620: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
4630: 41 47 45 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  AGE.      pOut->
4640: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65  iSrcLine = iLine
4650: 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20  no+i;.#else.    
4660: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b    (void)iLineno;
4670: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4680: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
4690: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
46a0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
46b0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
46c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
46d0: 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64  ePrintOp(0, i+ad
46e0: 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  dr, &p->aOp[i+ad
46f0: 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  dr]);.      }.#e
4700: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
4710: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20  ->nOp += nOp;.  
4720: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
4730: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
4740: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
4750: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f  MT_SCANSTATUS)./
4760: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72  *.** Add an entr
4770: 79 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  y to the array o
4780: 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67  f counters manag
4790: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74  ed by sqlite3_st
47a0: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e  mt_scanstatus().
47b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
47c0: 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a  VdbeScanStatus(.
47d0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73    /* VM to add s
4800: 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a  canstatus() to *
4810: 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c  /.  int addrExpl
4820: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ain,            
4830: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4840: 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72  f OP_Explain (or
4850: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64   0) */.  int add
4860: 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  rLoop,          
4870: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
4880: 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e  ess of loop coun
4890: 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64  ter */ .  int ad
48a0: 64 72 56 69 73 69 74 2c 20 20 20 20 20 20 20 20  drVisit,        
48b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
48c0: 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73  ress of rows vis
48d0: 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ited counter */.
48e0: 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20    LogEst nEst,  
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4900: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e    /* Estimated n
4910: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
4920: 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rows */.  const 
4930: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
4940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
4950: 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e  e of table or in
4960: 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  dex being scanne
4970: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  d */.){.  int nB
4980: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b  yte = (p->nScan+
4990: 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e  1) * sizeof(Scan
49a0: 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e 53  Status);.  ScanS
49b0: 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61  tatus *aNew;.  a
49c0: 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74 75  New = (ScanStatu
49d0: 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c  s*)sqlite3DbReal
49e0: 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53  loc(p->db, p->aS
49f0: 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  can, nByte);.  i
4a00: 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 53  f( aNew ){.    S
4a10: 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77 20  canStatus *pNew 
4a20: 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e  = &aNew[p->nScan
4a30: 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ++];.    pNew->a
4a40: 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64 64  ddrExplain = add
4a50: 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e  rExplain;.    pN
4a60: 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61  ew->addrLoop = a
4a70: 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65  ddrLoop;.    pNe
4a80: 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20 61  w->addrVisit = a
4a90: 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70 4e  ddrVisit;.    pN
4aa0: 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b  ew->nEst = nEst;
4ab0: 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  .    pNew->zName
4ac0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
4ad0: 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  up(p->db, zName)
4ae0: 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d  ;.    p->aScan =
4af0: 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   aNew;.  }.}.#en
4b00: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
4b10: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
4b20: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
4b30: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
4b40: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
4b50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4b60: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
4b70: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
4b80: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
4b90: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
4ba0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4bb0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
4bc0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
4bd0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
4be0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
4bf0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4c00: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
4c10: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
4c20: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
4c30: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
4c40: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
4c50: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
4c60: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
4c70: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
4c80: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
4c90: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
4ca0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
4cb0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
4cc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4cd0: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
4ce0: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
4cf0: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
4d00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4d10: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33  geP2(Vdbe *p, u3
4d20: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
4d30: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
4d40: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
4d50: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
4d60: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
4d70: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
4d80: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4d90: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
4da0: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
4db0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
4dc0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
4dd0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4de0: 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P3(Vdbe *p, u32 
4df0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
4e00: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
4e10: 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d  ;.  if( ((u32)p-
4e20: 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20  >nOp)>addr ){.  
4e30: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
4e40: 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  3 = val;.  }.}..
4e50: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4e60: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35   value of the P5
4e70: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65   operand for the
4e80: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
4e90: 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f  * added operatio
4ea0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
4eb0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56  e3VdbeChangeP5(V
4ec0: 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b  dbe *p, u8 val){
4ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
4ee0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20  );.  if( p->aOp 
4ef0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4f00: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70  ->nOp>0 );.    p
4f10: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
4f20: 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p5 = val;.  }.}.
4f30: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
4f40: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
4f50: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
4f60: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
4f70: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
4f80: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
4f90: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
4fa0: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
4fb0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
4fc0: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
4fd0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69  nt addr){.  sqli
4fe0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
4ff0: 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29  p, addr, p->nOp)
5000: 3b 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d 3e 69  ;.  p->pParse->i
5010: 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70  FixedOp = p->nOp
5020: 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   - 1;.}.../*.** 
5030: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
5040: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
5050: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
5060: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
5070: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
5080: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
5090: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
50a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
50b0: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
50c0: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
50d0: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  , FuncDef *pDef)
50e0: 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
50f0: 44 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66  Def) && (pDef->f
5100: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
5110: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
5120: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
5130: 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b  bFree(db, pDef);
5140: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
5150: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
5160: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f  ray(sqlite3 *, O
5170: 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  p *, int);../*.*
5180: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
5190: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
51a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
51b0: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
51c0: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
51d0: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66   void *p4){.  if
51e0: 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65  ( p4 ){.    asse
51f0: 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77  rt( db );.    sw
5200: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
5210: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
5220: 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 20  NCCTX: {.       
5230: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
5240: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 28 73 71 6c  nction(db, ((sql
5250: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34  ite3_context*)p4
5260: 29 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20  )->pFunc);.     
5270: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
5280: 67 68 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74  gh into the next
5290: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 7d   case */.      }
52a0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52  .      case P4_R
52b0: 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EAL:.      case 
52c0: 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20  P4_INT64:.      
52d0: 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a  case P4_DYNAMIC:
52e0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49  .      case P4_I
52f0: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
5300: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5310: 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20  (db, p4);.      
5320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5330: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
5340: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
5350: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
5360: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
5370: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
5380: 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20  (KeyInfo*)p4);. 
5390: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
53a0: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
53b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
53c0: 52 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 63 61  R_HINTS.      ca
53d0: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20  se P4_EXPR: {.  
53e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
53f0: 72 44 65 6c 65 74 65 28 64 62 2c 20 28 45 78 70  rDelete(db, (Exp
5400: 72 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20  r*)p4);.        
5410: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
5420: 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65  endif.      case
5430: 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20   P4_MPRINTF: {. 
5440: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
5450: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
5460: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34   sqlite3_free(p4
5470: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5480: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5490: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
54a0: 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45   {.        freeE
54b0: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
54c0: 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70  (db, (FuncDef*)p
54d0: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
54e0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
54f0: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
5500: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
5510: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
5520: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
5530: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73  ite3ValueFree((s
5540: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34  qlite3_value*)p4
5550: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
5560: 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20  {.          Mem 
5570: 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20  *p = (Mem*)p4;. 
5580: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
5590: 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  szMalloc ) sqlit
55a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
55b0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
55c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
55d0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
55e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
55f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5600: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
5610: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
5620: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
5630: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
5640: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
5650: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
5660: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5670: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
5680: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
5690: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
56a0: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
56b0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
56c0: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
56d0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
56e0: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
56f0: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
5700: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
5710: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
5720: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
5730: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
5740: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
5750: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
5760: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
5770: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
5780: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
5790: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
57a0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
57b0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
57c0: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66  p->p4.p);.#ifdef
57d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
57e0: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
57f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
5800: 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f  ree(db, pOp->zCo
5810: 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20  mment);.#endif  
5820: 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20     .    }.  }.  
5830: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5840: 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , aOp);.}../*.**
5850: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f   Link the SubPro
5860: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73  gram object pass
5870: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
5880: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74   argument into t
5890: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73  he linked.** lis
58a0: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72  t at Vdbe.pSubPr
58b0: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74  ogram. This list
58c0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65   is used to dele
58d0: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72  te all sub-progr
58e0: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68  am.** objects wh
58f0: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20  en the VM is no 
5900: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e  longer required.
5910: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5920: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72  VdbeLinkSubProgr
5930: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  am(Vdbe *pVdbe, 
5940: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a  SubProgram *p){.
5950: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64    p->pNext = pVd
5960: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  be->pProgram;.  
5970: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20  pVdbe->pProgram 
5980: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  = p;.}../*.** Ch
5990: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20  ange the opcode 
59a0: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f  at addr into OP_
59b0: 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  Noop.*/.void sql
59c0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
59d0: 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  Noop(Vdbe *p, in
59e0: 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 61  t addr){.  if( a
59f0: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  ddr<p->nOp ){.  
5a00: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
5a10: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
5a20: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
5a30: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72 65 65   p->db;.    free
5a40: 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  P4(db, pOp->p4ty
5a50: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
5a60: 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20      memset(pOp, 
5a70: 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d  0, sizeof(pOp[0]
5a80: 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63  ));.    pOp->opc
5a90: 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
5aa0: 20 20 20 69 66 28 20 61 64 64 72 3d 3d 70 2d 3e     if( addr==p->
5ab0: 6e 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f 70 2d 2d  nOp-1 ) p->nOp--
5ac0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
5ad0: 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64  f the last opcod
5ae0: 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74  e is "op" and it
5af0: 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64   is not a jump d
5b00: 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74  estination,.** t
5b10: 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20  hen remove it.  
5b20: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
5b30: 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70  nd only if an op
5b40: 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64  code was removed
5b50: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5b60: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
5b70: 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75  pcode(Vdbe *p, u
5b80: 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d  8 op){.  if( (p-
5b90: 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72  >nOp-1)>(p->pPar
5ba0: 73 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26  se->iFixedOp) &&
5bb0: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5bc0: 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a  ].opcode==op ){.
5bd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
5be0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70  hangeToNoop(p, p
5bf0: 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65  ->nOp-1);.    re
5c00: 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  turn 1;.  }else{
5c10: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5c20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
5c30: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
5c40: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66  the P4 operand f
5c50: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
5c60: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
5c70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5c80: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
5c90: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
5ca0: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
5cb0: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
5cc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5cd0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
5ce0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
5cf0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
5d00: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
5d10: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74  .**.** If n>=0 t
5d20: 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61  hen the P4 opera
5d30: 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d  nd is dynamic, m
5d40: 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f  eaning that a co
5d50: 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72  py of.** the str
5d60: 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f  ing is made into
5d70: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
5d80: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
5d90: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c  lloc()..** A val
5da0: 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73  ue of n==0 means
5db0: 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a   copy bytes of z
5dc0: 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63  P4 up to and inc
5dd0: 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  luding the.** fi
5de0: 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20  rst null byte.  
5df0: 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79  If n>0 then copy
5e00: 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50   n+1 bytes of zP
5e10: 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20  4..** .** Other 
5e20: 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f  values of n (P4_
5e30: 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53  STATIC, P4_COLLS
5e40: 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74  EQ etc.) indicat
5e50: 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  e that zP4 point
5e60: 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67  s.** to a string
5e70: 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68   or structure th
5e80: 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  at is guaranteed
5e90: 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68   to exist for th
5ea0: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a  e lifetime of.**
5eb0: 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68   the Vdbe. In th
5ec0: 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e  ese cases we can
5ed0: 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70   just copy the p
5ee0: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ointer..**.** If
5ef0: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
5f00: 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  nge P4 on the mo
5f10: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
5f20: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
5f30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5f40: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64  3VdbeChangeP4(Vd
5f50: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
5f60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
5f70: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
5f80: 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pOp;.  sqlite3 *
5f90: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  db;.  assert( p!
5fa0: 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
5fb0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
5fc0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
5fd0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
5fe0: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62   p->aOp==0 || db
5ff0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6000: 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f  {.    if( n!=P4_
6010: 56 54 41 42 20 29 7b 0a 20 20 20 20 20 20 66 72  VTAB ){.      fr
6020: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
6030: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
6040: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
6050: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
6060: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
6070: 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d   assert( addr<p-
6080: 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64  >nOp );.  if( ad
6090: 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72  dr<0 ){.    addr
60a0: 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20   = p->nOp - 1;. 
60b0: 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61   }.  pOp = &p->a
60c0: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73 65  Op[addr];.  asse
60d0: 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d  rt( pOp->p4type=
60e0: 3d 50 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20 20  =P4_NOTUSED.    
60f0: 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70     || pOp->p4typ
6100: 65 3d 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20 20  e==P4_INT32.    
6110: 20 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70     || pOp->p4typ
6120: 65 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b  e==P4_KEYINFO );
6130: 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f  .  freeP4(db, pO
6140: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
6150: 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34  p4.p);.  pOp->p4
6160: 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d  .p = 0;.  if( n=
6170: 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20  =P4_INT32 ){.   
6180: 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63   /* Note: this c
6190: 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63  ast is safe, bec
61a0: 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20  ause the origin 
61b0: 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61  data point was a
61c0: 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  n int.    ** tha
61d0: 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20  t was cast to a 
61e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20  (const char *). 
61f0: 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69  */.    pOp->p4.i
6200: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
6210: 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70  _INT(zP4);.    p
6220: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
6230: 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69  INT32;.  }else i
6240: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
6250: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
6260: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
6270: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
6280: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
6290: 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70  KEYINFO ){.    p
62a0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
62b0: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
62c0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49  p4type = P4_KEYI
62d0: 4e 46 4f 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NFO;.#ifdef SQLI
62e0: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
62f0: 5f 48 49 4e 54 53 0a 20 20 7d 65 6c 73 65 20 69  _HINTS.  }else i
6300: 66 28 20 6e 3d 3d 50 34 5f 45 58 50 52 20 29 7b  f( n==P4_EXPR ){
6310: 0a 20 20 20 20 2f 2a 20 52 65 73 70 6f 6e 73 69  .    /* Responsi
6320: 62 69 6c 69 74 79 20 66 6f 72 20 64 65 6c 65 74  bility for delet
6330: 69 6e 67 20 74 68 65 20 45 78 70 72 20 74 72 65  ing the Expr tre
6340: 65 20 69 73 20 68 61 6e 64 65 64 20 6f 76 65 72  e is handed over
6350: 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 56   to the.    ** V
6360: 44 42 45 20 62 79 20 74 68 69 73 20 6f 70 65 72  DBE by this oper
6370: 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 61 6c 6c  ation.  The call
6380: 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  er should have a
6390: 6c 72 65 61 64 79 20 69 6e 76 6f 6b 65 64 0a 20  lready invoked. 
63a0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 78 70     ** sqlite3Exp
63b0: 72 44 75 70 28 29 20 6f 72 20 77 68 61 74 65 76  rDup() or whatev
63c0: 65 72 20 6f 74 68 65 72 20 72 6f 75 74 69 6e 65  er other routine
63d0: 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 6d 61   is needed to ma
63e0: 6b 65 20 61 20 0a 20 20 20 20 2a 2a 20 70 72 69  ke a .    ** pri
63f0: 76 61 74 65 20 63 6f 70 79 20 6f 66 20 74 68 65  vate copy of the
6400: 20 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 70 4f   tree. */.    pO
6410: 70 2d 3e 70 34 2e 70 45 78 70 72 20 3d 20 28 45  p->p4.pExpr = (E
6420: 78 70 72 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  xpr*)zP4;.    pO
6430: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 45  p->p4type = P4_E
6440: 58 50 52 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  XPR;.#endif.  }e
6450: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54  lse if( n==P4_VT
6460: 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  AB ){.    pOp->p
6470: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
6480: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
6490: 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20 20  e = P4_VTAB;.   
64a0: 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b   sqlite3VtabLock
64b0: 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b  ((VTable *)zP4);
64c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 56  .    assert( ((V
64d0: 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62  Table *)zP4)->db
64e0: 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c  ==p->db );.  }el
64f0: 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  se if( n<0 ){.  
6500: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
6510: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
6520: 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67  p->p4type = (sig
6530: 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65  ned char)n;.  }e
6540: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  lse{.    if( n==
6550: 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  0 ) n = sqlite3S
6560: 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20  trlen30(zP4);.  
6570: 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71    pOp->p4.z = sq
6580: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
6590: 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20  ->db, zP4, n);. 
65a0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
65b0: 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d   P4_DYNAMIC;.  }
65c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
65d0: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
65e0: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
65f0: 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65  opcode to the Ke
6600: 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a  yInfo for the.**
6610: 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f   index given..*/
6620: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6630: 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61  eSetP4KeyInfo(Pa
6640: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
6650: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62  ex *pIdx){.  Vdb
6660: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
6670: 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
6680: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
6690: 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 73  ( pIdx!=0 );.  s
66a0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
66b0: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
66c0: 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f  )sqlite3KeyInfoO
66d0: 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
66e0: 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Idx),.          
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
6700: 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64  EYINFO);.}..#ifd
6710: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6720: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
6730: 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  S./*.** Change t
6740: 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
6750: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
6760: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
6770: 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74  n.  Or.** insert
6780: 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64   a No-op and add
6790: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20   the comment to 
67a0: 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63  that new instruc
67b0: 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  tion.  This.** m
67c0: 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61  akes the code ea
67d0: 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72  sier to read dur
67e0: 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20  ing debugging.  
67f0: 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70  None of this hap
6800: 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f  pens.** in a pro
6810: 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a  duction build..*
6820: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
6830: 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  beVComment(Vdbe 
6840: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
6850: 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74  zFormat, va_list
6860: 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   ap){.  assert( 
6870: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
6880: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
6890: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
68a0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
68b0: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
68c0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
68d0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
68e0: 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nOp ){.    asser
68f0: 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20  t( p->aOp );.   
6900: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
6910: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ->db, p->aOp[p->
6920: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29  nOp-1].zComment)
6930: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ;.    p->aOp[p->
6940: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20  nOp-1].zComment 
6950: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
6960: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
6970: 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  , ap);.  }.}.voi
6980: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d  d sqlite3VdbeCom
6990: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
69a0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
69b0: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
69c0: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29  st ap;.  if( p )
69d0: 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  {.    va_start(a
69e0: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
69f0: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c   vdbeVComment(p,
6a00: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
6a10: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
6a20: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
6a30: 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74  3VdbeNoopComment
6a40: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
6a50: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
6a60: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
6a70: 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  p;.  if( p ){.  
6a80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6a90: 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(p, OP_Noop);
6aa0: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
6ab0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
6ac0: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20  vdbeVComment(p, 
6ad0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
6ae0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
6af0: 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e  }.}.#endif  /* N
6b00: 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66  DEBUG */..#ifdef
6b10: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
6b20: 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ERAGE./*.** Set 
6b30: 74 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 65  the value if the
6b40: 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 20   iSrcLine field 
6b50: 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
6b60: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
6b70: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
6b80: 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e 65  lite3VdbeSetLine
6b90: 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c 20  Number(Vdbe *v, 
6ba0: 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71  int iLine){.  sq
6bb0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
6bc0: 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  ,-1)->iSrcLine =
6bd0: 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66   iLine;.}.#endif
6be0: 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 5f   /* SQLITE_VDBE_
6bf0: 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a  COVERAGE */../*.
6c00: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
6c10: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
6c20: 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68   address.  If th
6c30: 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c  e address is -1,
6c40: 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20   then.** return 
6c50: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
6c60: 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64  y inserted opcod
6c70: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  e..**.** If a me
6c80: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
6c90: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
6ca0: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
6cb0: 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a  calling of this.
6cc0: 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  ** routine, then
6cd0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
6ce0: 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c  dummy VdbeOp wil
6cf0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  l be returned.  
6d00: 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69  That opcode.** i
6d10: 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e  s readable but n
6d20: 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f  ot writable, tho
6d30: 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74  ugh it is cast t
6d40: 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c  o a writable val
6d50: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ue..** The retur
6d60: 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63  n of a dummy opc
6d70: 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ode allows the c
6d80: 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  all to continue 
6d90: 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61  functioning.** a
6da0: 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  fter an OOM faul
6db0: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
6dc0: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65   to check to see
6dd0: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66   if the return f
6de0: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  rom .** this rou
6df0: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20  tine is a valid 
6e00: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65  pointer.  But be
6e10: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e  cause the dummy.
6e20: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20  opcode is 0,.** 
6e30: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72  dummy will never
6e40: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
6e50: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65   This is verifie
6e60: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63  d by code inspec
6e70: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72  tion and.** by r
6e80: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67  unning with Valg
6e90: 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  rind..*/.VdbeOp 
6ea0: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f  *sqlite3VdbeGetO
6eb0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
6ec0: 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73  ddr){.  /* C89 s
6ed0: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68  pecifies that th
6ee0: 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d  e constant "dumm
6ef0: 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69  y" will be initi
6f00: 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20  alized to all.  
6f10: 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20  ** zeros, which 
6f20: 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56  is correct.  MSV
6f30: 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61  C generates a wa
6f40: 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c  rning, neverthel
6f50: 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ess. */.  static
6f60: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20   VdbeOp dummy;  
6f70: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53  /* Ignore the MS
6f80: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74  VC warning about
6f90: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20   no initializer 
6fa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
6fb0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
6fc0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
6fd0: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
6fe0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
6ff0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
7000: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
7010: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
7020: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7030: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
7040: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
7050: 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f     return (VdbeO
7060: 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c  p*)&dummy;.  }el
7070: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
7080: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
7090: 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  }.}..#if defined
70a0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45  (SQLITE_ENABLE_E
70b0: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29  XPLAIN_COMMENTS)
70c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
70d0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
70e0: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61  or one of the pa
70f0: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20  rameters to the 
7100: 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65  opcode pOp.** de
7110: 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72  termined by char
7120: 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74  acter c..*/.stat
7130: 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65  ic int translate
7140: 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20  P(char c, const 
7150: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20  Op *pOp){.  if( 
7160: 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20  c=='1' ) return 
7170: 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63  pOp->p1;.  if( c
7180: 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70  =='2' ) return p
7190: 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d  Op->p2;.  if( c=
71a0: 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='3' ) return pO
71b0: 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p3;.  if( c==
71c0: 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '4' ) return pOp
71d0: 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e  ->p4.i;.  return
71e0: 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a   pOp->p5;.}../*.
71f0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
7200: 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d  ing for the "com
7210: 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61  ment" field of a
7220: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73   VDBE opcode lis
7230: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
7240: 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20  Synopsis: field 
7250: 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  in comments in t
7260: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
7270: 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65   file gets conve
7280: 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78  rted.** to an ex
7290: 74 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  tra string that 
72a0: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
72b0: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
72c0: 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a  Name().  In the.
72d0: 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74  ** absence of ot
72e0: 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68  her comments, th
72f0: 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f  is synopsis beco
7300: 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  mes the comment 
7310: 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a  on the opcode..*
7320: 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69  * Some translati
7330: 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a  on occurs:.**.**
7340: 20 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20         "PX"     
7350: 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20   ->  "r[X]".**  
7360: 20 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d       "PX@PY"   -
7370: 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22  >  "r[X..X+Y-1]"
7380: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
7390: 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20   is 0 or 1.**   
73a0: 20 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e      "PX@PY+1" ->
73b0: 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20    "r[X..X+Y]"   
73c0: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
73d0: 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50  is 0.**       "P
73e0: 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58  Y..PY"  ->  "r[X
73f0: 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72  ..Y]"      or "r
7400: 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a  [x]" if y<=x.*/.
7410: 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
7420: 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e  ayComment(.  con
7430: 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20  st Op *pOp,     
7440: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f  /* The opcode to
7450: 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f   be commented */
7460: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7470: 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  P4,   /* Previou
7480: 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c  sly obtained val
7490: 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63  ue for P4 */.  c
74a0: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20  har *zTemp,     
74b0: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
74c0: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
74d0: 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f  nTemp          /
74e0: 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c  * Space availabl
74f0: 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a  e in zTemp[] */.
7500: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
7510: 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  *zOpName;.  cons
7520: 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69  t char *zSynopsi
7530: 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65  s;.  int nOpName
7540: 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a  ;.  int ii, jj;.
7550: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    zOpName = sqli
7560: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
7570: 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f  p->opcode);.  nO
7580: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  pName = sqlite3S
7590: 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29  trlen30(zOpName)
75a0: 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b  ;.  if( zOpName[
75b0: 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20  nOpName+1] ){.  
75c0: 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20    int seenCom = 
75d0: 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  0;.    char c;. 
75e0: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
75f0: 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d  OpName += nOpNam
7600: 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  e + 1;.    for(i
7610: 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70  i=jj=0; jj<nTemp
7620: 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f  -1 && (c = zSyno
7630: 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69  psis[ii])!=0; ii
7640: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  ++){.      if( c
7650: 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20  =='P' ){.       
7660: 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b   c = zSynopsis[+
7670: 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii];.        if
7680: 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20  ( c=='4' ){.    
7690: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
76a0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
76b0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
76c0: 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d   zP4);.        }
76d0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20  else if( c=='X' 
76e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
76f0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7700: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
7710: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
7720: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  mment);.        
7730: 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20    seenCom = 1;. 
7740: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
7750: 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d          int v1 =
7760: 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70   translateP(c, p
7770: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Op);.          i
7780: 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20  nt v2;.         
7790: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
77a0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
77b0: 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b  p+jj, "%d", v1);
77c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
77d0: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
77e0: 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d  +ii+1, "@P", 2)=
77f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7800: 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20    ii += 3;.     
7810: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
7820: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
7830: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20  mp+jj);.        
7840: 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61      v2 = transla
7850: 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69  teP(zSynopsis[ii
7860: 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20  ], pOp);.       
7870: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
7880: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
7890: 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "+1",2)==0 ){.  
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
78b0: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 2;.           
78c0: 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20     v2++;.       
78d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
78e0: 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20     if( v2>1 ){. 
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
7900: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7910: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
7920: 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d  , "..%d", v1+v2-
7930: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
7940: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
7950: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53  e if( strncmp(zS
7960: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e  ynopsis+ii+1, ".
7970: 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70  .P3", 4)==0 && p
7980: 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20  Op->p3==0 ){.   
7990: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34           ii += 4
79a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
79b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
79c0: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
79d0: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
79e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
79f0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b        zTemp[jj++
7a00: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = c;.      }. 
7a10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65     }.    if( !se
7a20: 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d  enCom && jj<nTem
7a30: 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d  p-5 && pOp->zCom
7a40: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ment ){.      sq
7a50: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7a60: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
7a70: 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e  j, "; %s", pOp->
7a80: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20  zComment);.     
7a90: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
7aa0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
7ab0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7ac0: 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70  jj<nTemp ) zTemp
7ad0: 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  [jj] = 0;.  }els
7ae0: 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e if( pOp->zComm
7af0: 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
7b00: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7b10: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20  p, zTemp, "%s", 
7b20: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
7b30: 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33      jj = sqlite3
7b40: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
7b50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54  .  }else{.    zT
7b60: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
7b70: 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  jj = 0;.  }.  re
7b80: 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69  turn jj;.}.#endi
7b90: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
7ba0: 47 20 2a 2f 0a 0a 0a 23 69 66 20 21 64 65 66 69  G */...#if !defi
7bb0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7bc0: 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66  EXPLAIN) || !def
7bd0: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20  ined(NDEBUG) \. 
7be0: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56      || defined(V
7bf0: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
7c00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
7c10: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  EBUG)./*.** Comp
7c20: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
7c30: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
7c40: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
7c50: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
7c60: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
7c70: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
7c80: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
7c90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
7ca0: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
7cb0: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
7cc0: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
7cd0: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
7ce0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  p;.  assert( nTe
7cf0: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74  mp>=20 );.  swit
7d00: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
7d10: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
7d20: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
7d30: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
7d40: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
7d50: 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
7d60: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  Info;.      asse
7d70: 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
7d80: 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
7d90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7da0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7db0: 6d 70 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79  mp, "k(%d", pKey
7dc0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
7dd0: 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33       i = sqlite3
7de0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
7df0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
7e00: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  j<pKeyInfo->nFie
7e10: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
7e20: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
7e30: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
7e40: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63  ll[j];.        c
7e50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
7e60: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
7e70: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b  ->zName : "nil";
7e80: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
7e90: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7ea0: 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20  (zColl);.       
7eb0: 20 69 66 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d   if( n==6 && mem
7ec0: 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52  cmp(zColl,"BINAR
7ed0: 59 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Y",6)==0 ){.    
7ee0: 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42        zColl = "B
7ef0: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d  ";.          n =
7f00: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
7f10: 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54        if( i+n>nT
7f20: 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20  emp-6 ){.       
7f30: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
7f40: 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20  [i],",...",4);. 
7f50: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7f70: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
7f80: 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ,';.        if( 
7f90: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
7fa0: 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  rder[j] ){.     
7fb0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
7fc0: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d  = '-';.        }
7fd0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
7fe0: 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c  &zTemp[i], zColl
7ff0: 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , n+1);.        
8000: 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  i += n;.      }.
8010: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
8020: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
8030: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
8040: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
8050: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
8060: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
8070: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
8080: 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61  SOR_HINTS.    ca
8090: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20  se P4_EXPR: {.  
80a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
80b0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
80c0: 70 2c 20 22 28 65 78 70 72 29 22 29 3b 0a 20 20  p, "(expr)");.  
80d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
80e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
80f0: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
8100: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
8110: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
8120: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
8130: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8140: 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e 32 30  p, zTemp, "(%.20
8150: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
8160: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
8170: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
8180: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
8190: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
81a0: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  f = pOp->p4.pFun
81b0: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
81c0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
81d0: 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22   zTemp, "%s(%d)"
81e0: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
81f0: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
8200: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
8210: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
8220: 55 47 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46  UG.    case P4_F
8230: 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20  UNCCTX: {.      
8240: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20  FuncDef *pDef = 
8250: 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46  pOp->p4.pCtx->pF
8260: 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
8270: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8280: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64  p, zTemp, "%s(%d
8290: 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c  )", pDef->zName,
82a0: 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20   pDef->nArg);.  
82b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
82c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
82d0: 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20   P4_INT64: {.   
82e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
82f0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8300: 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e  , "%lld", *pOp->
8310: 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20  p4.pI64);.      
8320: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8330: 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20   case P4_INT32: 
8340: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8350: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
8360: 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70  zTemp, "%d", pOp
8370: 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62  ->p4.i);.      b
8380: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8390: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a  case P4_REAL: {.
83a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
83b0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
83c0: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70  emp, "%.16g", *p
83d0: 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20  Op->p4.pReal);. 
83e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
83f0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
8400: 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  M: {.      Mem *
8410: 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pMem = pOp->p4.p
8420: 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Mem;.      if( p
8430: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
8440: 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20  _Str ){.        
8450: 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20  zP4 = pMem->z;. 
8460: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
8470: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
8480: 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  _Int ){.        
8490: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
84a0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
84b0: 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69  %lld", pMem->u.i
84c0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
84d0: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
84e0: 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
84f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
8500: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
8510: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65  mp, "%.16g", pMe
8520: 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  m->u.r);.      }
8530: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
8540: 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
8550: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8560: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8570: 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22  p, zTemp, "NULL"
8580: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8590: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
85a0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
85b0: 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20  M_Blob );.      
85c0: 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22    zP4 = "(blob)"
85d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
85e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
85f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8600: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
8610: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20    case P4_VTAB: 
8620: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8630: 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f  vtab *pVtab = pO
8640: 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74  p->p4.pVtab->pVt
8650: 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ab;.      sqlite
8660: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8670: 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25  , zTemp, "vtab:%
8680: 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20  p", pVtab);.    
8690: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
86a0: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
86b0: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
86c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
86d0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
86e0: 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a  p, "intarray");.
86f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8700: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53   }.    case P4_S
8710: 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20  UBPROGRAM: {.   
8720: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8730: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8740: 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  , "program");.  
8750: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8760: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56  .    case P4_ADV
8770: 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54  ANCE: {.      zT
8780: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
8790: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
87a0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
87b0: 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70      zP4 = pOp->p
87c0: 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  4.z;.      if( z
87d0: 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  P4==0 ){.       
87e0: 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20   zP4 = zTemp;.  
87f0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
8800: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
8810: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
8820: 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  zP4!=0 );.  retu
8830: 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66  rn zP4;.}.#endif
8840: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
8850: 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74  to the Vdbe that
8860: 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63   the BTree objec
8870: 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20  t at db->aDb[i] 
8880: 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  is used..**.** T
8890: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
88a0: 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b  ements need to k
88b0: 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74  now in advance t
88c0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20  he complete set 
88d0: 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  of.** attached d
88e0: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69  atabases that wi
88f0: 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61  ll be use.  A ma
8900: 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61  sk of these data
8910: 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e  bases.** is main
8920: 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72  tained in p->btr
8930: 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e  eeMask.  The p->
8940: 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69  lockMask value i
8950: 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a  s the subset of.
8960: 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  ** p->btreeMask 
8970: 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61  of databases tha
8980: 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  t will require a
8990: 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   lock..*/.void s
89a0: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
89b0: 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ree(Vdbe *p, int
89c0: 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   i){.  assert( i
89d0: 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e  >=0 && i<p->db->
89e0: 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69  nDb && i<(int)si
89f0: 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20  zeof(yDbMask)*8 
8a00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28  );.  assert( i<(
8a10: 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74  int)sizeof(p->bt
8a20: 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  reeMask)*8 );.  
8a30: 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72  DbMaskSet(p->btr
8a40: 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66  eeMask, i);.  if
8a50: 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65  ( i!=1 && sqlite
8a60: 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70  3BtreeSharable(p
8a70: 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ->db->aDb[i].pBt
8a80: 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53  ) ){.    DbMaskS
8a90: 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20  et(p->lockMask, 
8aa0: 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21  i);.  }.}..#if !
8ab0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8ac0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
8ad0: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
8ae0: 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49  ADSAFE>0./*.** I
8af0: 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  f SQLite is comp
8b00: 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  iled to support 
8b10: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
8b20: 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65  e and to be thre
8b30: 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20  adsafe,.** this 
8b40: 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20  routine obtains 
8b50: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
8b60: 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42  ated with each B
8b70: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
8b80: 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65  e.** that may be
8b90: 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65   accessed by the
8ba0: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
8bb0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f   argument. In do
8bc0: 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a  ing so it also.*
8bd0: 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61  * sets the BtSha
8be0: 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66  red.db member of
8bf0: 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53   each of the BtS
8c00: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73  hared structures
8c10: 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68  , ensuring.** th
8c20: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
8c30: 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
8c40: 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  back is invoked 
8c50: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a  if required..**.
8c60: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
8c70: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62  not threadsafe b
8c80: 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20  ut does support 
8c90: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
8ca0: 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74  e, then.** sqlit
8cb0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 69  e3BtreeEnter() i
8cc0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  s invoked to set
8cd0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
8ce0: 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66   variables.** of
8cf0: 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64   all of BtShared
8d00: 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65   structures acce
8d10: 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64  ssible via the d
8d20: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a  atabase handle .
8d30: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ** associated wi
8d40: 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a  th the VM..**.**
8d50: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
8d60: 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64  t threadsafe and
8d70: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
8d80: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
8d90: 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  ode, this.** fun
8da0: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
8db0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62  ..**.** The p->b
8dc0: 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69  treeMask field i
8dd0: 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61  s a bitmask of a
8de0: 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20 74  ll btrees that t
8df0: 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20  he prepared .** 
8e00: 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c  statement p will
8e10: 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20   ever use.  Let 
8e20: 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  N be the number 
8e30: 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74  of bits in p->bt
8e40: 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65  reeMask.** corre
8e50: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65  sponding to btre
8e60: 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72  es that use shar
8e70: 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20  ed cache.  Then 
8e80: 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a  the runtime of.*
8e90: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
8ea0: 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e  s N*N.  But as N
8eb0: 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20   is rarely more 
8ec0: 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f  than 1, this sho
8ed0: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20  uld not.** be a 
8ee0: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64  problem..*/.void
8ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
8f00: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  r(Vdbe *p){.  in
8f10: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
8f20: 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20  db;.  Db *aDb;. 
8f30: 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20   int nDb;.  if( 
8f40: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
8f50: 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74  >lockMask) ) ret
8f60: 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  urn;  /* The com
8f70: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62  mon case */.  db
8f80: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20   = p->db;.  aDb 
8f90: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62  = db->aDb;.  nDb
8fa0: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f   = db->nDb;.  fo
8fb0: 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b  r(i=0; i<nDb; i+
8fc0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31  +){.    if( i!=1
8fd0: 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70   && DbMaskTest(p
8fe0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26  ->lockMask,i) &&
8ff0: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70   ALWAYS(aDb[i].p
9000: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  Bt!=0) ){.      
9010: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
9020: 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  r(aDb[i].pBt);. 
9030: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
9040: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
9050: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
9060: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c  ED_CACHE) && SQL
9070: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
9080: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c  ./*.** Unlock al
9090: 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73 20  l of the btrees 
90a0: 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65  previously locke
90b0: 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73  d by a call to s
90c0: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
90d0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  )..*/.static SQL
90e0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
90f0: 64 20 76 64 62 65 4c 65 61 76 65 28 56 64 62 65  d vdbeLeave(Vdbe
9100: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
9110: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
9120: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
9130: 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  Db;.  db = p->db
9140: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
9150: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
9160: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  Db;.  for(i=0; i
9170: 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nDb; i++){.    
9180: 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61  if( i!=1 && DbMa
9190: 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61  skTest(p->lockMa
91a0: 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28  sk,i) && ALWAYS(
91b0: 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29  aDb[i].pBt!=0) )
91c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
91d0: 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d  treeLeave(aDb[i]
91e0: 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pBt);.    }.  }
91f0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
9200: 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70  dbeLeave(Vdbe *p
9210: 29 7b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41  ){.  if( DbMaskA
9220: 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61  llZero(p->lockMa
9230: 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  sk) ) return;  /
9240: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
9250: 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76 65  e */.  vdbeLeave
9260: 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  (p);.}.#endif..#
9270: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
9280: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
9290: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
92a0: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
92b0: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
92c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
92d0: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
92e0: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
92f0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
9300: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
9310: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
9320: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20  {.  char *zP4;. 
9330: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
9340: 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d    char zCom[100]
9350: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
9360: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20   char *zFormat1 
9370: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64  = "%4d %-13s %4d
9380: 20 25 34 64 20 25 34 64 20 25 2d 31 33 73 20 25   %4d %4d %-13s %
9390: 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28  .2X %s\n";.  if(
93a0: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
93b0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20  = stdout;.  zP4 
93c0: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
93d0: 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50   zPtr, sizeof(zP
93e0: 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  tr));.#ifdef SQL
93f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
9400: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69  IN_COMMENTS.  di
9410: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
9420: 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a  , zP4, zCom, siz
9430: 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73  eof(zCom));.#els
9440: 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b  e.  zCom[0] = 0;
9450: 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a  .#endif.  /* NB:
9460: 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63    The sqlite3Opc
9470: 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69  odeName() functi
9480: 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
9490: 64 20 62 79 20 63 6f 64 65 20 63 72 65 61 74 65  d by code create
94a0: 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b  d.  ** by the mk
94b0: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20  opcodeh.awk and 
94c0: 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63  mkopcodec.awk sc
94d0: 72 69 70 74 73 20 77 68 69 63 68 20 65 78 74 72  ripts which extr
94e0: 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66  act the.  ** inf
94f0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
9500: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
9510: 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74  text */.  fprint
9520: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
9530: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
9540: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
9550: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
9560: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
9570: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
9580: 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d  ->p5,.      zCom
9590: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
95a0: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
95b0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
95c0: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
95d0: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
95e0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
95f0: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
9600: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
9610: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
9620: 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20  *pEnd = &p[N];. 
9630: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
9640: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d   p->db;.    u8 m
9650: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64  alloc_failed = d
9660: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
9670: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42  .    if( db->pnB
9680: 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20  ytesFreed ){.   
9690: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69     do{.        i
96a0: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
96b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
96c0: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
96d0: 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b        }while( (+
96e0: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20  +p)<pEnd );.    
96f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
9700: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73      do{.      as
9710: 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70  sert( (&p[1])==p
9720: 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d  End || p[0].db==
9730: 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20  p[1].db );.     
9740: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9750: 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61  VdbeCheckMemInva
9760: 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20  riants(p) );..  
9770: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
9780: 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69  k is really an i
9790: 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f  nlined version o
97a0: 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  f sqlite3VdbeMem
97b0: 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20  Release().      
97c0: 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 64  ** that takes ad
97d0: 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66  vantage of the f
97e0: 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d  act that the mem
97f0: 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69  ory cell value i
9800: 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  s .      ** bein
9810: 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66  g set to NULL af
9820: 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e  ter releasing an
9830: 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72  y dynamic resour
9840: 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ces..      **.  
9850: 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69      ** The justi
9860: 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  fication for dup
9870: 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73  licating code is
9880: 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20   that according 
9890: 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  to .      ** cal
98a0: 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75  lgrind, this cau
98b0: 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 65  ses a certain te
98c0: 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 74  st case to hit t
98d0: 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20  he CPU 4.7 .    
98e0: 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73    ** percent les
98f0: 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63  s (x86 linux, gc
9900: 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c  c version 4.1.2,
9910: 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20   -O6) than if . 
9920: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d       ** sqlite3M
9930: 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 65  emRelease() were
9940: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72   called from her
9950: 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69  e. With -O2, thi
9960: 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a  s jumps.      **
9970: 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e   to 6.6 percent.
9980: 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20 69   The test case i
9990: 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30  s inserting 1000
99a0: 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62   rows into a tab
99b0: 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  le .      ** wit
99c0: 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69  h no indexes usi
99d0: 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70  ng a single prep
99e0: 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 74  ared INSERT stat
99f0: 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20  ement, bind() . 
9a00: 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
9a10: 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65  t(). Inserts are
9a20: 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20   grouped into a 
9a30: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
9a40: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74     */.      test
9a50: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
9a60: 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20   MEM_Agg );.    
9a70: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
9a80: 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29  lags & MEM_Dyn )
9a90: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9aa0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
9ab0: 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20  _Frame );.      
9ac0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
9ad0: 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20  gs & MEM_RowSet 
9ae0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
9af0: 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d  flags&(MEM_Agg|M
9b00: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65  EM_Dyn|MEM_Frame
9b10: 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a  |MEM_RowSet) ){.
9b20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9b30: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29  dbeMemRelease(p)
9b40: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9b50: 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b  ( p->szMalloc ){
9b60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9b70: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
9b80: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  alloc);.        
9b90: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  p->szMalloc = 0;
9ba0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
9bb0: 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  p->flags = MEM_U
9bc0: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77  ndefined;.    }w
9bd0: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
9be0: 20 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   );.    db->mall
9bf0: 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f  ocFailed = mallo
9c00: 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a  c_failed;.  }.}.
9c10: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
9c20: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
9c30: 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74   and its content
9c40: 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  s. VdbeFrame obj
9c50: 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ects are.** allo
9c60: 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  cated by the OP_
9c70: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
9c80: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  n sqlite3VdbeExe
9c90: 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c()..*/.void sql
9ca0: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
9cb0: 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ete(VdbeFrame *p
9cc0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65  ){.  int i;.  Me
9cd0: 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72  m *aMem = VdbeFr
9ce0: 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62  ameMem(p);.  Vdb
9cf0: 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20  eCursor **apCsr 
9d00: 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  = (VdbeCursor **
9d10: 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64  )&aMem[p->nChild
9d20: 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Mem];.  for(i=0;
9d30: 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b   i<p->nChildCsr;
9d40: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
9d50: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
9d60: 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29  (p->v, apCsr[i])
9d70: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
9d80: 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d  emArray(aMem, p-
9d90: 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73  >nChildMem);.  s
9da0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
9db0: 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69  v->db, p);.}..#i
9dc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9dd0: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
9de0: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
9df0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
9e00: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
9e10: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
9e20: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
9e30: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
9e40: 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74  VdbeExec().  But
9e50: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72   instead of.** r
9e60: 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c  unning the code,
9e70: 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20   it invokes the 
9e80: 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f  callback once fo
9e90: 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  r each instructi
9ea0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74  on..** This feat
9eb0: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
9ec0: 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49  mplement "EXPLAI
9ed0: 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  N"..**.** When p
9ee0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61  ->explain==1, ea
9ef0: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
9f00: 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a  s listed.  When.
9f10: 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  ** p->explain==2
9f20: 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69  , only OP_Explai
9f30: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  n instructions a
9f40: 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68  re listed and th
9f50: 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e  ese.** are shown
9f60: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
9f70: 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c  format.  p->expl
9f80: 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74  ain==2 is used t
9f90: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45  o implement.** E
9fa0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
9fb0: 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  N..**.** When p-
9fc0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72  >explain==1, fir
9fd0: 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  st the main prog
9fe0: 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74  ram is listed, t
9ff0: 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74  hen each of.** t
a000: 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72  he trigger subpr
a010: 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65  ograms are liste
a020: 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f  d one by one..*/
a030: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
a040: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a060: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
a070: 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20  .){.  int nRow; 
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
a0a0: 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e  op when row coun
a0b0: 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20 2a  t reaches this *
a0c0: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30  /.  int nSub = 0
a0d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a0f0: 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  er of sub-vdbes 
a100: 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
a110: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
a120: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
a130: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
a140: 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20  f sub-vdbes */. 
a150: 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20   Mem *pSub = 0; 
a160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a170: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
a180: 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20  cell hold array 
a190: 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20  of subprogs */. 
a1a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
a1b0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
a1c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
a1d0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
a1e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
a210: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
a220: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
a230: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
a240: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
a250: 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ode */.  Mem *pM
a260: 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  em = &p->aMem[1]
a270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
a280: 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65   First Mem of re
a290: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61  sult set */..  a
a2a0: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
a2b0: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
a2c0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
a2d0: 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73  GIC_RUN );.  ass
a2e0: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
a2f0: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
a300: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70  SQLITE_BUSY || p
a310: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
a320: 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  EM );..  /* Even
a330: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
a340: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ode does not use
a350: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
a360: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65   for.  ** the re
a370: 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c  sult, result col
a380: 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20  umns may become 
a390: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
a3a0: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
a3b0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
a3c0: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
a3d0: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
a3e0: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
a3f0: 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
a400: 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38  MemArray(pMem, 8
a410: 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  );.  p->pResultS
a420: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  et = 0;..  if( p
a430: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
a440: 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  EM ){.    /* Thi
a450: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
a460: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
a470: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
a480: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
a490: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
a4a0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
a4b0: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
a4c0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
a4d0: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
a4e0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
a4f0: 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74    }..  /* When t
a500: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
a510: 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73  put rows reaches
a520: 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e   nRow, that mean
a530: 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69  s the.  ** listi
a540: 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ng has finished 
a550: 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70  and sqlite3_step
a560: 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  () should return
a570: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
a580: 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73  ** nRow is the s
a590: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
a5a0: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
a5b0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c  main program, pl
a5c0: 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20  us.  ** the sum 
a5d0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
a5e0: 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69   rows in all tri
a5f0: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
a600: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
a610: 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e  * so far.  The n
a620: 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69  Row value will i
a630: 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74  ncrease as new t
a640: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
a650: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f  ms are.  ** enco
a660: 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e  untered, but p->
a670: 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  pc will eventual
a680: 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e  ly catch up to n
a690: 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77  Row..  */.  nRow
a6a0: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
a6b0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
a6c0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
a6d0: 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  st 8 memory cell
a6e0: 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74  s are used for t
a6f0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
a700: 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a  So we will.    *
a710: 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65  * commandeer the
a720: 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65   9th cell to use
a730: 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20   as storage for 
a740: 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
a750: 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ters.    ** to t
a760: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
a770: 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73  ms.  The VDBE is
a780: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68   guaranteed to h
a790: 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20  ave at least 9. 
a7a0: 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f     ** cells.  */
a7b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
a7c0: 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53  nMem>9 );.    pS
a7d0: 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d  ub = &p->aMem[9]
a7e0: 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  ;.    if( pSub->
a7f0: 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29  flags&MEM_Blob )
a800: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68  {.      /* On th
a810: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
a820: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20  sqlite3_step(), 
a830: 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61  pSub will hold a
a840: 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20   NULL.  It is.  
a850: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
a860: 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20  ed to a BLOB by 
a870: 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  the P4_SUBPROGRA
a880: 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  M processing log
a890: 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  ic below */.    
a8a0: 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e    nSub = pSub->n
a8b0: 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a  /sizeof(Vdbe*);.
a8c0: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
a8d0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
a8e0: 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b->z;.    }.    
a8f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b  for(i=0; i<nSub;
a900: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f   i++){.      nRo
a910: 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e  w += apSub[i]->n
a920: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  Op;.    }.  }.. 
a930: 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e   do{.    i = p->
a940: 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  pc++;.  }while( 
a950: 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70  i<nRow && p->exp
a960: 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f  lain==2 && p->aO
a970: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
a980: 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  Explain );.  if(
a990: 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20   i>=nRow ){.    
a9a0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
a9b0: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
a9c0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
a9d0: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
a9e0: 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20  terrupted ){.   
a9f0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
aa00: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72  INTERRUPT;.    r
aa10: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
aa20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
aa30: 65 45 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65  eError(p, sqlite
aa40: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b  3ErrStr(p->rc));
aa50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
aa60: 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20  ar *zP4;.    Op 
aa70: 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c  *pOp;.    if( i<
aa80: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  p->nOp ){.      
aa90: 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69  /* The output li
aaa0: 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61  ne number is sma
aab0: 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77  ll enough that w
aac0: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74  e are still in t
aad0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e  he.      ** main
aae0: 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20   program. */.   
aaf0: 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70     pOp = &p->aOp
ab00: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
ab10: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
ab20: 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e  currently listin
ab30: 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  g subprograms.  
ab40: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
ab50: 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a   one and.      *
ab60: 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70  * pick up the ap
ab70: 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65  propriate opcode
ab80: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  . */.      int j
ab90: 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e  ;.      i -= p->
aba0: 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nOp;.      for(j
abb0: 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d  =0; i>=apSub[j]-
abc0: 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nOp; j++){.    
abd0: 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a      i -= apSub[j
abe0: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a  ]->nOp;.      }.
abf0: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53        pOp = &apS
ac00: 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20  ub[j]->aOp[i];. 
ac10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
ac20: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
ac30: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
ac40: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
ac50: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20   pMem->u.i = i; 
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ac80: 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  * Program counte
ac90: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  r */.      pMem+
aca0: 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d  +;.  .      pMem
acb0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
acc0: 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  atic|MEM_Str|MEM
acd0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
ace0: 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71  m->z = (char*)sq
acf0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
ad00: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a  pOp->opcode); /*
ad10: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   Opcode */.     
ad20: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
ad30: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
ad40: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
ad50: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
ad60: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
ad70: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
ad80: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
ad90: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20       /* When an 
ada0: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
adb0: 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28  e is encounter (
adc0: 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20  the only opcode 
add0: 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a  that has.      *
ade0: 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41  * a P4_SUBPROGRA
adf0: 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70  M argument), exp
ae00: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
ae10: 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62  the array of sub
ae20: 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a  programs.      *
ae30: 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65  * kept in p->aMe
ae40: 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74  m[9].z to hold t
ae50: 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d  he new program -
ae60: 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73   assuming this s
ae70: 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20  ubprogram.      
ae80: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  ** has not alrea
ae90: 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20  dy been seen..  
aea0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
aeb0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
aec0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
aed0: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
aee0: 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65   = (nSub+1)*size
aef0: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
af00: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
af10: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
af20: 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20   j<nSub; j++){. 
af30: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53           if( apS
af40: 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70  ub[j]==pOp->p4.p
af50: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
af60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
af70: 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26     if( j==nSub &
af80: 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c  & SQLITE_OK==sql
af90: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
afa0: 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75  pSub, nByte, nSu
afb0: 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  b!=0) ){.       
afc0: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
afd0: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
afe0: 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  z;.          apS
aff0: 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70  ub[nSub++] = pOp
b000: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
b010: 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66           pSub->f
b020: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62  lags |= MEM_Blob
b030: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62  ;.          pSub
b040: 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f  ->n = nSub*sizeo
b050: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
b060: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b070: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65  }.    }..    pMe
b080: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
b090: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
b0a0: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
b0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0c0: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
b0d0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
b0e0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
b0f0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
b100: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20  >u.i = pOp->p2; 
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a           /* P2 *
b130: 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  /.    pMem++;.. 
b140: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
b150: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
b160: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
b170: 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
b180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
b190: 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  3 */.    pMem++;
b1a0: 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
b1b0: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
b1c0: 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 33 32 29  Resize(pMem, 32)
b1d0: 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20   ){ /* P4 */.   
b1e0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
b1f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b200: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
b210: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
b220: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61   }.    pMem->fla
b230: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
b240: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d  _Term;.    zP4 =
b250: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
b260: 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20  pMem->z, 32);.  
b270: 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d    if( zP4!=pMem-
b280: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
b290: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
b2a0: 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20  (pMem, zP4, -1, 
b2b0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b  SQLITE_UTF8, 0);
b2c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b2d0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
b2e0: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
b2f0: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
b300: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
b310: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
b320: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
b330: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b  .    }.    pMem+
b340: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  +;..    if( p->e
b350: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
b360: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
b370: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
b380: 69 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a  ize(pMem, 4) ){.
b390: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b3a0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
b3b0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72  led );.        r
b3c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
b3d0: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
b3e0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
b3f0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
b400: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
b410: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
b420: 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70  e3_snprintf(3, p
b430: 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20  Mem->z, "%.2x", 
b440: 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50  pOp->p5);   /* P
b450: 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  5 */.      pMem-
b460: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
b470: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
b480: 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.  .#ifdef SQLI
b490: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
b4a0: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20  N_COMMENTS.     
b4b0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
b4c0: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
b4d0: 65 28 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a  e(pMem, 500) ){.
b4e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b4f0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
b500: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72  led );.        r
b510: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
b520: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
b530: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
b540: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
b550: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
b560: 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74  = displayComment
b570: 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d  (pOp, zP4, pMem-
b580: 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20  >z, 500);.      
b590: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
b5a0: 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20  TE_UTF8;.#else. 
b5b0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
b5c0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20   = MEM_Null;    
b5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5e0: 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f     /* Comment */
b5f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
b600: 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e     p->nResColumn
b610: 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70   = 8 - 4*(p->exp
b620: 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e  lain-1);.    p->
b630: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d  pResultSet = &p-
b640: 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d  >aMem[1];.    p-
b650: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
b660: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
b670: 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _ROW;.  }.  retu
b680: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
b690: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
b6a0: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
b6b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
b6c0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53  *.** Print the S
b6d0: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64  QL that was used
b6e0: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56   to generate a V
b6f0: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  DBE program..*/.
b700: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
b710: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70  PrintSql(Vdbe *p
b720: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
b730: 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  *z = 0;.  if( p-
b740: 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d  >zSql ){.    z =
b750: 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73   p->zSql;.  }els
b760: 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20  e if( p->nOp>=1 
b770: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62  ){.    const Vdb
b780: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
b790: 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  Op[0];.    if( p
b7a0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
b7b0: 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  nit && pOp->p4.z
b7c0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  !=0 ){.      z =
b7d0: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
b7e0: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
b7f0: 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b  Isspace(*z) ) z+
b800: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
b810: 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53  f( z ) printf("S
b820: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
b830: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
b840: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b850: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
b860: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
b870: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
b880: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52  ** Print an IOTR
b890: 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77  ACE message show
b8a0: 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e  ing SQL content.
b8b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b8c0: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56  VdbeIOTraceSql(V
b8d0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
b8e0: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
b8f0: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
b900: 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65  ( sqlite3IoTrace
b910: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
b920: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
b930: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
b940: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f  aOp[0];.  if( pO
b950: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  p->opcode==OP_In
b960: 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  it && pOp->p4.z!
b970: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  =0 ){.    int i,
b980: 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31   j;.    char z[1
b990: 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  000];.    sqlite
b9a0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
b9b0: 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70  f(z), z, "%s", p
b9c0: 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66  Op->p4.z);.    f
b9d0: 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49  or(i=0; sqlite3I
b9e0: 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b  sspace(z[i]); i+
b9f0: 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30  +){}.    for(j=0
ba00: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
ba10: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
ba20: 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a  sspace(z[i]) ){.
ba30: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d          if( z[i-
ba40: 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20  1]!=' ' ){.     
ba50: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20       z[j++] = ' 
ba60: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
ba70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ba80: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
ba90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
baa0: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
bab0: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28   sqlite3IoTrace(
bac0: 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  "SQL %s\n", z);.
bad0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
bae0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  !SQLITE_OMIT_TRA
baf0: 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  CE && SQLITE_ENA
bb00: 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a  BLE_IOTRACE */..
bb10: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  /*.** Allocate s
bb20: 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65  pace from a fixe
bb30: 64 20 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e  d size buffer an
bb40: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
bb50: 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70  er to.** that sp
bb60: 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69  ace.  If insuffi
bb70: 63 69 65 6e 74 20 73 70 61 63 65 20 69 73 20 61  cient space is a
bb80: 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e  vailable, return
bb90: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
bba0: 20 70 42 75 66 20 70 61 72 61 6d 65 74 65 72 20   pBuf parameter 
bbb0: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
bbc0: 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65  alue of a pointe
bbd0: 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20  r which will.** 
bbe0: 72 65 63 65 69 76 65 20 74 68 65 20 6e 65 77 20  receive the new 
bbf0: 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73  memory.  pBuf is
bc00: 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20   normally NULL. 
bc10: 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a   If pBuf is not.
bc20: 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ** NULL, it mean
bc30: 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70  s that memory sp
bc40: 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ace has already 
bc50: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
bc60: 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20  nd that.** this 
bc70: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e  routine should n
bc80: 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20  ot allocate any 
bc90: 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65  new memory.  Whe
bca0: 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a  n pBuf is not.**
bcb0: 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74   NULL simply ret
bcc0: 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20  urn pBuf.  Only 
bcd0: 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d  allocate new mem
bce0: 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e 20 70  ory space when p
bcf0: 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a  Buf.** is NULL..
bd00: 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74  **.** nByte is t
bd10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
bd20: 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64  es of space need
bd30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f  ed..**.** *ppFro
bd40: 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69  m points to avai
bd50: 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20  lable space and 
bd60: 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74  pEnd points to t
bd70: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
bd80: 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65   available space
bd90: 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20 69 73  .  When space is
bda0: 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46   allocated, *ppF
bdb0: 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20  rom is advanced 
bdc0: 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20  past.** the end 
bdd0: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
bde0: 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70   space..**.** *p
bdf0: 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74  nByte is a count
be00: 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  er of the number
be10: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
be20: 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61 69  ce that have fai
be30: 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61  led.** to alloca
be40: 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  te.  If there is
be50: 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70   insufficient sp
be60: 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74  ace in *ppFrom t
be70: 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  o satisfy the.**
be80: 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69   request, then i
be90: 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65  ncrement *pnByte
bea0: 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   by the amount o
beb0: 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a  f the request..*
bec0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61  /.static void *a
bed0: 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69  llocSpace(.  voi
bee0: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
bef0: 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72    /* Where retur
bf00: 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62  n pointer will b
bf10: 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e  e stored */.  in
bf20: 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
bf30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bf40: 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  bytes to allocat
bf50: 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72  e */.  u8 **ppFr
bf60: 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  om,         /* I
bf70: 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20  N/OUT: Allocate 
bf80: 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a  from *ppFrom */.
bf90: 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20    u8 *pEnd,     
bfa0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
bfb0: 72 20 74 6f 20 31 20 62 79 74 65 20 70 61 73 74  r to 1 byte past
bfc0: 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46   the end of *ppF
bfd0: 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  rom buffer */.  
bfe0: 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20  int *pnByte     
bff0: 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63       /* If alloc
c000: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
c010: 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20  made, increment 
c020: 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20  *pnByte */.){.  
c030: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
c040: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70  TE_ALIGNMENT(*pp
c050: 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70  From) );.  if( p
c060: 42 75 66 20 29 20 72 65 74 75 72 6e 20 70 42 75  Buf ) return pBu
c070: 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  f;.  nByte = ROU
c080: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66  ND8(nByte);.  if
c090: 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79  ( &(*ppFrom)[nBy
c0a0: 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20  te] <= pEnd ){. 
c0b0: 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a     pBuf = (void*
c0c0: 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70  )*ppFrom;.    *p
c0d0: 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a  pFrom += nByte;.
c0e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e    }else{.    *pn
c0f0: 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  Byte += nByte;. 
c100: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66   }.  return pBuf
c110: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e  ;.}../*.** Rewin
c120: 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20  d the VDBE back 
c130: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
c140: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20   in preparation 
c150: 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69  for.** running i
c160: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
c170: 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62  e3VdbeRewind(Vdb
c180: 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e  e *p){.#if defin
c190: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
c1a0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
c1b0: 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20  _PROFILE).  int 
c1c0: 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  i;.#endif.  asse
c1d0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
c1e0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
c1f0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
c200: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73  );..  /* There s
c210: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73  hould be at leas
c220: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20  t one opcode..  
c230: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
c240: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  nOp>0 );..  /* S
c250: 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20  et the magic to 
c260: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73  VDBE_MAGIC_RUN s
c270: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
c280: 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d  n later. */.  p-
c290: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
c2a0: 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66  GIC_RUN;..#ifdef
c2b0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
c2c0: 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d  for(i=1; i<p->nM
c2d0: 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  em; i++){.    as
c2e0: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d  sert( p->aMem[i]
c2f0: 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20  .db==p->db );.  
c300: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63  }.#endif.  p->pc
c310: 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d   = -1;.  p->rc =
c320: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d   SQLITE_OK;.  p-
c330: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
c340: 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61  E_Abort;.  p->ma
c350: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
c360: 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  _RUN;.  p->nChan
c370: 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63  ge = 0;.  p->cac
c380: 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e  heCtr = 1;.  p->
c390: 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d  minWriteFileForm
c3a0: 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69  at = 255;.  p->i
c3b0: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
c3c0: 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
c3d0: 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44  t = 0;.#ifdef VD
c3e0: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72  BE_PROFILE.  for
c3f0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
c400: 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  i++){.    p->aOp
c410: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  [i].cnt = 0;.   
c420: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
c430: 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  s = 0;.  }.#endi
c440: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  f.}../*.** Prepa
c450: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
c460: 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69  hine for executi
c470: 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  on for the first
c480: 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63   time after.** c
c490: 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74  reating the virt
c4a0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68  ual machine.  Th
c4b0: 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e  is involves thin
c4c0: 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c  gs such.** as al
c4d0: 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74 65  locating registe
c4e0: 72 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  rs and initializ
c4f0: 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ing the program 
c500: 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65  counter..** Afte
c510: 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  r the VDBE has b
c520: 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61  e prepped, it ca
c530: 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79  n be executed by
c540: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
c550: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
c560: 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a  VdbeExec().  .**
c570: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c580: 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
c590: 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20  exactly once on 
c5a0: 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63  each virtual mac
c5b0: 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74  hine..** After t
c5c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
c5d0: 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73  alled the VM has
c5e0: 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22   been "packaged"
c5f0: 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a   and is ready.**
c600: 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20   to run.  After 
c610: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
c620: 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20  called, further 
c630: 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c  calls to .** sql
c640: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 20  ite3VdbeAddOp() 
c650: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72  functions are pr
c660: 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 20  ohibited.  This 
c670: 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65  routine disconne
c680: 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  cts.** the Vdbe 
c690: 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f  from the Parse o
c6a0: 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 65  bject that helpe
c6b0: 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f  d generate it so
c6c0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65   that the.** the
c6d0: 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e   Vdbe becomes an
c6e0: 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74   independent ent
c6f0: 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 73  ity and the Pars
c700: 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a  e object can be.
c710: 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a  ** destroyed..**
c720: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69  .** Use the sqli
c730: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 20  te3VdbeRewind() 
c740: 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73  procedure to res
c750: 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  tore a virtual m
c760: 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74  achine back.** t
c770: 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74  o its initial st
c780: 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61 73  ate after it has
c790: 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f   been run..*/.vo
c7a0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
c7b0: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
c7c0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
c7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c7e0: 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65   VDBE */.  Parse
c7f0: 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 20   *pParse        
c800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
c810: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
c820: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c830: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c840: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
c850: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
c860: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20  /.  int nVar;   
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c880: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c890: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
c8a0: 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  int nMem;       
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c8c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d  * Number of VM m
c8d0: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20  emory registers 
c8e0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72  */.  int nCursor
c8f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c900: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c910: 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 65   cursors require
c920: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b  d */.  int nArg;
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c940: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c950: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20  of arguments in 
c960: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
c970: 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20   int nOnce;     
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c990: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f  /* Number of OP_
c9a0: 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  Once instruction
c9b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  s */.  int n;   
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
c9e0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a  unter */.  u8 *z
c9f0: 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Csr;            
ca00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
ca10: 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ory available fo
ca20: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
ca30: 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20    u8 *zEnd;     
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca50: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
ca60: 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  ast allocated me
ca70: 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  mory */.  int nB
ca80: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
ca90: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
caa0: 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72  much extra memor
cab0: 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a  y is needed */..
cac0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
cad0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
cae0: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
caf0: 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
cb00: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
cb10: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
cb20: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
cb30: 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73  pParse==p->pPars
cb40: 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e );.  db = p->d
cb50: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  b;.  assert( db-
cb60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
cb70: 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61   );.  nVar = pPa
cb80: 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65  rse->nVar;.  nMe
cb90: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
cba0: 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50  ;.  nCursor = pP
cbb0: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41  arse->nTab;.  nA
cbc0: 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61  rg = pParse->nMa
cbd0: 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20  xArg;.  nOnce = 
cbe0: 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20  pParse->nOnce;. 
cbf0: 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20   if( nOnce==0 ) 
cc00: 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e  nOnce = 1; /* En
cc10: 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  sure at least on
cc20: 65 20 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e  e byte in p->aOn
cc30: 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20  ceFlag[] */.  . 
cc40: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72   /* For each cur
cc50: 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c  sor required, al
cc60: 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65  so allocate a me
cc70: 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72  mory cell. Memor
cc80: 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d  y.  ** cells (nM
cc90: 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e  em+1-nCursor)..n
cca0: 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20  Mem, inclusive, 
ccb0: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
ccc0: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76  ed by.  ** the v
ccd0: 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73  dbe program. Ins
cce0: 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73  tead they are us
ccf0: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
cd00: 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64  pace for.  ** Vd
cd10: 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f  beCursor/BtCurso
cd20: 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  r structures. Th
cd30: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
cd40: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
cd50: 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20   .  ** cursor 0 
cd60: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  is stored in mem
cd70: 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d  ory cell nMem. M
cd80: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d  emory cell (nMem
cd90: 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  -1).  ** stores 
cda0: 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  the blob of memo
cdb0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
cdc0: 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63  th cursor 1, etc
cdd0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
cde0: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
cdf0: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
ce00: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
ce10: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
ce20: 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
ce30: 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76  registers, SQL v
ce40: 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63  ariables, VDBE c
ce50: 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a  ursors and .  **
ce60: 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72   an array to mar
ce70: 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f  shal SQL functio
ce80: 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a  n arguments in..
ce90: 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75    */.  zCsr = (u
cea0: 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f  8*)&p->aOp[p->nO
ceb0: 70 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  p];            /
cec0: 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 62  * Memory avaliab
ced0: 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f  le for allocatio
cee0: 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 75  n */.  zEnd = (u
cef0: 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 50 61 72 73  8*)&p->aOp[pPars
cf00: 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f  e->nOpAlloc];  /
cf10: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
cf20: 74 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20  t end of zCsr[] 
cf30: 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56  */..  resolveP2V
cf40: 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b  alues(p, &nArg);
cf50: 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  .  p->usesStmtJo
cf60: 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61  urnal = (u8)(pPa
cf70: 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  rse->isMultiWrit
cf80: 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79  e && pParse->may
cf90: 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50  Abort);.  if( pP
cfa0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26  arse->explain &&
cfb0: 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20   nMem<10 ){.    
cfc0: 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20  nMem = 10;.  }. 
cfd0: 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c   memset(zCsr, 0,
cfe0: 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a   zEnd-zCsr);.  z
cff0: 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28  Csr += (zCsr - (
d000: 75 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65  u8*)0)&7;.  asse
d010: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
d020: 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29  LIGNMENT(zCsr) )
d030: 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  ;.  p->expired =
d040: 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79   0;..  /* Memory
d050: 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20   for registers, 
d060: 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73  parameters, curs
d070: 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f  or, etc, is allo
d080: 63 61 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a  cated in two.  *
d090: 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68  * passes.  On th
d0a0: 65 20 66 69 72 73 74 20 70 61 73 73 2c 20 77 65  e first pass, we
d0b0: 20 74 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e   try to reuse un
d0c0: 75 73 65 64 20 73 70 61 63 65 20 61 74 20 74 68  used space at th
d0d0: 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  e .  ** end of t
d0e0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
d0f0: 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62    If we are unab
d100: 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c  le to satisfy al
d110: 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65  l memory.  ** re
d120: 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65  quirements by re
d130: 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65  using the opcode
d140: 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65   array tail, the
d150: 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a  n the second.  *
d160: 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c  * pass will fill
d170: 20 69 6e 20 74 68 65 20 72 65 73 74 20 75 73 69   in the rest usi
d180: 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63  ng a fresh alloc
d190: 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20  ation.  .  **.  
d1a0: 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73  ** This two-pass
d1b0: 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20 72   approach that r
d1c0: 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65  euses as much me
d1d0: 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65  mory as possible
d1e0: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c   from.  ** the l
d1f0: 65 66 74 6f 76 65 72 20 73 70 61 63 65 20 61 74  eftover space at
d200: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
d210: 6f 70 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e  opcode array can
d220: 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20   significantly. 
d230: 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61   ** reduce the a
d240: 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20  mount of memory 
d250: 68 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72  held by a prepar
d260: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ed statement..  
d270: 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42  */.  do {.    nB
d280: 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  yte = 0;.    p->
d290: 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aMem = allocSpac
d2a0: 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a  e(p->aMem, nMem*
d2b0: 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43  sizeof(Mem), &zC
d2c0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
d2d0: 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d  );.    p->aVar =
d2e0: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
d2f0: 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66  Var, nVar*sizeof
d300: 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45  (Mem), &zCsr, zE
d310: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
d320: 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f   p->apArg = allo
d330: 63 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c  cSpace(p->apArg,
d340: 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
d350: 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  *), &zCsr, zEnd,
d360: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
d370: 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70  >azVar = allocSp
d380: 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56  ace(p->azVar, nV
d390: 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  ar*sizeof(char*)
d3a0: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
d3b0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
d3c0: 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pCsr = allocSpac
d3d0: 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72  e(p->apCsr, nCur
d3e0: 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43  sor*sizeof(VdbeC
d3f0: 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20  ursor*),.       
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20     &zCsr, zEnd, 
d420: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
d430: 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f  aOnceFlag = allo
d440: 63 53 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46  cSpace(p->aOnceF
d450: 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73  lag, nOnce, &zCs
d460: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
d470: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
d480: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
d490: 53 54 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e  STATUS.    p->an
d4a0: 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63  Exec = allocSpac
d4b0: 65 28 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e  e(p->anExec, p->
d4c0: 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 2c  nOp*sizeof(i64),
d4d0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
d4e0: 42 79 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Byte);.#endif.  
d4f0: 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20    if( nByte ){. 
d500: 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20       p->pFree = 
d510: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
d520: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
d530: 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d      }.    zCsr =
d540: 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a   p->pFree;.    z
d550: 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74  End = &zCsr[nByt
d560: 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42  e];.  }while( nB
d570: 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  yte && !db->mall
d580: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70  ocFailed );..  p
d590: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72  ->nCursor = nCur
d5a0: 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46  sor;.  p->nOnceF
d5b0: 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69  lag = nOnce;.  i
d5c0: 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20  f( p->aVar ){.  
d5d0: 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56    p->nVar = (ynV
d5e0: 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72  ar)nVar;.    for
d5f0: 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b  (n=0; n<nVar; n+
d600: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  +){.      p->aVa
d610: 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  r[n].flags = MEM
d620: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  _Null;.      p->
d630: 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b  aVar[n].db = db;
d640: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d650: 20 70 2d 3e 61 7a 56 61 72 20 26 26 20 70 50 61   p->azVar && pPa
d660: 72 73 65 2d 3e 6e 7a 56 61 72 3e 30 20 29 7b 0a  rse->nzVar>0 ){.
d670: 20 20 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70      p->nzVar = p
d680: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20  Parse->nzVar;.  
d690: 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61    memcpy(p->azVa
d6a0: 72 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  r, pParse->azVar
d6b0: 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f  , p->nzVar*sizeo
d6c0: 66 28 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b  f(p->azVar[0]));
d6d0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 72  .    memset(pPar
d6e0: 73 65 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50  se->azVar, 0, pP
d6f0: 61 72 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65  arse->nzVar*size
d700: 6f 66 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  of(pParse->azVar
d710: 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  [0]));.  }.  if(
d720: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
d730: 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20  p->aMem--;      
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66  /* aMem[] goes f
d760: 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20  rom 1..nMem */. 
d770: 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65     p->nMem = nMe
d780: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
d790: 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20     /*       not 
d7a0: 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a  from 0..nMem-1 *
d7b0: 2f 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e  /.    for(n=1; n
d7c0: 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20  <=nMem; n++){.  
d7d0: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66      p->aMem[n].f
d7e0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
d7f0: 69 6e 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61  ined;.      p->a
d800: 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Mem[n].db = db;.
d810: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65      }.  }.  p->e
d820: 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d  xplain = pParse-
d830: 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69  >explain;.  sqli
d840: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29  te3VdbeRewind(p)
d850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
d860: 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
d870: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
d880: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
d890: 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70  t cursor .** hap
d8a0: 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f  pens to hold..*/
d8b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
d8c0: 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65  eFreeCursor(Vdbe
d8d0: 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20   *p, VdbeCursor 
d8e0: 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78  *pCx){.  if( pCx
d8f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
d900: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
d910: 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28  VdbeSorterClose(
d920: 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 69  p->db, pCx);.  i
d930: 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20  f( pCx->pBt ){. 
d940: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
d950: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
d960: 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e      /* The pCx->
d970: 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20  pCursor will be 
d980: 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61  close automatica
d990: 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74  lly, if it exist
d9a0: 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65  s, by.    ** the
d9b0: 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a   call above. */.
d9c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d    }else if( pCx-
d9d0: 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
d9e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
d9f0: 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75  eCursor(pCx->pCu
da00: 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rsor);.  }.#ifnd
da10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
da20: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 65 6c  IRTUALTABLE.  el
da30: 73 65 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61  se if( pCx->pVta
da40: 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  bCursor ){.    s
da50: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
da60: 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20  or *pVtabCursor 
da70: 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  = pCx->pVtabCurs
da80: 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71  or;.    const sq
da90: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
daa0: 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 43 75 72  odule = pVtabCur
dab0: 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64  sor->pVtab->pMod
dac0: 75 6c 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ule;.    assert(
dad0: 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56   pVtabCursor->pV
dae0: 74 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  tab->nRef>0 );. 
daf0: 20 20 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e     pVtabCursor->
db00: 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  pVtab->nRef--;. 
db10: 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f     pModule->xClo
db20: 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  se(pVtabCursor);
db30: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
db40: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
db50: 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75  ursors in the cu
db60: 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a  rrent frame..*/.
db70: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73  static void clos
db80: 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
db90: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
dba0: 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20  p->apCsr ){.    
dbb0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
dbc0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
dbd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64  ; i++){.      Vd
dbe0: 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70  beCursor *pC = p
dbf0: 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20  ->apCsr[i];.    
dc00: 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20    if( pC ){.    
dc10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
dc20: 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29  reeCursor(p, pC)
dc30: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43  ;.        p->apC
dc40: 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  sr[i] = 0;.     
dc50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
dc60: 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76  /*.** Copy the v
dc70: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
dc80: 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74  the VdbeFrame st
dc90: 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56  ructure to its V
dca0: 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  dbe. This.** is 
dcb0: 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  used, for exampl
dcc0: 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65  e, when a trigge
dcd0: 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73  r sub-program is
dce0: 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f   halted to resto
dcf0: 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f  re.** control to
dd00: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
dd10: 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  m..*/.int sqlite
dd20: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
dd30: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72  e(VdbeFrame *pFr
dd40: 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ame){.  Vdbe *v 
dd50: 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63  = pFrame->v;.  c
dd60: 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61  loseCursorsInFra
dd70: 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51  me(v);.#ifdef SQ
dd80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
dd90: 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d  _SCANSTATUS.  v-
dda0: 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65  >anExec = pFrame
ddb0: 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66  ->anExec;.#endif
ddc0: 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20  .  v->aOnceFlag 
ddd0: 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46  = pFrame->aOnceF
dde0: 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46  lag;.  v->nOnceF
ddf0: 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f  lag = pFrame->nO
de00: 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f  nceFlag;.  v->aO
de10: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b  p = pFrame->aOp;
de20: 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61  .  v->nOp = pFra
de30: 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d  me->nOp;.  v->aM
de40: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65  em = pFrame->aMe
de50: 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70  m;.  v->nMem = p
de60: 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76  Frame->nMem;.  v
de70: 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65  ->apCsr = pFrame
de80: 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43  ->apCsr;.  v->nC
de90: 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e  ursor = pFrame->
dea0: 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62  nCursor;.  v->db
deb0: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46  ->lastRowid = pF
dec0: 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b  rame->lastRowid;
ded0: 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  v->nChange = 
dee0: 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b  pFrame->nChange;
def0: 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67  .  v->db->nChang
df00: 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43  e = pFrame->nDbC
df10: 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  hange;.  return 
df20: 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f  pFrame->pc;.}../
df30: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
df40: 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c  ursors..**.** Al
df50: 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64  so release any d
df60: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65  ynamic memory he
df70: 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20  ld by the VM in 
df80: 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65  the Vdbe.aMem me
df90: 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72  mory .** cell ar
dfa0: 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63  ray. This is nec
dfb0: 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65  essary as the me
dfc0: 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20  mory cell array 
dfd0: 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70  may contain.** p
dfe0: 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46  ointers to VdbeF
dff0: 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68  rame objects, wh
e000: 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20  ich may in turn 
e010: 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
e020: 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73   to.** open curs
e030: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
e040: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
e050: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ors(Vdbe *p){.  
e060: 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b  if( p->pFrame ){
e070: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
e080: 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28  pFrame;.    for(
e090: 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
e0a0: 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
e0b0: 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
e0c0: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
e0d0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
e0e0: 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b  Restore(pFrame);
e0f0: 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d  .    p->pFrame =
e100: 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d   0;.    p->nFram
e110: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
e120: 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d  ert( p->nFrame==
e130: 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73  0 );.  closeCurs
e140: 6f 72 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20  orsInFrame(p);. 
e150: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
e160: 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72      releaseMemAr
e170: 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c  ray(&p->aMem[1],
e180: 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20   p->nMem);.  }. 
e190: 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46   while( p->pDelF
e1a0: 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
e1b0: 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d  Frame *pDel = p-
e1c0: 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20  >pDelFrame;.    
e1d0: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70  p->pDelFrame = p
e1e0: 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  Del->pParent;.  
e1f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
e200: 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a  meDelete(pDel);.
e210: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
e220: 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c   any auxdata all
e230: 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ocations made by
e240: 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28   the VM */.  if(
e250: 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73   p->pAuxData ) s
e260: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
e270: 41 75 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30  AuxData(p, -1, 0
e280: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
e290: 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d  pAuxData==0 );.}
e2a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
e2b0: 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 61 20   the VM after a 
e2c0: 73 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73  single run..*/.s
e2d0: 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e  tatic void Clean
e2e0: 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  up(Vdbe *p){.  s
e2f0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
e300: 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  db;..#ifdef SQLI
e310: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78  TE_DEBUG.  /* Ex
e320: 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73  ecute assert() s
e330: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
e340: 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62  ure that the Vdb
e350: 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20  e.apCsr[] and . 
e360: 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20   ** Vdbe.aMem[] 
e370: 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65  arrays have alre
e380: 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64  ady been cleaned
e390: 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69   up.  */.  int i
e3a0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  ;.  if( p->apCsr
e3b0: 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d   ) for(i=0; i<p-
e3c0: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61  >nCursor; i++) a
e3d0: 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b  ssert( p->apCsr[
e3e0: 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  i]==0 );.  if( p
e3f0: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f  ->aMem ){.    fo
e400: 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65  r(i=1; i<=p->nMe
e410: 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  m; i++) assert( 
e420: 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73  p->aMem[i].flags
e430: 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20  ==MEM_Undefined 
e440: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
e450: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e460: 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
e470: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
e480: 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  ;.  p->pResultSe
e490: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
e4a0: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
e4b0: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
e4c0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
e4d0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53  turned by this S
e4e0: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  QL.** statement.
e4f0: 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74   This is now set
e500: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
e510: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75  , rather than du
e520: 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f  ring.** executio
e530: 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72  n of the vdbe pr
e540: 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71  ogram so that sq
e550: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
e560: 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63  nt() can.** be c
e570: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20  alled on an SQL 
e580: 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65  statement before
e590: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
e5a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e5b0: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56  VdbeSetNumCols(V
e5c0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73  dbe *p, int nRes
e5d0: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a  Column){.  Mem *
e5e0: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  pColName;.  int 
e5f0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n;.  sqlite3 *db
e600: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c   = p->db;..  rel
e610: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
e620: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
e630: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
e640: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  N);.  sqlite3DbF
e650: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e  ree(db, p->aColN
e660: 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73  ame);.  n = nRes
e670: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
e680: 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  ;.  p->nResColum
e690: 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c  n = (u16)nResCol
e6a0: 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
e6b0: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  me = pColName = 
e6c0: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d  (Mem*)sqlite3DbM
e6d0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
e6e0: 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20  zeof(Mem)*n );. 
e6f0: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65   if( p->aColName
e700: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
e710: 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
e720: 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  {.    pColName->
e730: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
e740: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  ;.    pColName->
e750: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
e760: 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a  pColName++;.  }.
e770: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
e780: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78   name of the idx
e790: 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  'th column to be
e7a0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
e7b0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
e7c0: 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  ** zName must be
e7d0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
e7e0: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73  nul terminated s
e7f0: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
e800: 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d  s call must be m
e810: 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ade after a call
e820: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53   to sqlite3VdbeS
e830: 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a  etNumCols()..**.
e840: 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72  ** The final par
e850: 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75  ameter, xDel, mu
e860: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c  st be one of SQL
e870: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c  ITE_DYNAMIC, SQL
e880: 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72  ITE_STATIC.** or
e890: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
e8a0: 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49  T. If it is SQLI
e8b0: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e  TE_DYNAMIC, then
e8c0: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
e8d0: 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61  ted.** to by zNa
e8e0: 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  me will be freed
e8f0: 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65   by sqlite3DbFre
e900: 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62  e() when the vdb
e910: 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a  e is destroyed..
e920: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
e930: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20  beSetColName(.  
e940: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
e950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e960: 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63   /* Vdbe being c
e970: 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69  onfigured */.  i
e980: 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20  nt idx,         
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
e9b0: 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73  mn zName applies
e9c0: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72   to */.  int var
e9d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e9e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
e9f0: 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f   of the COLNAME_
ea00: 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20  * constants */. 
ea10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
ea20: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
ea30: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
ea40: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
ea50: 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64  g name */.  void
ea60: 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20   (*xDel)(void*) 
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ea80: 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e  Memory managemen
ea90: 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a  t strategy for z
eaa0: 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Name */.){.  int
eab0: 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c   rc;.  Mem *pCol
eac0: 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Name;.  assert( 
ead0: 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  idx<p->nResColum
eae0: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  n );.  assert( v
eaf0: 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a  ar<COLNAME_N );.
eb00: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
eb10: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
eb20: 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20   assert( !zName 
eb30: 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f  || xDel!=SQLITE_
eb40: 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72  DYNAMIC );.    r
eb50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
eb60: 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  EM;.  }.  assert
eb70: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30  ( p->aColName!=0
eb80: 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d   );.  pColName =
eb90: 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69   &(p->aColName[i
eba0: 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f  dx+var*p->nResCo
ebb0: 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73  lumn]);.  rc = s
ebc0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
ebd0: 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e  Str(pColName, zN
ebe0: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
ebf0: 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61  UTF8, xDel);.  a
ec00: 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20  ssert( rc!=0 || 
ec10: 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e  !zName || (pColN
ec20: 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54  ame->flags&MEM_T
ec30: 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74  erm)!=0 );.  ret
ec40: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ec50: 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65   A read or write
ec60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
ec70: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61   or may not be a
ec80: 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73  ctive on databas
ec90: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
eca0: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
ecb0: 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d   is active, comm
ecc0: 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  it it. If there 
ecd0: 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72  is a.** write-tr
ece0: 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69  ansaction spanni
ecf0: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ng more than one
ed00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
ed10: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
ed20: 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68  takes care of th
ed30: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ed40: 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74   trickery..*/.st
ed50: 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
ed60: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
ed70: 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74   Vdbe *p){.  int
ed80: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
ed90: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
eda0: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
edb0: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
edc0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  te-transaction *
edd0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
ede0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
edf0: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
ee00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
ee10: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
ee20: 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f    /* With this o
ee30: 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74  ption, sqlite3Vt
ee40: 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69  abSync() is defi
ee50: 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79  ned to be simply
ee60: 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   .  ** SQLITE_OK
ee70: 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65   so p is not use
ee80: 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45  d. .  */.  UNUSE
ee90: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
eea0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66  #endif..  /* Bef
eeb0: 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
eec0: 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68  ng else, call th
eed0: 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  e xSync() callba
eee0: 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20  ck for any.  ** 
eef0: 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74  virtual module t
ef00: 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e  ables written in
ef10: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
ef20: 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20  n. This has to. 
ef30: 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f   ** be done befo
ef40: 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77  re determining w
ef50: 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20  hether a master 
ef60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
ef70: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20  .  ** required, 
ef80: 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61  as an xSync() ca
ef90: 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61  llback may add a
efa0: 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  n attached datab
efb0: 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ase.  ** to the 
efc0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
efd0: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
efe0: 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b  VtabSync(db, p);
eff0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
f000: 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20   determines (a) 
f010: 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  if the commit ho
f020: 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ok should be inv
f030: 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62  oked and.  ** (b
f040: 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62  ) how many datab
f050: 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f  ase files have o
f060: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
f070: 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a  ctions, not .  *
f080: 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
f090: 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28  temp database. (
f0a0: 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  b) is important 
f0b0: 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20  because if more 
f0c0: 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64  than .  ** one d
f0d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
f0e0: 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
f0f0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61  ransaction, a ma
f100: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  ster journal.  *
f110: 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  * file is requir
f120: 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63  ed for an atomic
f130: 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20   commit..  */ . 
f140: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
f150: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
f160: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
f170: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
f180: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
f190: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
f1a0: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
f1b0: 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63   ){.      needXc
f1c0: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
f1d0: 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61   if( i!=1 ) nTra
f1e0: 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  ns++;.      sqli
f1f0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
f200: 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
f210: 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
f220: 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33  siveLock(sqlite3
f230: 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29  BtreePager(pBt))
f240: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
f250: 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a  treeLeave(pBt);.
f260: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
f270: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f280: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
f290: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
f2a0: 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65  re are any write
f2b0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74  -transactions at
f2c0: 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65   all, invoke the
f2d0: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a   commit hook */.
f2e0: 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69    if( needXcommi
f2f0: 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  t && db->xCommit
f300: 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
f310: 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  rc = db->xCommit
f320: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f  Callback(db->pCo
f330: 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66  mmitArg);.    if
f340: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
f350: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
f360: 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
f370: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
f380: 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
f390: 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
f3a0: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
f3b0: 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
f3c0: 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
f3d0: 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
f3e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
f3f0: 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
f400: 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
f410: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
f420: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
f430: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
f440: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
f450: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
f460: 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
f470: 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
f480: 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
f490: 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
f4a0: 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69  ry: or a temp fi
f4b0: 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68  le.  In .  ** th
f4c0: 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f  at case we do no
f4d0: 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
f4e0: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
f4f0: 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
f500: 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73  .  ** simple cas
f510: 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f  e then too..  */
f520: 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
f530: 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
f540: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
f550: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
f560: 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c  )).   || nTrans<
f570: 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  =1.  ){.    for(
f580: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
f590: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
f5a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
f5b0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
f5c0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
f5d0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
f5e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
f5f0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
f600: 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
f610: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
f620: 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
f630: 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
f640: 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
f650: 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
f660: 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
f670: 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
f680: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
f690: 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
f6a0: 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
f6b0: 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
f6c0: 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
f6d0: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
f6e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
f6f0: 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
f700: 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
f710: 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
f720: 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
f730: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
f740: 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
f750: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
f760: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
f770: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
f780: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
f790: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
f7a0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
f7b0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
f7c0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
f7d0: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
f7e0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
f7f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
f800: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f810: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
f820: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
f830: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
f840: 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
f850: 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
f860: 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
f870: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
f880: 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
f890: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
f8a0: 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
f8b0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f8c0: 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
f8d0: 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  ed atomically.. 
f8e0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
f8f0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
f900: 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
f910: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
f920: 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  b->pVfs;.    int
f930: 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20   needSync = 0;. 
f940: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
f950: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
f960: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
f970: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
f980: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
f990: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
f9a0: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
f9b0: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
f9c0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
f9d0: 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
f9e0: 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
f9f0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
fa00: 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72  es;.    int retr
fa10: 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  yCount = 0;.    
fa20: 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a  int nMainFile;..
fa30: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
fa40: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
fa50: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
fa60: 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  nMainFile = sqli
fa70: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69  te3Strlen30(zMai
fa80: 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73  nFile);.    zMas
fa90: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
faa0: 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58  intf(db, "%s-mjX
fab0: 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69  XXXXX9XXz", zMai
fac0: 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  nFile);.    if( 
fad0: 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74  zMaster==0 ) ret
fae0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
faf0: 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
fb00: 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20   u32 iRandom;.  
fb10: 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
fb20: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  nt ){.        if
fb30: 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30  ( retryCount>100
fb40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
fb50: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
fb60: 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74  _FULL, "MJ delet
fb70: 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
fb80: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
fb90: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
fba0: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
fbb0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
fbc0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
fbd0: 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20  ( retryCount==1 
fbe0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
fbf0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
fc00: 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64  FULL, "MJ collid
fc10: 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29  e: %s", zMaster)
fc20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fc30: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43    }.      retryC
fc40: 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71  ount++;.      sq
fc50: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
fc60: 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29  (sizeof(iRandom)
fc70: 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20  , &iRandom);.   
fc80: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
fc90: 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72  ntf(13, &zMaster
fca0: 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d  [nMainFile], "-m
fcb0: 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20  j%06X9%02X",.   
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61              (iRa
fce0: 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66  ndom>>8)&0xfffff
fcf0: 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29  f, iRandom&0xff)
fd00: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;.      /* The a
fd10: 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63  ntipenultimate c
fd20: 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20  haracter of the 
fd30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
fd40: 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ame must.      *
fd50: 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69  * be "9" to avoi
fd60: 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e  d name collision
fd70: 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33  s when using 8+3
fd80: 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20   filenames. */. 
fd90: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61       assert( zMa
fda0: 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c  ster[sqlite3Strl
fdb0: 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d  en30(zMaster)-3]
fdc0: 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73  =='9' );.      s
fdd0: 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
fde0: 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61  3(zMainFile, zMa
fdf0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ster);.      rc 
fe00: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
fe10: 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
fe20: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
fe30: 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
fe40: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
fe50: 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29  LITE_OK && res )
fe60: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
fe70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
fe80: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
fe90: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  ter journal. */.
fea0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
feb0: 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70  e3OsOpenMalloc(p
fec0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70  Vfs, zMaster, &p
fed0: 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20  Master, .       
fee0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
fef0: 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
ff00: 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
ff10: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
ff20: 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
ff30: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
ff40: 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20  JOURNAL, 0.     
ff50: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
ff60: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ff70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ff80: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
ff90: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
ffa0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20  n rc;.    }. .  
ffb0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
ffc0: 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61  ame of each data
ffd0: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65  base file in the
ffe0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74   transaction int
fff0: 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
10000 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10010 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  file. If an erro
10020 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73  r occurs at this
10030 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20   point close.   
10040 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74   ** and delete t
10050 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10060 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20  l file. All the 
10070 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
10080 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20  al files.    ** 
10090 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c  still have 'null
100a0 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20  ' as the master 
100b0 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c  journal pointer,
100c0 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f   so they will ro
100d0 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69  ll.    ** back i
100e0 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20  ndependently if 
100f0 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  a failure occurs
10100 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
10110 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
10120 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
10130 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
10140 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
10150 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
10160 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
10170 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
10180 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
10190 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
101a0 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
101b0 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
101c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
101d0 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49   continue;  /* I
101e0 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a  gnore TEMP and :
101f0 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65  memory: database
10200 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  s */.        }. 
10210 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
10220 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  File[0]!=0 );.  
10230 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53        if( !needS
10240 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42  ync && !sqlite3B
10250 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
10260 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
10270 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
10280 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10290 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
102a0 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20  sWrite(pMaster, 
102b0 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74  zFile, sqlite3St
102c0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c  rlen30(zFile)+1,
102d0 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
102e0 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69    offset += sqli
102f0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
10300 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66  e)+1;.        if
10310 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
10330 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
10340 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
10350 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
10360 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
10370 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
10380 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
10390 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
103a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
103b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
103c0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
103d0 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65  * Sync the maste
103e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
103f0 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51  If the IOCAP_SEQ
10400 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20  UENTIAL device. 
10410 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65     ** flag is se
10420 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65  t this is not re
10430 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
10440 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
10450 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c  .     && 0==(sql
10460 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
10470 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
10480 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
10490 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20  P_SEQUENTIAL).  
104a0 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
104b0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
104c0 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
104d0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
104e0 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
104f0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
10500 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
10510 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
10520 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
10530 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
10540 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
10550 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
10560 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
10570 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
10580 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
10590 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
105a0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
105b0 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
105c0 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
105d0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
105e0 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
105f0 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
10600 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
10610 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
10620 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
10630 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10640 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
10650 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
10660 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
10670 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
10680 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
10690 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
106a0 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
106b0 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
106c0 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
106d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
106e0 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
106f0 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
10700 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
10710 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
10720 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
10730 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
10740 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
10750 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
10760 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
10770 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f  occurred..    */
10780 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
10790 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
107a0 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
107b0 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
107c0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
107d0 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
107e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
107f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
10800 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
10810 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
10820 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
10830 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
10840 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
10850 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
10860 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66  E_BUSY );.    if
10870 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10880 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10890 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
108a0 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
108b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
108c0 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
108d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
108e0 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
108f0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
10900 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
10910 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
10920 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
10930 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
10940 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
10950 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
10960 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
10970 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
10980 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
10990 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
109a0 72 2c 20 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  r, needSync);.  
109b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
109c0 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
109d0 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
109e0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
109f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10a00 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20    }..    /* All 
10a10 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74  files and direct
10a20 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61  ories have alrea
10a30 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20  dy been synced, 
10a40 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  so the following
10a50 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  .    ** calls to
10a60 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
10a70 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72  mitPhaseTwo() ar
10a80 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66  e only closing f
10a90 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  iles and.    ** 
10aa0 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
10ab0 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e  cating journals.
10ac0 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   If something go
10ad0 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20  es wrong while. 
10ae0 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61     ** this is ha
10af0 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74  ppening we don't
10b00 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68   really care. Th
10b10 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
10b20 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
10b30 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
10b40 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74   guaranteed, but
10b50 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c   some stray 'col
10b60 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20  d' journals.    
10b70 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20  ** may be lying 
10b80 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e  around. Returnin
10b90 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  g an error code 
10ba0 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65  won't help matte
10bb0 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  rs..    */.    d
10bc0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
10bd0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
10be0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
10bf0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10c00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
10c10 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
10c20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
10c30 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
10c40 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
10c50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10c60 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
10c70 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20  Two(pBt, 1);.   
10c80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
10c90 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
10ca0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61  alloc();.    ena
10cb0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
10cc0 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20  _errors();..    
10cd0 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
10ce0 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
10cf0 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
10d00 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72  }../* .** This r
10d10 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68  outine checks th
10d20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e  at the sqlite3.n
10d30 56 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74  VdbeActive count
10d40 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74   variable.** mat
10d50 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ches the number 
10d60 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65  of vdbe's in the
10d70 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56   list sqlite3.pV
10d80 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  dbe that are.** 
10d90 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
10da0 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  . An assertion f
10db0 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20  ails if the two 
10dc0 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  counts do not ma
10dd0 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  tch..** This is 
10de0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66  an internal self
10df0 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74  -check only - it
10e00 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e   is not an essen
10e10 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a  tial processing.
10e20 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  ** step..**.** T
10e30 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
10e40 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  f NDEBUG is defi
10e50 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
10e60 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f  NDEBUG.static vo
10e70 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  id checkActiveVd
10e80 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  beCnt(sqlite3 *d
10e90 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
10ea0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
10eb0 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a  int nWrite = 0;.
10ec0 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b    int nRead = 0;
10ed0 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  .  p = db->pVdbe
10ee0 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
10ef0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
10f00 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74  stmt_busy((sqlit
10f10 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20  e3_stmt*)p) ){. 
10f20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
10f30 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c    if( p->readOnl
10f40 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b  y==0 ) nWrite++;
10f50 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49  .      if( p->bI
10f60 73 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b  sReader ) nRead+
10f70 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
10f80 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
10f90 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
10fa0 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b  ->nVdbeActive );
10fb0 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74  .  assert( nWrit
10fc0 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  e==db->nVdbeWrit
10fd0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  e );.  assert( n
10fe0 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52  Read==db->nVdbeR
10ff0 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ead );.}.#else.#
11000 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69  define checkActi
11010 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e  veVdbeCnt(x).#en
11020 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
11030 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
11040 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
11050 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61  ent opened a sta
11060 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
11070 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20  on,.** close it 
11080 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f  now. Argument eO
11090 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  p must be either
110a0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
110b0 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f  ACK or.** SAVEPO
110c0 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20  INT_RELEASE. If 
110d0 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
110e0 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74  ROLLBACK, then t
110f0 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
11100 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
11110 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65  olled back. If e
11120 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  Op is SAVEPOINT_
11130 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68  RELEASE, then th
11140 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  e .** statement 
11150 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
11160 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
11170 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
11180 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45  ccurs, an SQLITE
11190 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
111a0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
111b0 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
111c0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
111d0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  nt sqlite3VdbeCl
111e0 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62  oseStatement(Vdb
111f0 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a  e *p, int eOp){.
11200 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74    sqlite3 *const
11210 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69   db = p->db;.  i
11220 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11230 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69  K;..  /* If p->i
11240 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65  Statement is gre
11250 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
11260 74 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f  then this Vdbe o
11270 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74  pened a .  ** st
11280 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
11290 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ion that should 
112a0 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20  be closed here. 
112b0 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69  The only excepti
112c0 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20  on.  ** is that 
112d0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20  an IO error may 
112e0 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c 20 63  have occurred, c
112f0 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65  ausing an emerge
11300 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  ncy rollback..  
11310 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
11320 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d  (db->nStatement=
11330 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69  =0), and there i
11340 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e  s nothing to do.
11350 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
11360 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d  nStatement && p-
11370 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  >iStatement ){. 
11380 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f     int i;.    co
11390 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69  nst int iSavepoi
113a0 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65  nt = p->iStateme
113b0 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72  nt-1;..    asser
113c0 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  t( eOp==SAVEPOIN
113d0 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f  T_ROLLBACK || eO
113e0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
113f0 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72  EASE);.    asser
11400 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  t( db->nStatemen
11410 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  t>0 );.    asser
11420 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  t( p->iStatement
11430 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  ==(db->nStatemen
11440 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  t+db->nSavepoint
11450 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ) );..    for(i=
11460 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
11470 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72  +){ .      int r
11480 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
11490 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
114a0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
114b0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
114c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
114d0 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
114e0 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
114f0 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
11500 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
11510 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
11520 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
11530 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
11540 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32  .        if( rc2
11550 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11560 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
11570 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
11580 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
11590 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61  INT_RELEASE, iSa
115a0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
115b0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
115c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
115d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
115e0 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc2;.        }. 
115f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11600 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d   db->nStatement-
11610 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65  -;.    p->iState
11620 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  ment = 0;..    i
11630 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11640 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f   ){.      if( eO
11650 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
11660 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
11670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
11680 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
11690 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
116a0 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
116b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
116c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
116d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
116e0 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
116f0 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
11700 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76  NT_RELEASE, iSav
11710 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d  epoint);.      }
11720 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
11730 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
11740 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
11750 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
11760 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74  , also restore t
11770 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
11780 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65  ase handles defe
11790 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
117a0 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76  counter to the v
117b0 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e  alue it had when
117c0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61   .    ** the sta
117d0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
117e0 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20  on was opened.  
117f0 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  */.    if( eOp==
11800 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
11810 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  CK ){.      db->
11820 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
11830 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b  p->nStmtDefCons;
11840 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  .      db->nDefe
11850 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d  rredImmCons = p-
11860 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73  >nStmtDefImmCons
11870 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11880 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11890 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
118a0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
118b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
118c0 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62  ned by the datab
118d0 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61  ase .** handle a
118e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
118f0 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
11900 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  an argument is a
11910 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63  bout to be .** c
11920 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65  ommitted. If the
11930 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
11940 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  ng deferred fore
11950 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
11960 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73  nt.** violations
11970 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
11980 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65  ERROR. Otherwise
11990 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
119a0 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
119b0 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76  outstanding FK v
119c0 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68  iolations and th
119d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
119e0 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  rns .** SQLITE_E
119f0 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65  RROR, set the re
11a00 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74  sult of the VM t
11a10 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  o SQLITE_CONSTRA
11a20 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a  INT_FOREIGNKEY.*
11a30 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65  * and write an e
11a40 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
11a50 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20  it. Then return 
11a60 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
11a70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11a80 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
11a90 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
11aa0 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c  CheckFk(Vdbe *p,
11ab0 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a   int deferred){.
11ac0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11ad0 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65  p->db;.  if( (de
11ae0 66 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e  ferred && (db->n
11af0 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d  DeferredCons+db-
11b00 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
11b10 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64  s)>0) .   || (!d
11b20 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46  eferred && p->nF
11b30 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a  kConstraint>0) .
11b40 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d    ){.    p->rc =
11b50 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
11b60 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
11b70 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
11b80 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
11b90 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
11ba0 6f 72 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b  or(p, "FOREIGN K
11bb0 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
11bc0 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  iled");.    retu
11bd0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
11be0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
11bf0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
11c00 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
11c10 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
11c20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20  the when a VDBE 
11c30 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20  tries to halt.  
11c40 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68  If the VDBE.** h
11c50 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20  as made changes 
11c60 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  and is in autoco
11c70 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20  mmit mode, then 
11c80 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20  commit those.** 
11c90 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72  changes.  If a r
11ca0 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65  ollback is neede
11cb0 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72  d, then do the r
11cc0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
11cd0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
11ce0 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
11cf0 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ove the state of
11d00 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51   a VM from.** SQ
11d10 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74  LITE_MAGIC_RUN t
11d20 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  o SQLITE_MAGIC_H
11d30 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d  ALT.  It is harm
11d40 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20  less to.** call 
11d50 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61  this on a VM tha
11d60 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49  t is in the SQLI
11d70 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74  TE_MAGIC_HALT st
11d80 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
11d90 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
11da0 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
11db0 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  could not comple
11dc0 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a  te because of.**
11dd0 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
11de0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
11df0 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45  BUSY.  If SQLITE
11e00 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
11e10 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  d, it.** means t
11e20 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74  he close did not
11e30 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64   happen and need
11e40 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64  s to be repeated
11e50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11e60 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70  VdbeHalt(Vdbe *p
11e70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e90 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
11ea0 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20  store transient 
11eb0 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a  return codes */.
11ec0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11ed0 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69  p->db;..  /* Thi
11ee0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
11ef0 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68  ins the logic th
11f00 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  at determines if
11f10 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a   a statement or.
11f20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
11f30 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74   will be committ
11f40 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
11f50 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  k as a result of
11f60 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74   the.  ** execut
11f70 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74  ion of this virt
11f80 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20  ual machine. .  
11f90 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f  **.  ** If any o
11fa0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
11fb0 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20  errors occur:.  
11fc0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  **.  **     SQLI
11fd0 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20  TE_NOMEM.  **   
11fe0 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20    SQLITE_IOERR. 
11ff0 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46   **     SQLITE_F
12000 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ULL.  **     SQL
12010 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20  ITE_INTERRUPT.  
12020 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
12030 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20   internal cache 
12040 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
12050 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
12060 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61  sistent.  ** sta
12070 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  te.  We need to 
12080 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61  rollback the sta
12090 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
120a0 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a  on, if there is.
120b0 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65    ** one, or the
120c0 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61   complete transa
120d0 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69  ction if there i
120e0 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  s no statement t
120f0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
12100 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ..  if( p->db->m
12110 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
12120 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
12130 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
12140 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20  f( p->aOnceFlag 
12150 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63  ) memset(p->aOnc
12160 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e  eFlag, 0, p->nOn
12170 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65  ceFlag);.  close
12180 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
12190 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
121a0 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
121b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
121c0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65  TE_OK;.  }.  che
121d0 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
121e0 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f  db);..  /* No co
121f0 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
12200 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70   needed if the p
12210 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61  rogram never sta
12220 72 74 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20  rted or if the. 
12230 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
12240 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20  t does not read 
12250 6f 72 20 77 72 69 74 65 20 61 20 64 61 74 61 62  or write a datab
12260 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20  ase file.  */.  
12270 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20  if( p->pc>=0 && 
12280 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a  p->bIsReader ){.
12290 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f      int mrc;   /
122a0 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20  * Primary error 
122b0 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20  code from p->rc 
122c0 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74  */.    int eStat
122d0 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20  ementOp = 0;.   
122e0 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72   int isSpecialEr
122f0 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ror;            
12300 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
12310 66 20 61 20 27 73 70 65 63 69 61 6c 27 20 65 72  f a 'special' er
12320 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c  ror */..    /* L
12330 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75  ock all btrees u
12340 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65  sed by the state
12350 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ment */.    sqli
12360 74 65 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b  te3VdbeEnter(p);
12370 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
12380 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  or one of the sp
12390 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a  ecial errors */.
123a0 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20      mrc = p->rc 
123b0 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70  & 0xff;.    isSp
123c0 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63  ecialError = mrc
123d0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
123e0 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  | mrc==SQLITE_IO
123f0 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERR.            
12400 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d           || mrc=
12410 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
12420 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  T || mrc==SQLITE
12430 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69  _FULL;.    if( i
12440 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b  sSpecialError ){
12450 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
12460 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d   query was read-
12470 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72  only and the err
12480 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
12490 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20  E_INTERRUPT, .  
124a0 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61      ** no rollba
124b0 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e  ck is necessary.
124c0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c   Otherwise, at l
124d0 65 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74  east a savepoint
124e0 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
124f0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72  action must be r
12500 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65  olled back to re
12510 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
12520 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a  se to a .      *
12530 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  * consistent sta
12540 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  te..      **.   
12550 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68     ** Even if th
12560 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72  e statement is r
12570 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20  ead-only, it is 
12580 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72  important to per
12590 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20  form.      ** a 
125a0 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61  statement or tra
125b0 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
125c0 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20  k operation. If 
125d0 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20  the error .     
125e0 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69   ** occurred whi
125f0 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  le writing to th
12600 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a  e journal, sub-j
12610 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61  ournal or databa
12620 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  se.      ** file
12630 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   as part of an e
12640 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70  ffort to free up
12650 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73 65   cache space (se
12660 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  e function.     
12670 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73 28   ** pagerStress(
12680 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74  ) in pager.c), t
12690 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72  he rollback is r
126a0 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f  equired to resto
126b0 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  re .      ** the
126c0 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73   pager to a cons
126d0 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20  istent state..  
126e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
126f0 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c   !p->readOnly ||
12700 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc!=SQLITE_INT
12710 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20  ERRUPT ){.      
12720 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49    if( (mrc==SQLI
12730 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
12740 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26  =SQLITE_FULL) &&
12750 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
12760 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nal ){.         
12770 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
12780 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
12790 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  CK;.        }els
127a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
127b0 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f  We are forced to
127c0 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61   roll back the a
127d0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
127e0 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a  n. Before doing.
127f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c            ** so,
12800 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72   abort any other
12810 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73   statements this
12820 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c   handle currentl
12830 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20  y has active..  
12840 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
12850 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
12860 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
12870 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
12880 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  K);.          sq
12890 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
128a0 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
128b0 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
128c0 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
128d0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
128e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
128f0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
12900 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65  * Check for imme
12910 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
12920 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f  y violations. */
12930 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
12940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12950 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
12960 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20  eckFk(p, 0);.   
12970 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
12980 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  the auto-commit 
12990 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
129a0 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  this is the only
129b0 20 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a   active writer .
129c0 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20      ** VM, then 
129d0 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63  we do either a c
129e0 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
129f0 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  k of the current
12a00 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20   transaction. . 
12a10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
12a20 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c  e: This block al
12a30 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f  so runs if one o
12a40 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
12a50 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20  rors handled .  
12a60 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f    ** above has o
12a70 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f  ccurred. .    */
12a80 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
12a90 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20  3VtabInSync(db) 
12aa0 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74  .     && db->aut
12ab0 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26  oCommit .     &&
12ac0 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d   db->nVdbeWrite=
12ad0 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  =(p->readOnly==0
12ae0 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
12af0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
12b00 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f  E_OK || (p->erro
12b10 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
12b20 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72   && !isSpecialEr
12b30 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ror) ){.        
12b40 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
12b50 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20  CheckFk(p, 1);. 
12b60 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
12b70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12b80 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28        if( NEVER(
12b90 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a  p->readOnly) ){.
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
12bb0 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
12bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
12bd0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
12be0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
12bf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
12c00 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
12c10 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20  OREIGNKEY;.     
12c20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20     }else{ .     
12c30 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f       /* The auto
12c40 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
12c50 74 72 75 65 2c 20 74 68 65 20 76 64 62 65 20 70  true, the vdbe p
12c60 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63 65  rogram was succe
12c70 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20  ssful .         
12c80 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f   ** or hit an 'O
12c90 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69  R FAIL' constrai
12ca0 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  nt and there are
12cb0 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72   no deferred for
12cc0 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  eign.          *
12cd0 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  * key constraint
12ce0 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65  s to hold up the
12cf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
12d00 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69  is means a commi
12d10 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  t .          ** 
12d20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  is required. */.
12d30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76            rc = v
12d40 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29  dbeCommit(db, p)
12d50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12d60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12d70 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65  TE_BUSY && p->re
12d80 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
12d90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
12da0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
12db0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12dc0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
12dd0 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
12de0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12df0 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
12e00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12e10 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
12e20 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20   SQLITE_OK);.   
12e30 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
12e40 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
12e50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
12e60 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
12e70 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
12e80 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
12e90 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  mCons = 0;.     
12ea0 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
12eb0 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46  = ~SQLITE_DeferF
12ec0 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Ks;.          sq
12ed0 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
12ee0 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
12ef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12f00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
12f10 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
12f20 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
12f30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68  ;.        p->nCh
12f40 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
12f50 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61  }.      db->nSta
12f60 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  tement = 0;.    
12f70 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65  }else if( eState
12f80 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20  mentOp==0 ){.   
12f90 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
12fa0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72  LITE_OK || p->er
12fb0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
12fc0 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  il ){.        eS
12fd0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
12fe0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a  EPOINT_RELEASE;.
12ff0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13000 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
13010 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
13020 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
13030 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
13040 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  LBACK;.      }el
13050 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
13060 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
13070 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
13080 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
13090 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
130a0 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
130b0 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
130c0 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
130d0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
130e0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
130f0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53  .  .    /* If eS
13100 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f  tatementOp is no
13110 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73  n-zero, then a s
13120 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
13130 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20  tion needs to.  
13140 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65    ** be committe
13150 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
13160 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  . Call sqlite3Vd
13170 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
13180 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20  () to.    ** do 
13190 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72  so. If this oper
131a0 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ation returns an
131b0 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20   error, and the 
131c0 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
131d0 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63  t.    ** error c
131e0 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b  ode is SQLITE_OK
131f0 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   or SQLITE_CONST
13200 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d  RAINT, then prom
13210 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ote the.    ** c
13220 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
13230 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20   error code..   
13240 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61   */.    if( eSta
13250 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20  tementOp ){.    
13260 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
13270 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
13280 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  (p, eStatementOp
13290 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
132a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
132b0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
132c0 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d  || (p->rc&0xff)=
132d0 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
132e0 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NT ){.          
132f0 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
13300 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
13310 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
13320 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  sg);.          p
13330 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
13340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13350 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
13360 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
13370 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
13380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
13390 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
133a0 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
133b0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
133c0 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
133d0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
133e0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
133f0 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
13400 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
13410 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73   DELETE and no s
13420 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
13430 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20  tion.    ** has 
13440 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
13450 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74  , update the dat
13460 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13470 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
13480 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
13490 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   p->changeCntOn 
134a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74  ){.      if( eSt
134b0 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50  atementOp!=SAVEP
134c0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
134d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
134e0 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
134f0 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
13500 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13510 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13520 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30  SetChanges(db, 0
13530 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13540 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
13550 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
13560 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73  elease the locks
13570 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
13580 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  dbeLeave(p);.  }
13590 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73  ..  /* We have s
135a0 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74  uccessfully halt
135b0 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68  ed and closed th
135c0 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68  e VM.  Record th
135d0 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66  is fact. */.  if
135e0 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
135f0 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76    db->nVdbeActiv
13600 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d  e--;.    if( !p-
13610 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e  >readOnly ) db->
13620 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20  nVdbeWrite--;.  
13630 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64    if( p->bIsRead
13640 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 65 52 65  er ) db->nVdbeRe
13650 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ad--;.    assert
13660 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
13670 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  e>=db->nVdbeRead
13680 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13690 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64  db->nVdbeRead>=d
136a0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b  b->nVdbeWrite );
136b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
136c0 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d 30 20 29  >nVdbeWrite>=0 )
136d0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
136e0 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41   = VDBE_MAGIC_HA
136f0 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  LT;.  checkActiv
13700 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20  eVdbeCnt(db);.  
13710 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
13720 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
13730 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
13740 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  MEM;.  }..  /* I
13750 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
13760 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  t flag is set to
13770 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
13780 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20  locks that were 
13790 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e  held.  ** by con
137a0 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20  nection db have 
137b0 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65  now been release
137c0 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  d. Call sqlite3C
137d0 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
137e0 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76  d() .  ** to inv
137f0 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64  oke any required
13800 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
13810 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
13820 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
13830 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
13840 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
13850 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  cked(db);.  }.. 
13860 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
13870 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62  beActive>0 || db
13880 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
13890 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  || db->nStatemen
138a0 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==0 );.  return
138b0 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f   (p->rc==SQLITE_
138c0 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55  BUSY ? SQLITE_BU
138d0 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  SY : SQLITE_OK);
138e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .}.../*.** Each 
138f0 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72  VDBE holds the r
13900 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73  esult of the mos
13910 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
13920 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20  _step() call.** 
13930 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20  in p->rc.  This 
13940 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61  routine sets tha
13950 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f  t result back to
13960 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76   SQLITE_OK..*/.v
13970 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
13980 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56  esetStepResult(V
13990 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63  dbe *p){.  p->rc
139a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a   = SQLITE_OK;.}.
139b0 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
139c0 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65  error code and e
139d0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c  rror message bel
139e0 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44  onging to the VD
139f0 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  BE passed.** as 
13a00 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
13a10 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61 62 61  nt to its databa
13a20 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68  se handle (so th
13a30 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  at they will be 
13a40 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20  .** returned by 
13a50 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
13a60 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73  _errcode() and s
13a70 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29  qlite3_errmsg())
13a80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
13a90 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63  ction does not c
13aa0 6c 65 61 72 20 74 68 65 20 56 44 42 45 20 65 72  lear the VDBE er
13ab0 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73  ror code or mess
13ac0 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70  age, just.** cop
13ad0 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20  ies them to the 
13ae0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
13af0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
13b00 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
13b10 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
13b20 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
13b30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  ;.  int rc = p->
13b40 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72  rc;.  if( p->zEr
13b50 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 38 20 6d  rMsg ){.    u8 m
13b60 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 64 62  allocFailed = db
13b70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a  ->mallocFailed;.
13b80 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
13b90 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
13ba0 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72      if( db->pErr
13bb0 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d  ==0 ) db->pErr =
13bc0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
13bd0 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (db);.    sqlite
13be0 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
13bf0 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45  >pErr, -1, p->zE
13c00 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54  rrMsg, SQLITE_UT
13c10 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  F8, SQLITE_TRANS
13c20 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
13c30 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
13c40 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  c();.    db->mal
13c50 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c  locFailed = mall
13c60 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 64 62  ocFailed;.    db
13c70 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
13c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
13c90 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
13ca0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
13cb0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
13cc0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
13cd0 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53  OG./*.** If an S
13ce0 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c  QLITE_CONFIG_SQL
13cf0 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69  LOG hook is regi
13d00 73 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56  stered and the V
13d10 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20  M has been run, 
13d20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a  .** invoke it..*
13d30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
13d40 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56  beInvokeSqllog(V
13d50 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73  dbe *v){.  if( s
13d60 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
13d70 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d  ig.xSqllog && v-
13d80 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
13d90 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e  & v->zSql && v->
13da0 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  pc>=0 ){.    cha
13db0 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73  r *zExpanded = s
13dc0 71 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64  qlite3VdbeExpand
13dd0 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b  Sql(v, v->zSql);
13de0 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e  .    assert( v->
13df0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
13e00 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70   );.    if( zExp
13e10 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73  anded ){.      s
13e20 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
13e30 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20  ig.xSqllog(.    
13e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
13e50 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
13e60 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78  gArg, v->db, zEx
13e70 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20  panded, 1.      
13e80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13e90 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45  DbFree(v->db, zE
13ea0 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a  xpanded);.    }.
13eb0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
13ec0 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53  fine vdbeInvokeS
13ed0 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a  qllog(x).#endif.
13ee0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
13ef0 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
13f00 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f  cution but do no
13f10 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42  t delete the VDB
13f20 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57  E just yet..** W
13f30 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
13f40 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a  essages into *pz
13f50 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20  ErrMsg.  Return 
13f60 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
13f70 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  .**.** After thi
13f80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e  s routine is run
13f90 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c  , the VDBE shoul
13fa0 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65  d be ready to be
13fb0 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61   executed.** aga
13fc0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f  in..**.** To loo
13fd0 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20  k at it another 
13fe0 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  way, this routin
13ff0 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61  e resets the sta
14000 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72  te of the.** vir
14010 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f  tual machine fro
14020 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  m VDBE_MAGIC_RUN
14030 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48   or VDBE_MAGIC_H
14040 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56  ALT back to.** V
14050 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a  DBE_MAGIC_INIT..
14060 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
14070 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29  beReset(Vdbe *p)
14080 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
14090 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  .  db = p->db;..
140a0 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64    /* If the VM d
140b0 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f  id not run to co
140c0 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69  mpletion or if i
140d0 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e  t encountered an
140e0 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65  .  ** error, the
140f0 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68  n it might not h
14100 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20  ave been halted 
14110 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61  properly.  So ha
14120 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a  lt.  ** it now..
14130 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
14140 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a  beHalt(p);..  /*
14150 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73   If the VDBE has
14160 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72   be run even par
14170 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61  tially, then tra
14180 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20  nsfer the error 
14190 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72  code.  ** and er
141a0 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d  ror message from
141b0 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74   the VDBE into t
141c0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
141d0 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74   structure.  But
141e0 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42  .  ** if the VDB
141f0 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  E has just been 
14200 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68  set to run but h
14210 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  as not actually 
14220 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a  executed any.  *
14230 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79  * instructions y
14240 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61  et, leave the ma
14250 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  in database erro
14260 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e  r information un
14270 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20  changed..  */.  
14280 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
14290 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71      vdbeInvokeSq
142a0 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c  llog(p);.    sql
142b0 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
142c0 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71  Error(p);.    sq
142d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
142e0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
142f0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
14300 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f  .    if( p->runO
14310 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70  nlyOnce ) p->exp
14320 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ired = 1;.  }els
14330 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70  e if( p->rc && p
14340 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20  ->expired ){.   
14350 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20   /* The expired 
14360 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
14370 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20  the VDBE before 
14380 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20  the first call. 
14390 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
143a0 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e  _step(). For con
143b0 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20  sistency (since 
143c0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77  sqlite3_step() w
143d0 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  as.    ** called
143e0 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  ), set the datab
143f0 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69  ase error in thi
14400 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a  s case as well..
14410 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
14420 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
14430 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72  b, p->rc, p->zEr
14440 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c  rMsg ? "%s" : 0,
14450 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
14460 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
14470 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
14480 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
14490 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
144a0 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72  eclaim all memor
144b0 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44  y used by the VD
144c0 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75  BE.  */.  Cleanu
144d0 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65  p(p);..  /* Save
144e0 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72   profiling infor
144f0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73  mation from this
14500 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a   VDBE run..  */.
14510 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
14520 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45  ILE.  {.    FILE
14530 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76   *out = fopen("v
14540 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22  dbe_profile.out"
14550 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20  , "a");.    if( 
14560 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  out ){.      int
14570 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   i;.      fprint
14580 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b  f(out, "---- ");
14590 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
145a0 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
145b0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
145c0 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e  out, "%02x", p->
145d0 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a  aOp[i].opcode);.
145e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
145f0 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
14600 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a  ;.      if( p->z
14610 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Sql ){.        c
14620 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20  har c, pc = 0;. 
14630 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
14640 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20  ut, "-- ");.    
14650 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20      for(i=0; (c 
14660 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30  = p->zSql[i])!=0
14670 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14680 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29    if( pc=='\n' )
14690 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
146a0 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  - ");.          
146b0 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20  putc(c, out);.  
146c0 20 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a          pc = c;.
146d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
146e0 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29    if( pc!='\n' )
146f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
14700 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n");.      }.   
14710 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
14720 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
14730 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30      char zHdr[10
14740 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0];.        sqli
14750 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
14760 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c  eof(zHdr), zHdr,
14770 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c   "%6u %12llu %8l
14780 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  lu ",.          
14790 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
147a0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
147b0 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
147c0 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
147d0 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
147e0 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
147f0 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
14800 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
14810 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  fprintf(out, "%s
14820 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20  ", zHdr);.      
14830 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
14840 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d  ntOp(out, i, &p-
14850 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >aOp[i]);.      
14860 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f  }.      fclose(o
14870 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ut);.    }.  }.#
14880 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75 72 72  endif.  p->iCurr
14890 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70  entTime = 0;.  p
148a0 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
148b0 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74  AGIC_INIT;.  ret
148c0 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e  urn p->rc & db->
148d0 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a  errMask;.}. ./*.
148e0 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** Clean up and 
148f0 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66  delete a VDBE af
14900 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
14910 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
14920 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68  r which is.** th
14930 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20  e result code.  
14940 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
14950 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74  message text int
14960 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  o *pzErrMsg..*/.
14970 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
14980 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29  inalize(Vdbe *p)
14990 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
149a0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
149b0 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
149c0 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67  IC_RUN || p->mag
149d0 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48  ic==VDBE_MAGIC_H
149e0 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ALT ){.    rc = 
149f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
14a00 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
14a10 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72   (rc & p->db->er
14a20 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20  rMask)==rc );.  
14a30 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  }.  sqlite3VdbeD
14a40 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75  elete(p);.  retu
14a50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14a60 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70  If parameter iOp
14a70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
14a80 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ro, then invoke 
14a90 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
14aa0 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69  or.** all auxili
14ab0 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72  ary data pointer
14ac0 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68  s currently cach
14ad0 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
14ae0 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69  sed as.** the fi
14af0 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
14b00 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69  .** Or, if iOp i
14b10 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
14b20 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
14b30 20 74 68 65 6e 20 74 68 65 20 64 65 73 74 72 75   then the destru
14b40 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  ctor is.** only 
14b50 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73  invoked for thos
14b60 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
14b70 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65   pointers create
14b80 64 20 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a  d by the user .*
14b90 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b  * function invok
14ba0 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e  ed by the OP_Fun
14bb0 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20  ction opcode at 
14bc0 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20  instruction iOp 
14bd0 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c  of .** VM pVdbe,
14be0 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69   and only then i
14bf0 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  f:.**.**    * th
14c00 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e  e associated fun
14c10 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
14c20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c  is the 32nd or l
14c30 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a  ater (counting.*
14c40 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74  *      from left
14c50 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a   to right), or.*
14c60 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f  *.**    * the co
14c70 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
14c80 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b  in argument mask
14c90 20 69 73 20 63 6c 65 61 72 20 28 77 68 65 72 65   is clear (where
14ca0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20   the first.**   
14cb0 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61     function para
14cc0 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64  meter correspond
14cd0 73 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29  s to bit 0 etc.)
14ce0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14cf0 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
14d00 74 61 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  ta(Vdbe *pVdbe, 
14d10 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73  int iOp, int mas
14d20 6b 29 7b 0a 20 20 41 75 78 44 61 74 61 20 2a 2a  k){.  AuxData **
14d30 70 70 20 3d 20 26 70 56 64 62 65 2d 3e 70 41 75  pp = &pVdbe->pAu
14d40 78 44 61 74 61 3b 0a 20 20 77 68 69 6c 65 28 20  xData;.  while( 
14d50 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61  *pp ){.    AuxDa
14d60 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a  ta *pAux = *pp;.
14d70 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a      if( (iOp<0).
14d80 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69       || (pAux->i
14d90 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41 75 78  Op==iOp && (pAux
14da0 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d  ->iArg>31 || !(m
14db0 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28  ask & MASKBIT32(
14dc0 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29 0a 20  pAux->iArg)))). 
14dd0 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74     ){.      test
14de0 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 72 67  case( pAux->iArg
14df0 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66  ==31 );.      if
14e00 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20  ( pAux->xDelete 
14e10 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d  ){.        pAux-
14e20 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70  >xDelete(pAux->p
14e30 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aux);.      }.  
14e40 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e      *pp = pAux->
14e50 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
14e60 69 74 65 33 44 62 46 72 65 65 28 70 56 64 62 65  ite3DbFree(pVdbe
14e70 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20  ->db, pAux);.   
14e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
14e90 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a  = &pAux->pNext;.
14ea0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
14eb0 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  ** Free all memo
14ec0 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
14ed0 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73  th the Vdbe pass
14ee0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
14ef0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78   argument,.** ex
14f00 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20  cept for object 
14f10 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73  itself, which is
14f20 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a   preserved..**.*
14f30 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
14f40 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
14f50 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74  nction and sqlit
14f60 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69  e3VdbeDelete() i
14f70 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65  s that.** VdbeDe
14f80 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69  lete() also unli
14f90 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f  nks the Vdbe fro
14fa0 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d  m the list of VM
14fb0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
14fc0 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  h.** the databas
14fd0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64  e connection and
14fe0 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63   frees the objec
14ff0 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69  t itself..*/.voi
15000 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65  d sqlite3VdbeCle
15010 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  arObject(sqlite3
15020 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
15030 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53    SubProgram *pS
15040 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e  ub, *pNext;.  in
15050 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
15060 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ->db==0 || p->db
15070 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73  ==db );.  releas
15080 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
15090 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72  r, p->nVar);.  r
150a0 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
150b0 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
150c0 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
150d0 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62  E_N);.  for(pSub
150e0 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53  =p->pProgram; pS
150f0 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b  ub; pSub=pNext){
15100 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75  .    pNext = pSu
15110 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64  b->pNext;.    vd
15120 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
15130 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75  , pSub->aOp, pSu
15140 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c  b->nOp);.    sql
15150 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
15160 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Sub);.  }.  for(
15170 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e  i=p->nzVar-1; i>
15180 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33  =0; i--) sqlite3
15190 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a  DbFree(db, p->az
151a0 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46  Var[i]);.  vdbeF
151b0 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70  reeOpArray(db, p
151c0 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a  ->aOp, p->nOp);.
151d0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
151e0 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
151f0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
15200 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a  e(db, p->zSql);.
15210 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15220 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23  db, p->pFree);.#
15230 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15240 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
15250 54 55 53 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  TUS.  for(i=0; i
15260 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b  <p->nScan; i++){
15270 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
15280 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b  ee(db, p->aScan[
15290 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
152a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
152b0 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 23 65  b, p->aScan);.#e
152c0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
152d0 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56  lete an entire V
152e0 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  DBE..*/.void sql
152f0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56  ite3VdbeDelete(V
15300 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
15310 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e  e3 *db;..  if( N
15320 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
15330 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  urn;.  db = p->d
15340 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
15350 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15360 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
15370 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72  sqlite3VdbeClear
15380 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20  Object(db, p);. 
15390 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
153a0 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
153b0 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
153c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
153d0 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d  sert( db->pVdbe=
153e0 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56  =p );.    db->pV
153f0 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  dbe = p->pNext;.
15400 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65    }.  if( p->pNe
15410 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
15420 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
15430 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  Prev;.  }.  p->m
15440 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
15450 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20  C_DEAD;.  p->db 
15460 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  = 0;.  sqlite3Db
15470 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
15480 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  /*.** The cursor
15490 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69   "p" has a pendi
154a0 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  ng seek operatio
154b0 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79  n that has not y
154c0 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69  et been.** carri
154d0 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68  ed out.  Seek th
154e0 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49  e cursor now.  I
154f0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
15500 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  s, return.** the
15510 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
15520 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
15530 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
15540 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66  INLINE handleDef
15550 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65  erredMoveto(Vdbe
15560 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
15570 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65  t res, rc;.#ifde
15580 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
15590 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
155a0 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
155b0 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
155c0 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
155d0 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eto );.  assert(
155e0 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
155f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
15600 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
15610 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  (p->pCursor, 0, 
15620 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
15630 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28   0, &res);.  if(
15640 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
15650 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20  .  if( res!=0 ) 
15660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
15670 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64  RRUPT_BKPT;.#ifd
15680 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
15690 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
156a0 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
156b0 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
156c0 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  eto = 0;.  p->ca
156d0 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
156e0 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72  E_STALE;.  retur
156f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15700 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20  /*.** Something 
15710 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72  has moved cursor
15720 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63   "p" out of plac
15730 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f  e.  Maybe the ro
15740 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e  w it was.** poin
15750 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74  ted to was delet
15760 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
15770 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20  r it.  Or maybe 
15780 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a  the btree was.**
15790 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68   rebalanced.  Wh
157a0 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65  atever the cause
157b0 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65  , try to restore
157c0 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63   "p" to the plac
157d0 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f  e it.** is suppo
157e0 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69  sed to be pointi
157f0 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20  ng.  If the row 
15800 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
15810 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a  from under the.*
15820 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68  * cursor, set th
15830 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
15840 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  t to a NULL row.
15850 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
15860 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68  QLITE_NOINLINE h
15870 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
15880 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
15890 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65  .  int isDiffere
158a0 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73  ntRow, rc;.  ass
158b0 65 72 74 28 20 70 2d 3e 70 43 75 72 73 6f 72 21  ert( p->pCursor!
158c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
158d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
158e0 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43  orHasMoved(p->pC
158f0 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d  ursor) );.  rc =
15900 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
15910 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e 70 43  sorRestore(p->pC
15920 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72  ursor, &isDiffer
15930 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61  entRow);.  p->ca
15940 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
15950 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69  E_STALE;.  if( i
15960 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20  sDifferentRow ) 
15970 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  p->nullRow = 1;.
15980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15990 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65  /*.** Check to e
159a0 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
159b0 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
159c0 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
159d0 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62  sor.** if need b
159e0 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49  e.  Return any I
159f0 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68  /O error from th
15a00 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74  e restore operat
15a10 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
15a20 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73  te3VdbeCursorRes
15a30 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72 20  tore(VdbeCursor 
15a40 2a 70 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *p){.  if( sqlit
15a50 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
15a60 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  Moved(p->pCursor
15a70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
15a80 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
15a90 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  r(p);.  }.  retu
15aa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15ab0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
15ac0 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73   the cursor p is
15ad0 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f   ready to read o
15ae0 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20  r write the row 
15af0 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77  to which it.** w
15b00 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e  as last position
15b10 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ed.  Return an e
15b20 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
15b30 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f  OOM fault or I/O
15b40 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e   error.** preven
15b50 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74  ts us from posit
15b60 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  ioning the curso
15b70 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74  r to its correct
15b80 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   position..**.**
15b90 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65   If a MoveTo ope
15ba0 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e  ration is pendin
15bb0 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63  g on the given c
15bc0 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74  ursor, then do t
15bd0 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f  hat.** MoveTo no
15be0 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69  w.  If no move i
15bf0 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b  s pending, check
15c00 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
15c10 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64  ow has been.** d
15c20 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
15c30 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
15c40 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20   and if it has, 
15c50 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a  mark the row as.
15c60 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  ** a NULL row..*
15c70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73  *.** If the curs
15c80 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
15c90 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f  inting to the co
15ca0 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68  rrect row and th
15cb0 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f  at row has.** no
15cc0 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f  t been deleted o
15cd0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
15ce0 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74  e cursor, then t
15cf0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
15d00 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
15d10 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
15d20 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f  Moveto(VdbeCurso
15d30 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
15d40 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29  deferredMoveto )
15d50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e  {.    return han
15d60 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74  dleDeferredMovet
15d70 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  o(p);.  }.  if( 
15d80 70 2d 3e 70 43 75 72 73 6f 72 20 26 26 20 73 71  p->pCursor && sq
15d90 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
15da0 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72  HasMoved(p->pCur
15db0 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  sor) ){.    retu
15dc0 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75  rn handleMovedCu
15dd0 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72  rsor(p);.  }.  r
15de0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15df0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
15e00 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
15e10 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  s:.**.** sqlite3
15e20 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29  VdbeSerialType()
15e30 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
15e40 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a  erialTypeLen().*
15e50 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
15e60 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ialLen().** sqli
15e70 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
15e80 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
15e90 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a  eSerialGet().**.
15ea0 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74  ** encapsulate t
15eb0 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72  he code that ser
15ec0 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66  ializes values f
15ed0 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51  or storage in SQ
15ee0 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64  Lite.** data and
15ef0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20   index records. 
15f00 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20  Each serialized 
15f10 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f  value consists o
15f20 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74  f a.** 'serial-t
15f30 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20  ype' and a blob 
15f40 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72  of data. The ser
15f50 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38  ial type is an 8
15f60 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a  -byte unsigned.*
15f70 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65  * integer, store
15f80 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  d as a varint..*
15f90 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74  *.** In an SQLit
15fa0 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  e index record, 
15fb0 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
15fc0 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74  is stored direct
15fd0 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ly before.** the
15fe0 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68   blob of data th
15ff0 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  at it correspond
16000 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65  s to. In a table
16010 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72   record, all ser
16020 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65  ial.** types are
16030 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
16040 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  tart of the reco
16050 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  rd, and the blob
16060 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20  s of data at.** 
16070 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74  the end. Hence t
16080 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
16090 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20  llow the caller 
160a0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a  to handle the.**
160b0 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64   serial-type and
160c0 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72   data blob separ
160d0 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ately..**.** The
160e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
160f0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76   describes the v
16100 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63  arious storage c
16110 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a  lasses for data:
16120 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20  .**.**   serial 
16130 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65  type        byte
16140 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74  s of data      t
16150 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ype.**   -------
16160 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
16170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
16180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
16190 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  *      0        
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
161b0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a            NULL.*
161c0 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  *      1        
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
161e0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
161f0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
16200 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
16210 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
16220 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
16230 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20  er.**      3    
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69   3            si
16260 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
16270 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
16280 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20             4    
16290 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
162a0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35  nteger.**      5
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
162d0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
162e0 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20  .**      6      
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
16300 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
16310 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
16320 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20     7            
16330 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
16340 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74        IEEE float
16350 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20  .**      8      
16360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
16370 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
16380 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a  ger constant 0.*
16390 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20  *      9        
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
163b0 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
163c0 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20  r constant 1.** 
163d0 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20      10,11       
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163f0 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
16400 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a   for expansion.*
16410 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65  *    N>=12 and e
16420 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29  ven       (N-12)
16430 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a  /2        BLOB.*
16440 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f  *    N>=13 and o
16450 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29  dd        (N-13)
16460 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a  /2        text.*
16470 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39  *.** The 8 and 9
16480 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65   types were adde
16490 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65  d in 3.3.0, file
164a0 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f   format 4.  Prio
164b0 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
164c0 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
164d0 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73   understand thos
164e0 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  e serial types..
164f0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
16500 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65   the serial-type
16510 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
16520 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a  tored in pMem..*
16530 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
16540 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20  eSerialType(Mem 
16550 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
16560 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66  format){.  int f
16570 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
16580 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20  gs;.  u32 n;..  
16590 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
165a0 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
165b0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
165c0 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
165d0 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
165e0 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
165f0 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
16600 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
16610 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
16620 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30  (((i64)0x0000800
16630 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
16640 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
16650 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
16660 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
16670 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65    u = ~i;.    }e
16680 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
16690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
166a0 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20  u<=127 ){.      
166b0 72 65 74 75 72 6e 20 28 28 69 26 31 29 3d 3d 69  return ((i&1)==i
166c0 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e   && file_format>
166d0 3d 34 29 20 3f 20 38 2b 28 75 33 32 29 75 20 3a  =4) ? 8+(u32)u :
166e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
166f0 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74  ( u<=32767 ) ret
16700 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75  urn 2;.    if( u
16710 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74 75  <=8388607 ) retu
16720 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 3;.    if( u<
16730 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72 65  =2147483647 ) re
16740 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20  turn 4;.    if( 
16750 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72  u<=MAX_6BYTE ) r
16760 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74  eturn 5;.    ret
16770 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 6;.  }.  if(
16780 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20   flags&MEM_Real 
16790 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b  ){.    return 7;
167a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
167b0 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  Mem->db->mallocF
167c0 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28  ailed || flags&(
167d0 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62  MEM_Str|MEM_Blob
167e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
167f0 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e  Mem->n>=0 );.  n
16800 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b   = (u32)pMem->n;
16810 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
16820 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
16830 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
16840 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  o;.  }.  return 
16850 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28  ((n*2) + 12 + ((
16860 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d  flags&MEM_Str)!=
16870 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  0));.}../*.** Th
16880 65 20 73 69 7a 65 73 20 66 6f 72 20 73 65 72 69  e sizes for seri
16890 61 6c 20 74 79 70 65 73 20 6c 65 73 73 20 74 68  al types less th
168a0 61 6e 20 31 32 0a 2a 2f 0a 73 74 61 74 69 63 20  an 12.*/.static 
168b0 63 6f 6e 73 74 20 75 38 20 73 71 6c 69 74 65 33  const u8 sqlite3
168c0 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d  SmallTypeSizes[]
168d0 20 3d 20 7b 0a 20 20 30 2c 20 31 2c 20 32 2c 20   = {.  0, 1, 2, 
168e0 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30  3, 4, 6, 8, 8, 0
168f0 2c 20 30 2c 20 30 2c 20 30 0a 7d 3b 0a 0a 2f 2a  , 0, 0, 0.};../*
16900 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
16910 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74  ength of the dat
16920 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
16930 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
16940 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a  serial-type..*/.
16950 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
16960 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32  erialTypeLen(u32
16970 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
16980 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
16990 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75  >=12 ){.    retu
169a0 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d  rn (serial_type-
169b0 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  12)/2;.  }else{.
169c0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
169d0 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
169e0 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
169f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77   }.}../*.** If w
16a00 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68  e are on an arch
16a10 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69  itecture with mi
16a20 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74  xed-endian float
16a30 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28  ing .** points (
16a40 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73  ex: ARM7) then s
16a50 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20  wap the lower 4 
16a60 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a  bytes with the .
16a70 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73  ** upper 4 bytes
16a80 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
16a90 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  sult..**.** For 
16aa0 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72  most architectur
16ab0 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  es, this is a no
16ac0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65  -op..**.** (late
16ad0 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72  r):  It is repor
16ae0 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74  ted to me that t
16af0 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  he mixed-endian 
16b00 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52  problem.** on AR
16b10 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77  M7 is an issue w
16b20 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74  ith GCC, not wit
16b30 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e  h the ARM7 chip.
16b40 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68    It seems.** th
16b50 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e  at early version
16b60 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20  s of GCC stored 
16b70 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66  the two words of
16b80 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f   a 64-bit.** flo
16b90 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20  at in the wrong 
16ba0 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74  order.  And that
16bb0 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
16bc0 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76  propagated.** ev
16bd0 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62  er since.  The b
16be0 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  lame is not nece
16bf0 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43  ssarily with GCC
16c00 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43  , though..** GCC
16c10 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74   might have just
16c20 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f   copying the pro
16c30 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f  blem from a prio
16c40 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49  r compiler..** I
16c50 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68   am also told th
16c60 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  at newer version
16c70 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f  s of GCC that fo
16c80 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74  llow a different
16c90 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20  .** ABI get the 
16ca0 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74  byte order right
16cb0 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65  ..**.** Develope
16cc0 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20  rs using SQLite 
16cd0 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c  on an ARM7 shoul
16ce0 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75  d compile and ru
16cf0 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69  n their.** appli
16d00 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53  cation using -DS
16d10 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74  QLITE_DEBUG=1 at
16d20 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69   least once.  Wi
16d30 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62  th DEBUG.** enab
16d40 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74  led, some assert
16d50 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73  s below will ens
16d60 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74  ure that the byt
16d70 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c  e order of.** fl
16d80 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
16d90 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ues is correct..
16da0 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33  **.** (2007-08-3
16db0 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75  0)  Frank van Vu
16dc0 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74  gt has studied t
16dd0 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73  his problem clos
16de0 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73  ely.** and has s
16df0 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73  end his findings
16e00 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64   to the SQLite d
16e10 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e  evelopers.  Fran
16e20 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74  k.** writes that
16e30 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e   some Linux kern
16e40 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69  els offer floati
16e50 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72  ng point hardwar
16e60 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74  e.** emulation t
16e70 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32  hat uses only 32
16e80 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69  -bit mantissas i
16e90 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c  nstead of a full
16ea0 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20   .** 48-bits as 
16eb0 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
16ec0 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20  IEEE standard.  
16ed0 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20  (This is the.** 
16ee0 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46  CONFIG_FPE_FASTF
16ef0 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20  PE option.)  On 
16f00 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c  such systems, fl
16f10 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
16f20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65  byte swapping be
16f30 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c  comes very compl
16f40 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69  icated.  To avoi
16f50 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74  d problems,.** t
16f60 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74  he necessary byt
16f70 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61  e swapping is ca
16f80 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20  rried out using 
16f90 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
16fa0 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
16fb0 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20  a 64-bit float. 
16fc0 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75   Frank assures u
16fd0 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  s that the code 
16fe0 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f  here.** works fo
16ff0 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20  r him.  We, the 
17000 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65  developers, have
17010 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70   no way to indep
17020 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69  endently.** veri
17030 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61  fy this, but Fra
17040 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77  nk seems to know
17050 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b   what he is talk
17060 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20  ing about.** so 
17070 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f  we trust him..*/
17080 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
17090 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
170a0 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75  T_FLOAT.static u
170b0 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34  64 floatSwap(u64
170c0 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a   in){.  union {.
170d0 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75      u64 r;.    u
170e0 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a  32 i[2];.  } u;.
170f0 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20    u32 t;..  u.r 
17100 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b  = in;.  t = u.i[
17110 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75  0];.  u.i[0] = u
17120 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20  .i[1];.  u.i[1] 
17130 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e  = t;.  return u.
17140 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77  r;.}.# define sw
17150 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
17160 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74  at(X)  X = float
17170 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20  Swap(X).#else.# 
17180 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
17190 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23  EndianFloat(X).#
171a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
171b0 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  te the serialize
171c0 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20  d data blob for 
171d0 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
171e0 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a   in pMem into .*
171f0 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73  * buf. It is ass
17200 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
17210 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74  ller has allocat
17220 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ed sufficient sp
17230 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ace..** Return t
17240 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
17250 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a  es written..**.*
17260 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d  * nBuf is the am
17270 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65  ount of space le
17280 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68  ft in buf[].  Th
17290 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
172a0 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61  onsible.** for a
172b0 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67 68  llocating enough
172c0 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d 20   space to buf[] 
172d0 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
172e0 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75 73  re field, exclus
172f0 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d  ive.** of the pM
17300 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65  em->u.nZero byte
17310 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f  s for a MEM_Zero
17320 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   value..**.** Re
17330 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
17340 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
17350 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62  y written into b
17360 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65  uf[].  The numbe
17370 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e  r.** of bytes in
17380 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
17390 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65   tail is include
173a0 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20  d in the return 
173b0 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66  value only.** if
173c0 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72   those bytes wer
173d0 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b  e zeroed in buf[
173e0 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74  ]..*/ .u32 sqlit
173f0 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
17400 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d  u8 *buf, Mem *pM
17410 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f 74  em, u32 serial_t
17420 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b  ype){.  u32 len;
17430 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61  ..  /* Integer a
17440 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28  nd Real */.  if(
17450 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20   serial_type<=7 
17460 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30  && serial_type>0
17470 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20   ){.    u64 v;. 
17480 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66     u32 i;.    if
17490 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37  ( serial_type==7
174a0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
174b0 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a  ( sizeof(v)==siz
174c0 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29  eof(pMem->u.r) )
174d0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
174e0 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73  v, &pMem->u.r, s
174f0 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20  izeof(v));.     
17500 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
17510 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65  Float(v);.    }e
17520 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  lse{.      v = p
17530 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a  Mem->u.i;.    }.
17540 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71      len = i = sq
17550 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
17560 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
17570 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  ;.    assert( i>
17580 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  0 );.    do{.   
17590 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75     buf[--i] = (u
175a0 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20  8)(v&0xFF);.    
175b0 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d    v >>= 8;.    }
175c0 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20 20 20  while( i );.    
175d0 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
175e0 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20  .  /* String or 
175f0 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65  blob */.  if( se
17600 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
17610 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
17620 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66  m->n + ((pMem->f
17630 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
17640 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30  ?pMem->u.nZero:0
17650 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ).             =
17660 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64  = (int)sqlite3Vd
17670 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
17680 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a  serial_type) );.
17690 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e      len = pMem->
176a0 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75  n;.    memcpy(bu
176b0 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29  f, pMem->z, len)
176c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  ;.    return len
176d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c  ;.  }..  /* NULL
176e0 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20   or constants 0 
176f0 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e  or 1 */.  return
17700 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20   0;.}../* Input 
17710 22 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63  "x" is a sequenc
17720 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68  e of unsigned ch
17730 61 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65  aracters that re
17740 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67  present a.** big
17750 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e  -endian integer.
17760 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75    Return the equ
17770 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69  ivalent native i
17780 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e  nteger.*/.#defin
17790 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78  e ONE_BYTE_INT(x
177a0 29 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d  )    ((i8)(x)[0]
177b0 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59  ).#define TWO_BY
177c0 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35  TE_INT(x)    (25
177d0 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
177e0 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54  x)[1]).#define T
177f0 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29  HREE_BYTE_INT(x)
17800 20 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78    (65536*(i8)((x
17810 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38  )[0])|((x)[1]<<8
17820 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e  )|(x)[2]).#defin
17830 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  e FOUR_BYTE_UINT
17840 28 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b  (x)  (((u32)(x)[
17850 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c  0]<<24)|((x)[1]<
17860 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29  <16)|((x)[2]<<8)
17870 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65  |(x)[3]).#define
17880 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78   FOUR_BYTE_INT(x
17890 29 20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29  ) (16777216*(i8)
178a0 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d  ((x)[0])|((x)[1]
178b0 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38  <<16)|((x)[2]<<8
178c0 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a  )|(x)[3])../*.**
178d0 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   Deserialize the
178e0 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74   data blob point
178f0 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20  ed to by buf as 
17900 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69  serial type seri
17910 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73  al_type.** and s
17920 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
17930 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e  in pMem.  Return
17940 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
17950 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ytes read..**.**
17960 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
17970 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
17980 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f   two separate ro
17990 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f  utines for perfo
179a0 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66  rmance..** The f
179b0 65 77 20 63 61 73 65 73 20 74 68 61 74 20 72 65  ew cases that re
179c0 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69  quire local vari
179d0 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e  ables are broken
179e0 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61   out into a sepa
179f0 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  rate.** routine 
17a00 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20  so that in most 
17a10 63 61 73 65 73 20 74 68 65 20 6f 76 65 72 68 65  cases the overhe
17a20 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65  ad of moving the
17a30 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a   stack pointer.*
17a40 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f  * is avoided..*/
17a50 20 0a 73 74 61 74 69 63 20 75 33 32 20 53 51 4c   .static u32 SQL
17a60 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72  ITE_NOINLINE ser
17a70 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20  ialGet(.  const 
17a80 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
17a90 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65  uf,     /* Buffe
17aa0 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  r to deserialize
17ab0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73   from */.  u32 s
17ac0 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20  erial_type,     
17ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69           /* Seri
17ae0 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72  al type to deser
17af0 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20  ialize */.  Mem 
17b00 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20  *pMem           
17b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
17b20 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74  ory cell to writ
17b30 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a  e value into */.
17b40 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55  ){.  u64 x = FOU
17b50 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29  R_BYTE_UINT(buf)
17b60 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52  ;.  u32 y = FOUR
17b70 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34  _BYTE_UINT(buf+4
17b80 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29  );.  x = (x<<32)
17b90 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69   + y;.  if( seri
17ba0 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20  al_type==6 ){.  
17bb0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
17bc0 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20  : R-29851-52272 
17bd0 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
17be0 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20  ndian 64-bit.   
17bf0 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
17c00 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
17c10 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
17c20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70  *(i64*)&x;.    p
17c30 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
17c40 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61  _Int;.    testca
17c50 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
17c60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17c70 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
17c80 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56 61  R-57343-49114 Va
17c90 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
17ca0 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30  ian IEEE 754-200
17cb0 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20  8 64-bit.    ** 
17cc0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e  floating point n
17cd0 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64  umber. */.#if !d
17ce0 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
17cf0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
17d00 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
17d10 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65  POINT).    /* Ve
17d20 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65  rify that intege
17d30 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20  rs and floating 
17d40 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65  point values use
17d50 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a   the same.    **
17d60 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72   byte order.  Or
17d70 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45  , that if SQLITE
17d80 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
17d90 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20  BIT_FLOAT is.   
17da0 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74   ** defined that
17db0 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
17dc0 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65   point values re
17dd0 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20  ally are mixed. 
17de0 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
17df0 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20    */.    static 
17e00 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28  const u64 t1 = (
17e10 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29  (u64)0x3ff00000)
17e20 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63  <<32;.    static
17e30 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31   const double r1
17e40 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20   = 1.0;.    u64 
17e50 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61  t2 = t1;.    swa
17e60 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
17e70 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72  t(t2);.    asser
17e80 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73  t( sizeof(r1)==s
17e90 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d  izeof(t2) && mem
17ea0 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69  cmp(&r1, &t2, si
17eb0 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a  zeof(r1))==0 );.
17ec0 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
17ed0 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
17ee0 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  && sizeof(pMem->
17ef0 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73  u.r)==8 );.    s
17f00 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
17f10 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63  oat(x);.    memc
17f20 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26  py(&pMem->u.r, &
17f30 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
17f40 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
17f50 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d   sqlite3IsNaN(pM
17f60 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e  em->u.r) ? MEM_N
17f70 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ull : MEM_Real;.
17f80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a    }.  return 8;.
17f90 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  }.u32 sqlite3Vdb
17fa0 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
17fb0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
17fc0 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
17fd0 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
17fe0 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
17ff0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
18000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18010 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
18020 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
18030 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18050 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
18060 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
18070 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28   */.){.  switch(
18080 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
18090 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f      case 10:   /
180a0 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
180b0 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
180c0 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52   case 11:   /* R
180d0 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
180e0 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
180f0 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c  se 0: {  /* Null
18100 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
18110 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37  DENCE-OF: R-2407
18120 38 2d 30 39 33 37 35 20 56 61 6c 75 65 20 69 73  8-09375 Value is
18130 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20   a NULL. */.    
18140 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
18150 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
18160 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
18170 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20 20   case 1: {.     
18180 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
18190 20 52 2d 34 34 38 38 35 2d 32 35 31 39 36 20 56   R-44885-25196 V
181a0 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 62 69 74  alue is an 8-bit
181b0 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
181c0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  .      ** intege
181d0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
181e0 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45  ->u.i = ONE_BYTE
181f0 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
18200 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
18210 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
18220 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
18230 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
18240 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
18250 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
18260 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
18270 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ger */.      /* 
18280 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
18290 39 37 39 34 2d 33 35 30 32 36 20 56 61 6c 75 65  9794-35026 Value
182a0 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
182b0 20 31 36 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   16-bit.      **
182c0 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
182d0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
182e0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54     pMem->u.i = T
182f0 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  WO_BYTE_INT(buf)
18300 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
18310 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
18320 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
18330 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
18340 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
18350 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20    }.    case 3: 
18360 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e  { /* 3-byte sign
18370 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
18380 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
18390 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 34 33 30  OF: R-37839-5430
183a0 31 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  1 Value is a big
183b0 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a 20  -endian 24-bit. 
183c0 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
183d0 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
183e0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
183f0 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45  u.i = THREE_BYTE
18400 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
18410 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
18420 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
18430 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
18440 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
18450 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 3;.    }.   
18460 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
18470 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
18480 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ger */.      /* 
18490 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
184a0 31 38 34 39 2d 32 36 30 37 39 20 56 61 6c 75 65  1849-26079 Value
184b0 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
184c0 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   32-bit.      **
184d0 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
184e0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
184f0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46     pMem->u.i = F
18500 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  OUR_BYTE_INT(buf
18510 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
18520 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
18530 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
18540 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
18550 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
18560 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
18570 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
18580 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
18590 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
185a0 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36  -OF: R-50385-096
185b0 37 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  74 Value is a bi
185c0 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a  g-endian 48-bit.
185d0 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
185e0 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
185f0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
18600 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45  >u.i = FOUR_BYTE
18610 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28  _UINT(buf+2) + (
18620 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
18630 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  O_BYTE_INT(buf);
18640 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
18650 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
18660 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
18670 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
18680 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20     return 6;.   
18690 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20   }.    case 6:  
186a0 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
186b0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
186c0 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45   case 7: { /* IE
186d0 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  EE floating poin
186e0 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68  t */.      /* Th
186f0 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61  ese use local va
18700 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74  riables, so do t
18710 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74  hem in a separat
18720 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  e routine.      
18730 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69  ** to avoid havi
18740 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66  ng to move the f
18750 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20  rame pointer in 
18760 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
18770 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
18780 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65  serialGet(buf,se
18790 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b  rial_type,pMem);
187a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
187b0 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72  8:    /* Integer
187c0 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39   0 */.    case 9
187d0 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  : {  /* Integer 
187e0 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  1 */.      /* EV
187f0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39  IDENCE-OF: R-129
18800 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69  76-22893 Value i
18810 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e  s the integer 0.
18820 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
18830 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34  DENCE-OF: R-1814
18840 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69 73  3-12121 Value is
18850 20 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20   the integer 1. 
18860 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
18870 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
18880 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
18890 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
188a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
188b0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
188c0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  lt: {.      /* E
188d0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34  VIDENCE-OF: R-14
188e0 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20  606-31564 Value 
188f0 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69  is a BLOB that i
18900 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73  s (N-12)/2 bytes
18910 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e   in.      ** len
18920 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56  gth..      ** EV
18930 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34  IDENCE-OF: R-284
18940 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69  01-00140 Value i
18950 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68  s a string in th
18960 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  e text encoding 
18970 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d  and.      ** (N-
18980 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c  13)/2 bytes in l
18990 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20  ength. */.      
189a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
189b0 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d   aFlag[] = { MEM
189c0 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c  _Blob|MEM_Ephem,
189d0 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68   MEM_Str|MEM_Eph
189e0 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  em };.      pMem
189f0 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75  ->z = (char *)bu
18a00 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  f;.      pMem->n
18a10 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
18a20 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65  12)/2;.      pMe
18a30 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67  m->flags = aFlag
18a40 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b  [serial_type&1];
18a50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d  .      return pM
18a60 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  em->n;.    }.  }
18a70 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f  .  return 0;.}./
18a80 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18a90 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  e is used to all
18aa0 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74  ocate sufficient
18ab0 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e   space for an Un
18ac0 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20  packedRecord.** 
18ad0 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20  structure large 
18ae0 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65  enough to be use
18af0 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64  d with sqlite3Vd
18b00 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29  beRecordUnpack()
18b10 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   if.** the first
18b20 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
18b30 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66  ointer to KeyInf
18b40 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79  o structure pKey
18b50 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Info..**.** The 
18b60 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20  space is either 
18b70 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20  allocated using 
18b80 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
18b90 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74  aw() or from wit
18ba0 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69  hin.** the unali
18bb0 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73  gned buffer pass
18bc0 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e  ed via the secon
18bd0 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75  d and third argu
18be0 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c  ments (presumabl
18bf0 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65  y.** stack space
18c00 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72  ). If the former
18c10 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69  , then *ppFree i
18c20 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74  s set to a point
18c30 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  er that should.*
18c40 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  * be eventually 
18c50 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
18c60 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ler using sqlite
18c70 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69  3DbFree(). Or, i
18c80 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  f the .** alloca
18c90 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20  tion comes from 
18ca0 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61  the pSpace/szSpa
18cb0 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72  ce buffer, *ppFr
18cc0 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ee is set to NUL
18cd0 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75  L.** before retu
18ce0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
18cf0 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63  an OOM error occ
18d00 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
18d10 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b  urned..*/.Unpack
18d20 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65  edRecord *sqlite
18d30 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
18d40 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49  edRecord(.  KeyI
18d50 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
18d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
18d70 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
18d80 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68  e record */.  ch
18d90 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20  ar *pSpace,     
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18db0 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65   Unaligned space
18dc0 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
18dd0 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 20 20  int szSpace,    
18de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18df0 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63  /* Size of pSpac
18e00 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  e[] in bytes */.
18e10 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65 65 20    char **ppFree 
18e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e30 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72    /* OUT: Caller
18e40 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68 69   should free thi
18e50 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a  s pointer */.){.
18e60 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
18e70 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
18e80 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65    /* Unpacked re
18e90 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a  cord to return *
18ea0 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20  /.  int nOff;   
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ec0 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
18ed0 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66 66 20   pSpace by nOff 
18ee0 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20  to align it */. 
18ef0 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
18f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
18f20 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72  tes required for
18f30 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20   *p */..  /* We 
18f40 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68  want to shift th
18f50 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65  e pointer pSpace
18f60 20 75 70 20 73 75 63 68 20 74 68 61 74 20 69 74   up such that it
18f70 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   is 8-byte align
18f80 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77  ed..  ** Thus, w
18f90 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c  e need to calcul
18fa0 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66  ate a value, nOf
18fb0 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  f, between 0 and
18fc0 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20   7, to shift .  
18fd0 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70 53  ** it by.  If pS
18fe0 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 79 20  pace is already 
18ff0 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20  8-byte aligned, 
19000 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a  nOff should be z
19010 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66  ero..  */.  nOff
19020 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f   = (8 - (SQLITE_
19030 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63  PTR_TO_INT(pSpac
19040 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20  e) & 7)) & 7;.  
19050 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73  nByte = ROUND8(s
19060 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
19070 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28  cord)) + sizeof(
19080 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e  Mem)*(pKeyInfo->
19090 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28  nField+1);.  if(
190a0 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e   nByte>szSpace+n
190b0 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d 20 28  Off ){.    p = (
190c0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
190d0 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
190e0 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  Raw(pKeyInfo->db
190f0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a 70  , nByte);.    *p
19100 70 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29  pFree = (char *)
19110 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 20  p;.    if( !p ) 
19120 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
19130 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61  e{.    p = (Unpa
19140 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 53 70  ckedRecord*)&pSp
19150 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a  ace[nOff];.    *
19160 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppFree = 0;.  }.
19170 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65  .  p->aMem = (Me
19180 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52  m*)&((char*)p)[R
19190 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70  OUND8(sizeof(Unp
191a0 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a  ackedRecord))];.
191b0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
191c0 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
191d0 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e  0 );.  p->pKeyIn
191e0 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
191f0 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65   p->nField = pKe
19200 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
19210 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  1;.  return p;.}
19220 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
19230 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
19240 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
19250 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75   in pKey[], popu
19260 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70  late the .** Unp
19270 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
19280 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20  cture indicated 
19290 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72  by the fourth ar
192a0 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a  gument with the.
192b0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
192c0 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72  he decoded recor
192d0 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  d..*/ .void sqli
192e0 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
192f0 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ack(.  KeyInfo *
19300 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a  pKeyInfo,     /*
19310 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
19320 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  ut the record fo
19330 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rmat */.  int nK
19340 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
19350 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
19360 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
19370 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
19380 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
19390 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
193a0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
193b0 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f  rd *p      /* Po
193c0 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75  pulate this stru
193d0 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74  cture before ret
193e0 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20  urning. */.){.  
193f0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
19400 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
19410 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
19420 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64   *)pKey;.  int d
19430 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20  ; .  u32 idx;   
19440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19450 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
19460 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64  n aKey[] to read
19470 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75   from */.  u16 u
19480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
194a0 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
194b0 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ter */.  u32 szH
194c0 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  dr;.  Mem *pMem 
194d0 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d  = p->aMem;..  p-
194e0 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b  >default_rc = 0;
194f0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
19500 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
19510 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d  pMem) );.  idx =
19520 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
19530 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d  y, szHdr);.  d =
19540 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b   szHdr;.  u = 0;
19550 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
19560 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29  Hdr && d<=nKey )
19570 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
19580 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20  _type;..    idx 
19590 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
195a0 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61  aKey[idx], seria
195b0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65  l_type);.    pMe
195c0 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m->enc = pKeyInf
195d0 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d  o->enc;.    pMem
195e0 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ->db = pKeyInfo-
195f0 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d  >db;.    /* pMem
19600 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20  ->flags = 0; // 
19610 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
19620 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20  lGet() will set 
19630 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20  this for us */. 
19640 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f     pMem->szMallo
19650 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20  c = 0;.    d += 
19660 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
19670 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73  lGet(&aKey[d], s
19680 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d  erial_type, pMem
19690 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  );.    pMem++;. 
196a0 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d     if( (++u)>=p-
196b0 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b  >nField ) break;
196c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75  .  }.  assert( u
196d0 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  <=pKeyInfo->nFie
196e0 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e  ld + 1 );.  p->n
196f0 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69  Field = u;.}..#i
19700 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
19710 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19720 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20  on compares two 
19730 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72  index or table r
19740 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68  ecord keys in th
19750 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73  e same way.** as
19760 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
19770 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
19780 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20  routine. Unlike 
19790 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
197a0 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  e(),.** this fun
197b0 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a  ction deserializ
197c0 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20  es and compares 
197d0 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65  values using the
197e0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
197f0 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73  erialGet() and s
19800 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
19810 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74  () functions. It
19820 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61   is used.** in a
19830 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
19840 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
19850 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20  t the optimized 
19860 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  code in.** sqlit
19870 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
19880 61 72 65 28 29 20 72 65 74 75 72 6e 73 20 72 65  are() returns re
19890 73 75 6c 74 73 20 77 69 74 68 20 74 68 65 73 65  sults with these
198a0 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e   two primitives.
198b0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
198c0 75 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  ue if the result
198d0 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   of comparison i
198e0 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
198f0 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a  desiredResult..*
19900 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69  * Return false i
19910 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69 73  f there is a dis
19920 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  agreement..*/.st
19930 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
19940 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
19950 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
19960 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
19970 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
19980 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64    const Unpacked
19990 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
199a0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
199b0 20 20 69 6e 74 20 64 65 73 69 72 65 64 52 65 73    int desiredRes
199c0 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
199d0 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65  /* Correct answe
199e0 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31  r */.){.  u32 d1
199f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19a00 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
19a10 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
19a20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
19a30 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
19a40 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
19a50 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
19a60 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
19a70 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
19a80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19a90 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
19aa0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
19ab0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
19ac0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
19ad0 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
19ae0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
19af0 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b  har *)pKey1;.  K
19b00 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
19b10 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
19b20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65   pKeyInfo = pPKe
19b30 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
19b40 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  if( pKeyInfo->db
19b50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
19b60 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
19b70 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
19b80 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
19b90 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e  ->db;.  /* mem1.
19ba0 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57  flags = 0;  // W
19bb0 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ill be initializ
19bc0 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62  ed by sqlite3Vdb
19bd0 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a  eSerialGet() */.
19be0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
19bf0 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  .szMalloc = 0; )
19c00 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
19c10 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
19c20 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20  ements */..  /* 
19c30 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f  Compilers may co
19c40 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31  mplain that mem1
19c50 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61  .u.i is potentia
19c60 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  lly uninitialize
19c70 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64  d..  ** We could
19c80 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20   initialize it, 
19c90 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74  as shown here, t
19ca0 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20  o silence those 
19cb0 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a  complaints..  **
19cc0 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65   But in fact, me
19cd0 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65  m1.u.i will neve
19ce0 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73  r actually be us
19cf0 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ed uninitialized
19d00 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a  , and doing .  *
19d10 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72  * the unnecessar
19d20 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  y initialization
19d30 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c   has a measurabl
19d40 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f  e negative perfo
19d50 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61  rmance.  ** impa
19d60 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72  ct, since this r
19d70 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79  outine is a very
19d80 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41   high runner.  A
19d90 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65  nd so, we choose
19da0 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20  .  ** to ignore 
19db0 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  the compiler war
19dc0 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20  nings and leave 
19dd0 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e  this variable un
19de0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
19df0 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69  /.  /*  mem1.u.i
19e00 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65   = 0;  // not ne
19e10 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69  eded, here to si
19e20 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77  lence compiler w
19e30 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69  arning */.  .  i
19e40 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
19e50 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
19e60 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31 3e 39  ;.  if( szHdr1>9
19e70 38 33 30 37 20 29 20 72 65 74 75 72 6e 20 53 51  8307 ) return SQ
19e80 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
19e90 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61  d1 = szHdr1;.  a
19ea0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
19eb0 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f  >nField+pKeyInfo
19ec0 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79  ->nXField>=pPKey
19ed0 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52  2->nField || COR
19ee0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
19ef0 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
19f00 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
19f10 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
19f20 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  fo->nField>0 );.
19f30 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
19f40 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
19f50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
19f60 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
19f70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e1;..    /* Read
19f80 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
19f90 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
19fa0 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
19fb0 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
19fc0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20  += getVarint32( 
19fd0 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
19fe0 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20  al_type1 );..   
19ff0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1a000 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
1a010 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e  key space remain
1a020 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20  ing to avoid.   
1a030 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65   ** a buffer ove
1a040 72 72 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b  rread.  The "d1+
1a050 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20  serial_type1+2" 
1a060 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69  subexpression wi
1a070 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  ll.    ** always
1a080 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
1a090 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1a0a0 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69   amount of requi
1a0b0 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20  red key space.. 
1a0c0 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61     ** Use that a
1a0d0 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20  pproximation to 
1a0e0 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65  avoid the more e
1a0f0 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f  xpensive call to
1a100 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56  .    ** sqlite3V
1a110 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1a120 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  () in the common
1a130 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
1a140 20 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f    if( d1+serial_
1a150 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65  type1+2>(u32)nKe
1a160 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71  y1.     && d1+sq
1a170 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1a180 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
1a190 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20  pe1)>(u32)nKey1 
1a1a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72  .    ){.      br
1a1b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1a1c0 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
1a1d0 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70  alues to be comp
1a1e0 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
1a1f0 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
1a200 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1a210 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
1a220 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20  ype1, &mem1);.. 
1a230 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
1a240 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20  parison.    */. 
1a250 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
1a260 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c  emCompare(&mem1,
1a270 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69   &pPKey2->aMem[i
1a280 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ], pKeyInfo->aCo
1a290 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ll[i]);.    if( 
1a2a0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  rc!=0 ){.      a
1a2b0 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1a2c0 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
1a2d0 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
1a2e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b   */.      if( pK
1a2f0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1a300 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[i] ){.       
1a310 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49   rc = -rc;  /* I
1a320 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74  nvert the result
1a330 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f   for DESC sort o
1a340 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  rder. */.      }
1a350 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75  .      goto debu
1a360 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20  gCompareEnd;.   
1a370 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77   }.    i++;.  }w
1a380 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72  hile( idx1<szHdr
1a390 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
1a3a0 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e  Field );..  /* N
1a3b0 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
1a3c0 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
1a3d0 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
1a3e0 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
1a3f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1a400 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
1a410 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
1a420 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
1a430 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
1a440 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
1a450 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
1a460 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
1a470 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1a480 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1a490 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30  0 );..  /* rc==0
1a4a0 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
1a4b0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   one of the keys
1a4c0 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
1a4d0 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
1a4e0 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
1a4f0 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
1a500 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74   equal. Return t
1a510 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20  he default_rc.  
1a520 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  ** value.  */.  
1a530 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  rc = pPKey2->def
1a540 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43  ault_rc;..debugC
1a550 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28  ompareEnd:.  if(
1a560 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d   desiredResult==
1a570 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74  0 && rc==0 ) ret
1a580 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73  urn 1;.  if( des
1a590 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20  iredResult<0 && 
1a5a0 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  rc<0 ) return 1;
1a5b0 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1a5c0 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29  sult>0 && rc>0 )
1a5d0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1a5e0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
1a5f0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b  turn 1;.  if( pK
1a600 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
1a610 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1a620 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
1a630 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  .}.#endif..#if S
1a640 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1a650 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
1a660 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e  er of fields (a.
1a670 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e  k.a. columns) in
1a680 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65   the record give
1a690 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65  n by.** pKey,nKe
1a6a0 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74  y.  The verify t
1a6b0 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69  hat this count i
1a6c0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
1a6d0 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c  qual to the.** l
1a6e0 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b  imit given by pK
1a6f0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
1a700 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65   pKeyInfo->nXFie
1a710 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ld..**.** If thi
1a720 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  s constraint is 
1a730 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20 69  not satisfied, i
1a740 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1a750 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
1a760 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1a770 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52 65  Int() and vdbeRe
1a780 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1a790 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  g() routines wil
1a7a0 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  l.** not work co
1a7b0 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69  rrectly.  If thi
1a7c0 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72 20  s assert() ever 
1a7d0 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62  fires, it probab
1a7e0 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  ly means.** that
1a7f0 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69   the KeyInfo.nFi
1a800 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e  eld or KeyInfo.n
1a810 58 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65  XField values we
1a820 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69  re computed.** i
1a830 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73  ncorrectly..*/.s
1a840 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 41  tatic void vdbeA
1a850 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
1a860 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69  ithinLimits(.  i
1a870 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76  nt nKey, const v
1a880 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
1a890 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65  The record to ve
1a8a0 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74  rify */ .  const
1a8b0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1a8c0 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  fo       /* Comp
1a8d0 61 72 65 20 73 69 7a 65 20 77 69 74 68 20 74 68  are size with th
1a8e0 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b  is KeyInfo */.){
1a8f0 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20  .  int nField = 
1a900 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  0;.  u32 szHdr;.
1a910 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32    u32 idx;.  u32
1a920 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73   notUsed;.  cons
1a930 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1a940 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
1a950 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b  nsigned char*)pK
1a960 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55  ey;..  if( CORRU
1a970 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  PT_DB ) return;.
1a980 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
1a990 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
1a9a0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  ;.  assert( nKey
1a9b0 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1a9c0 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65   szHdr<=(u32)nKe
1a9d0 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  y );.  while( id
1a9e0 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69  x<szHdr ){.    i
1a9f0 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
1aa00 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55  2(aKey+idx, notU
1aa10 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64  sed);.    nField
1aa20 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ++;.  }.  assert
1aa30 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79  ( nField <= pKey
1aa40 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65  Info->nField+pKe
1aa50 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29  yInfo->nXField )
1aa60 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1aa70 6e 65 20 76 64 62 65 41 73 73 65 72 74 46 69 65  ne vdbeAssertFie
1aa80 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
1aa90 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69  its(A,B,C).#endi
1aaa0 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70  f../*.** Both *p
1aab0 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20  Mem1 and *pMem2 
1aac0 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76  contain string v
1aad0 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74  alues. Compare t
1aae0 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a  he two values.**
1aaf0 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
1ab00 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
1ab10 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72  oll. As usual, r
1ab20 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
1ab30 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f   , zero.** or po
1ab40 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
1ab50 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74  *pMem1 is less t
1ab60 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
1ab70 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a   greater than .*
1ab80 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63  * *pMem2, respec
1ab90 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20  tively. Similar 
1aba0 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63  in spirit to "rc
1abb0 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a   = (*pMem1) - (*
1abc0 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61  pMem2);"..*/.sta
1abd0 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70  tic int vdbeComp
1abe0 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20  areMemString(.  
1abf0 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31  const Mem *pMem1
1ac00 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  ,.  const Mem *p
1ac10 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f  Mem2,.  const Co
1ac20 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20  llSeq *pColl,.  
1ac30 75 38 20 2a 70 72 63 45 72 72 20 20 20 20 20 20  u8 *prcErr      
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac50 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63  /* If an OOM occ
1ac60 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49  urs, set to SQLI
1ac70 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20  TE_NOMEM */.){. 
1ac80 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d   if( pMem1->enc=
1ac90 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20  =pColl->enc ){. 
1aca0 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67     /* The string
1acb0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  s are already in
1acc0 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63   the correct enc
1acd0 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65  oding.  Call the
1ace0 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69  .     ** compari
1acf0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72  son function dir
1ad00 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74  ectly */.    ret
1ad10 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28  urn pColl->xCmp(
1ad20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65  pColl->pUser,pMe
1ad30 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70  m1->n,pMem1->z,p
1ad40 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a  Mem2->n,pMem2->z
1ad50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1ad60 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73  int rc;.    cons
1ad70 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b  t void *v1, *v2;
1ad80 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b  .    int n1, n2;
1ad90 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20  .    Mem c1;.   
1ada0 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c   Mem c2;.    sql
1adb0 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1adc0 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20  &c1, pMem1->db, 
1add0 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  MEM_Null);.    s
1ade0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
1adf0 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62  t(&c2, pMem1->db
1ae00 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
1ae10 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1ae20 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20  hallowCopy(&c1, 
1ae30 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem1, MEM_Ephem
1ae40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1ae50 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
1ae60 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d  (&c2, pMem2, MEM
1ae70 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20  _Ephem);.    v1 
1ae80 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
1ae90 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
1aea0 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c1, pColl->e
1aeb0 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31  nc);.    n1 = v1
1aec0 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a  ==0 ? 0 : c1.n;.
1aed0 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33      v2 = sqlite3
1aee0 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
1aef0 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70  e3_value*)&c2, p
1af00 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
1af10 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a  n2 = v2==0 ? 0 :
1af20 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20   c2.n;.    rc = 
1af30 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
1af40 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31  l->pUser, n1, v1
1af50 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 73  , n2, v2);.    s
1af60 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1af70 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73  ease(&c1);.    s
1af80 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1af90 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 69  ease(&c2);.    i
1afa0 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d  f( (v1==0 || v2=
1afb0 3d 30 29 20 26 26 20 70 72 63 45 72 72 20 29 20  =0) && prcErr ) 
1afc0 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45  *prcErr = SQLITE
1afd0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75  _NOMEM;.    retu
1afe0 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  rn rc;.  }.}../*
1aff0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
1b000 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e  blobs.  Return n
1b010 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
1b020 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68  r positive if th
1b030 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65  e first.** is le
1b040 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1b050 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
1b060 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72  an the second, r
1b070 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
1b080 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61  If one blob is a
1b090 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f   prefix of the o
1b0a0 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73  ther, then the s
1b0b0 68 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65  horter is the le
1b0c0 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssor..*/.static 
1b0d0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
1b0e0 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43  int sqlite3BlobC
1b0f0 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d  ompare(const Mem
1b100 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d   *pB1, const Mem
1b110 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 20   *pB2){.  int c 
1b120 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c  = memcmp(pB1->z,
1b130 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 3e   pB2->z, pB1->n>
1b140 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e 20  pB2->n ? pB2->n 
1b150 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69 66 28  : pB1->n);.  if(
1b160 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20   c ) return c;. 
1b170 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e 20 2d   return pB1->n -
1b180 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a   pB2->n;.}.../*.
1b190 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76  ** Compare the v
1b1a0 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  alues contained 
1b1b0 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72  by the two memor
1b1c0 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69  y cells, returni
1b1d0 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20  ng.** negative, 
1b1e0 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65  zero or positive
1b1f0 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73   if pMem1 is les
1b200 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1b210 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20  , or greater.** 
1b220 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74  than pMem2. Sort
1b230 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c  ing order is NUL
1b240 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f  L's first, follo
1b250 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28  wed by numbers (
1b260 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20  integers.** and 
1b270 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75  reals) sorted nu
1b280 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f  merically, follo
1b290 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65  wed by text orde
1b2a0 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61  red by the colla
1b2b0 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
1b2c0 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c   pColl and final
1b2d0 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65  ly blob's ordere
1b2e0 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a  d by memcmp()..*
1b2f0 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61  *.** Two NULL va
1b300 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
1b310 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69  red equal by thi
1b320 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  s function..*/.i
1b330 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  nt sqlite3MemCom
1b340 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
1b350 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d  pMem1, const Mem
1b360 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43   *pMem2, const C
1b370 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
1b380 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20    int f1, f2;.  
1b390 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  int combined_fla
1b3a0 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d  gs;..  f1 = pMem
1b3b0 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d  1->flags;.  f2 =
1b3c0 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20   pMem2->flags;. 
1b3d0 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20   combined_flags 
1b3e0 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72  = f1|f2;.  asser
1b3f0 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  t( (combined_fla
1b400 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
1b410 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66  ==0 );. .  /* If
1b420 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55   one value is NU
1b430 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74  LL, it is less t
1b440 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49  han the other. I
1b450 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20  f both values.  
1b460 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74  ** are NULL, ret
1b470 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  urn 0..  */.  if
1b480 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1b490 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
1b4a0 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f   return (f2&MEM_
1b4b0 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f  Null) - (f1&MEM_
1b4c0 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Null);.  }..  /*
1b4d0 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
1b4e0 20 61 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68   a number and th
1b4f0 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2c 20  e other is not, 
1b500 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  the number is le
1b510 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68  ss..  ** If both
1b520 20 61 72 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f   are numbers, co
1b530 6d 70 61 72 65 20 61 73 20 72 65 61 6c 73 20 69  mpare as reals i
1b540 66 20 6f 6e 65 20 69 73 20 61 20 72 65 61 6c 2c  f one is a real,
1b550 20 6f 72 20 61 73 20 69 6e 74 65 67 65 72 73 0a   or as integers.
1b560 20 20 2a 2a 20 69 66 20 62 6f 74 68 20 76 61 6c    ** if both val
1b570 75 65 73 20 61 72 65 20 69 6e 74 65 67 65 72 73  ues are integers
1b580 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
1b590 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d  bined_flags&(MEM
1b5a0 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29  _Int|MEM_Real) )
1b5b0 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 31 2c  {.    double r1,
1b5c0 20 72 32 3b 0a 20 20 20 20 69 66 28 20 28 66 31   r2;.    if( (f1
1b5d0 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29   & f2 & MEM_Int)
1b5e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1b5f0 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d   pMem1->u.i < pM
1b600 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72  em2->u.i ) retur
1b610 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20  n -1;.      if( 
1b620 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65  pMem1->u.i > pMe
1b630 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e  m2->u.i ) return
1b640 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
1b650 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1b660 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f1&MEM_Real)!
1b670 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d  =0 ){.      r1 =
1b680 20 70 4d 65 6d 31 2d 3e 75 2e 72 3b 0a 20 20 20   pMem1->u.r;.   
1b690 20 7d 65 6c 73 65 20 69 66 28 20 28 66 31 26 4d   }else if( (f1&M
1b6a0 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1b6b0 20 20 20 20 72 31 20 3d 20 28 64 6f 75 62 6c 65      r1 = (double
1b6c0 29 70 4d 65 6d 31 2d 3e 75 2e 69 3b 0a 20 20 20  )pMem1->u.i;.   
1b6d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1b6e0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1b6f0 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65    if( (f2&MEM_Re
1b700 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1b710 72 32 20 3d 20 70 4d 65 6d 32 2d 3e 75 2e 72 3b  r2 = pMem2->u.r;
1b720 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1b730 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29  f2&MEM_Int)!=0 )
1b740 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 28 64 6f  {.      r2 = (do
1b750 75 62 6c 65 29 70 4d 65 6d 32 2d 3e 75 2e 69 3b  uble)pMem2->u.i;
1b760 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b770 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1b780 20 7d 0a 20 20 20 20 69 66 28 20 72 31 3c 72 32   }.    if( r1<r2
1b790 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1b7a0 20 20 69 66 28 20 72 31 3e 72 32 20 29 20 72 65    if( r1>r2 ) re
1b7b0 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75  turn 1;.    retu
1b7c0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
1b7d0 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
1b7e0 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65  a string and the
1b7f0 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62   other is a blob
1b800 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  , the string is 
1b810 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f  less..  ** If bo
1b820 74 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20  th are strings, 
1b830 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68  compare using th
1b840 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  e collating func
1b850 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
1b860 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1b870 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20  &MEM_Str ){.    
1b880 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74  if( (f1 & MEM_St
1b890 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  r)==0 ){.      r
1b8a0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1b8b0 20 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d     if( (f2 & MEM
1b8c0 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
1b8d0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1b8e0 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
1b8f0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d  pMem1->enc==pMem
1b900 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20 61 73  2->enc );.    as
1b910 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63  sert( pMem1->enc
1b920 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  ==SQLITE_UTF8 ||
1b930 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d   .            pM
1b940 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1b950 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d  _UTF16LE || pMem
1b960 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1b970 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f  TF16BE );..    /
1b980 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  * The collation 
1b990 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65  sequence must be
1b9a0 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73   defined at this
1b9b0 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a   point, even if.
1b9c0 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20      ** the user 
1b9d0 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c  deletes the coll
1b9e0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
1b9f0 66 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72  fter the vdbe pr
1ba00 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20  ogram is.    ** 
1ba10 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77  compiled (this w
1ba20 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68  as not always th
1ba30 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a  e case)..    */.
1ba40 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f      assert( !pCo
1ba50 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll || pColl->xCm
1ba60 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43  p );..    if( pC
1ba70 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74  oll ){.      ret
1ba80 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  urn vdbeCompareM
1ba90 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20  emString(pMem1, 
1baa0 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29  pMem2, pColl, 0)
1bab0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
1bac0 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  f a NULL pointer
1bad0 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74   was passed as t
1bae0 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74  he collate funct
1baf0 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  ion, fall throug
1bb00 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  h.    ** to the 
1bb10 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73  blob case and us
1bb20 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a  e memcmp().  */.
1bb30 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20    }. .  /* Both 
1bb40 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62  values must be b
1bb50 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75  lobs.  Compare u
1bb60 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20  sing memcmp().  
1bb70 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  */.  return sqli
1bb80 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70  te3BlobCompare(p
1bb90 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a  Mem1, pMem2);.}.
1bba0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
1bbb0 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
1bbc0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1bbd0 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74  on is a serial-t
1bbe0 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72  ype that.** corr
1bbf0 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e  esponds to an in
1bc00 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75  teger - all valu
1bc10 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  es between 1 and
1bc20 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a   9 inclusive .**
1bc30 20 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73   except 7. The s
1bc40 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20  econd points to 
1bc50 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
1bc60 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76  ing an integer v
1bc70 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a  alue.** serializ
1bc80 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
1bc90 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69  serial_type. Thi
1bca0 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
1bcb0 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72  ializes.** and r
1bcc0 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65  eturns the value
1bcd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
1bce0 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1bcf0 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Int(u32 serial_t
1bd00 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ype, const u8 *a
1bd10 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20  Key){.  u32 y;. 
1bd20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1bd30 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74  _DB || (serial_t
1bd40 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c  ype>=1 && serial
1bd50 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69  _type<=9 && seri
1bd60 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20  al_type!=7) );. 
1bd70 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
1bd80 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
1bd90 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a   0:.    case 1:.
1bda0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bdb0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1bdc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45        return ONE
1bdd0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1bde0 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20  .    case 2:.   
1bdf0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1be00 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1be10 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59     return TWO_BY
1be20 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1be30 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20    case 3:.      
1be40 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1be50 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1be60 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54  return THREE_BYT
1be70 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1be80 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20   case 4: {.     
1be90 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1bea0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1beb0 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
1bec0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1bed0 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1bee0 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20  nt*)&y;.    }.  
1bef0 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20    case 5: {.    
1bf00 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1bf10 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1bf20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59    return FOUR_BY
1bf30 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20  TE_UINT(aKey+2) 
1bf40 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
1bf50 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b  *TWO_BYTE_INT(aK
1bf60 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  ey);.    }.    c
1bf70 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75  ase 6: {.      u
1bf80 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45  64 x = FOUR_BYTE
1bf90 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1bfa0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1bfb0 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1bfc0 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
1bfd0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1bfe0 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72  aKey+4);.      r
1bff0 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34  eturn (i64)*(i64
1c000 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  *)&x;.    }.  }.
1c010 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61  .  return (seria
1c020 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a  l_type - 8);.}..
1c030 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1c040 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
1c050 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
1c060 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
1c070 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
1c080 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
1c090 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
1c0a0 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
1c0b0 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
1c0c0 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
1c0d0 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
1c0e0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
1c0f0 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
1c100 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
1c110 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
1c120 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
1c130 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
1c140 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1c150 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44  opcode of the VD
1c160 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a  BE.  The pPKey2.
1c170 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  ** key must be a
1c180 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68   parsed key such
1c190 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   as obtained fro
1c1a0 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
1c1b0 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a  ParseRecord..**.
1c1c0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  ** If argument b
1c1d0 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
1c1e0 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
1c1f0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1c200 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64  has already.** d
1c210 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
1c220 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
1c230 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20  of the keys are 
1c240 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79  equal..**.** Key
1c250 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f  1 and Key2 do no
1c260 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69  t have to contai
1c270 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
1c280 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20  r of fields. If 
1c290 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74  all .** fields t
1c2a0 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f  hat appear in bo
1c2b0 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  th keys are equa
1c2c0 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e  l, then pPKey2->
1c2d0 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a  default_rc is .*
1c2e0 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
1c2f0 2a 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f  * If database co
1c300 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63  rruption is disc
1c310 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65  overed, set pPKe
1c320 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a  y2->errCode to .
1c330 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
1c340 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20  T and return 0. 
1c350 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1c360 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1c370 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43  .** pPKey2->errC
1c380 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51  ode is set to SQ
1c390 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20  LITE_NOMEM and, 
1c3a0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  if it is not NUL
1c3b0 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63  L, the.** malloc
1c3c0 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  -failed flag set
1c3d0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
1c3e0 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65  dle (pPKey2->pKe
1c3f0 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69  yInfo->db)..*/.i
1c400 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
1c410 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
1c420 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  kip(.  int nKey1
1c430 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1c440 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b  ey1,   /* Left k
1c450 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1c460 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
1c470 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1c480 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53   key */.  int bS
1c490 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20  kip             
1c4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1c4b0 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66  true, skip the f
1c4c0 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  irst field */.){
1c4d0 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4f0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
1c500 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
1c510 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
1c520 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1c530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c540 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
1c550 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d  ext field to com
1c560 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  pare */.  u32 sz
1c570 48 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  Hdr1;           
1c580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1c590 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64  e of record head
1c5a0 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
1c5b0 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5d0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
1c5e0 72 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 64  rst type in head
1c5f0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
1c600 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1c610 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1c620 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d  n value */.  Mem
1c630 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d   *pRhs = pPKey2-
1c640 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20  >aMem;       /* 
1c650 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50  Next field of pP
1c660 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20  Key2 to compare 
1c670 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
1c680 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
1c690 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e  >pKeyInfo;.  con
1c6a0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1c6b0 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
1c6c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1c6d0 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65  )pKey1;.  Mem me
1c6e0 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b  m1;..  /* If bSk
1c6f0 69 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ip is true, then
1c700 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1c710 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e  already determin
1c720 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ed that the firs
1c730 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65  t.  ** two eleme
1c740 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20  nts in the keys 
1c750 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74  are equal. Fix t
1c760 68 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b  he various stack
1c770 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20   variables so.  
1c780 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ** that this rou
1c790 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70  tine begins comp
1c7a0 61 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 63  aring at the sec
1c7b0 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  ond field. */.  
1c7c0 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20  if( bSkip ){.   
1c7d0 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78   u32 s1;.    idx
1c7e0 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e  1 = 1 + getVarin
1c7f0 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
1c800 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d  1);.    szHdr1 =
1c810 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64   aKey1[0];.    d
1c820 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c  1 = szHdr1 + sql
1c830 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1c840 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69  peLen(s1);.    i
1c850 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b   = 1;.    pRhs++
1c860 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1c870 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
1c880 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
1c890 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72  ;.    d1 = szHdr
1c8a0 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75  1;.    if( d1>(u
1c8b0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1c8c0 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e   .      pPKey2->
1c8d0 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
1c8e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1c8f0 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
1c900 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f  0;  /* Corruptio
1c910 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  n */.    }.    i
1c920 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41   = 0;.  }..  VVA
1c930 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61  _ONLY( mem1.szMa
1c940 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
1c950 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
1c960 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1c970 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  s */.  assert( p
1c980 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1c990 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e  >nField+pPKey2->
1c9a0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1c9b0 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
1c9c0 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  d .       || COR
1c9d0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
1c9e0 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1c9f0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1ca00 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1ca10 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1ca20 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  fo->nField>0 );.
1ca30 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
1ca40 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
1ca50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
1ca60 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1ca70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69  e;..    /* RHS i
1ca80 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
1ca90 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c      if( pRhs->fl
1caa0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
1cab0 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1cac0 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1cad0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1cae0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1caf0 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1cb00 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29  erial_type>=10 )
1cb10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
1cb20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1cb30 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1cb40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1cb50 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1cb60 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1cb70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1cb80 64 6f 75 62 6c 65 20 72 68 73 20 3d 20 28 64 6f  double rhs = (do
1cb90 75 62 6c 65 29 70 52 68 73 2d 3e 75 2e 69 3b 0a  uble)pRhs->u.i;.
1cba0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1cbb0 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1cbc0 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1cbd0 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  type, &mem1);.  
1cbe0 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75        if( mem1.u
1cbf0 2e 72 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20  .r<rhs ){.      
1cc00 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1cc10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d       }else if( m
1cc20 65 6d 31 2e 75 2e 72 3e 72 68 73 20 29 7b 0a 20  em1.u.r>rhs ){. 
1cc30 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
1cc40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cc50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cc60 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52   i64 lhs = vdbeR
1cc70 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73  ecordDecodeInt(s
1cc80 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65  erial_type, &aKe
1cc90 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20  y1[d1]);.       
1cca0 20 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d   i64 rhs = pRhs-
1ccb0 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66  >u.i;.        if
1ccc0 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20  ( lhs<rhs ){.   
1ccd0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1cce0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1ccf0 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20  ( lhs>rhs ){.   
1cd00 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1cd10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cd20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1cd30 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20  RHS is real */. 
1cd40 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
1cd50 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
1cd60 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69  al ){.      seri
1cd70 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1cd80 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28  idx1];.      if(
1cd90 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30   serial_type>=10
1cda0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53   ){.        /* S
1cdb0 65 72 69 61 6c 20 74 79 70 65 73 20 31 32 20 6f  erial types 12 o
1cdc0 72 20 67 72 65 61 74 65 72 20 61 72 65 20 73 74  r greater are st
1cdd0 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20  rings and blobs 
1cde0 28 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20  (greater than.  
1cdf0 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73        ** numbers
1ce00 29 2e 20 54 79 70 65 73 20 31 30 20 61 6e 64 20  ). Types 10 and 
1ce10 31 31 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  11 are currently
1ce20 20 22 72 65 73 65 72 76 65 64 20 66 6f 72 20 66   "reserved for f
1ce30 75 74 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  uture .        *
1ce40 2a 20 75 73 65 22 2c 20 73 6f 20 69 74 20 64 6f  * use", so it do
1ce50 65 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61 74  esn't really mat
1ce60 74 65 72 20 77 68 61 74 20 74 68 65 20 72 65 73  ter what the res
1ce70 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e  ults of comparin
1ce80 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  g.        ** the
1ce90 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63 20 76 61  m to numberic va
1cea0 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20  lues are.  */.  
1ceb0 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1cec0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1ced0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b  erial_type==0 ){
1cee0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
1cef0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1cf00 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68         double rh
1cf10 73 20 3d 20 70 52 68 73 2d 3e 75 2e 72 3b 0a 20  s = pRhs->u.r;. 
1cf20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6c 68         double lh
1cf30 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  s;.        sqlit
1cf40 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1cf50 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
1cf60 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b  al_type, &mem1);
1cf70 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72  .        if( ser
1cf80 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
1cf90 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d 20 6d           lhs = m
1cfa0 65 6d 31 2e 75 2e 72 3b 0a 20 20 20 20 20 20 20  em1.u.r;.       
1cfb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cfc0 20 20 6c 68 73 20 3d 20 28 64 6f 75 62 6c 65 29    lhs = (double)
1cfd0 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20  mem1.u.i;.      
1cfe0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1cff0 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs<rhs ){.     
1d000 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1d010 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d020 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs>rhs ){.     
1d030 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1d040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d050 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1d060 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f  S is a string */
1d070 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1d080 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1d090 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74  Str ){.      get
1d0a0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1d0b0 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  idx1], serial_ty
1d0c0 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  pe);.      testc
1d0d0 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1d0e0 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1d0f0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
1d100 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1d110 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1d120 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
1d130 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20  pe & 0x01) ){.  
1d140 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1d150 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d160 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65      mem1.n = (se
1d170 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20  rial_type - 12) 
1d180 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73  / 2;.        tes
1d190 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e  tcase( (d1+mem1.
1d1a0 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  n)==(unsigned)nK
1d1b0 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ey1 );.        t
1d1c0 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d  estcase( (d1+mem
1d1d0 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65  1.n+1)==(unsigne
1d1e0 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1d1f0 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e     if( (d1+mem1.
1d200 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e  n) > (unsigned)n
1d210 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20  Key1 ){.        
1d220 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1d230 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1d240 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1d250 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d270 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
1d280 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1d290 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  f( pKeyInfo->aCo
1d2a0 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  ll[i] ){.       
1d2b0 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b     mem1.enc = pK
1d2c0 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
1d2d0 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d         mem1.db =
1d2e0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
1d2f0 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c           mem1.fl
1d300 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20  ags = MEM_Str;. 
1d310 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20           mem1.z 
1d320 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b  = (char*)&aKey1[
1d330 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  d1];.          r
1d340 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  c = vdbeCompareM
1d350 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20  emString(.      
1d360 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70          &mem1, p
1d370 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  Rhs, pKeyInfo->a
1d380 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32  Coll[i], &pPKey2
1d390 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
1d3a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
1d3b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1d3c0 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d  int nCmp = MIN(m
1d3d0 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b  em1.n, pRhs->n);
1d3e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1d3f0 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31  memcmp(&aKey1[d1
1d400 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70  ], pRhs->z, nCmp
1d410 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1d420 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65   rc==0 ) rc = me
1d430 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20  m1.n - pRhs->n; 
1d440 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d450 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1d460 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a   RHS is a blob *
1d470 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1d480 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1d490 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 67  _Blob ){.      g
1d4a0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1d4b0 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f  1[idx1], serial_
1d4c0 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73  type);.      tes
1d4d0 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
1d4e0 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
1d4f0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1d500 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79  12 || (serial_ty
1d510 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20  pe & 0x01) ){.  
1d520 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1d530 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d540 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28      int nStr = (
1d550 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
1d560 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74  ) / 2;.        t
1d570 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74  estcase( (d1+nSt
1d580 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  r)==(unsigned)nK
1d590 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ey1 );.        t
1d5a0 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74  estcase( (d1+nSt
1d5b0 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  r+1)==(unsigned)
1d5c0 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1d5d0 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e   if( (d1+nStr) >
1d5e0 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31   (unsigned)nKey1
1d5f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1d600 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
1d610 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
1d620 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1d630 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1d640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1d650 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1d660 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d670 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d        int nCmp =
1d680 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d   MIN(nStr, pRhs-
1d690 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  >n);.          r
1d6a0 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  c = memcmp(&aKey
1d6b0 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20  1[d1], pRhs->z, 
1d6c0 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nCmp);.         
1d6d0 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
1d6e0 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e  = nStr - pRhs->n
1d6f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d700 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1d710 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f  * RHS is null */
1d720 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
1d730 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1d740 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1d750 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74    rc = (serial_t
1d760 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a  ype!=0);.    }..
1d770 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
1d780 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
1d790 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
1d7a0 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
1d7b0 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = -rc;.      }.
1d7c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 64        assert( vd
1d7d0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1d7e0 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1d7f0 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20 29  1, pPKey2, rc) )
1d800 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d810 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1d820 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
1d830 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ent below */.   
1d840 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d850 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20    }..    i++;.  
1d860 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31    pRhs++;.    d1
1d870 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
1d880 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
1d890 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69  ial_type);.    i
1d8a0 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61  dx1 += sqlite3Va
1d8b0 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74  rintLen(serial_t
1d8c0 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
1d8d0 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73  idx1<(unsigned)s
1d8e0 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79  zHdr1 && i<pPKey
1d8f0 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c  2->nField && d1<
1d900 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1d910 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d   );..  /* No mem
1d920 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ory allocation i
1d930 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d  s ever used on m
1d940 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73  em1.  Prove this
1d950 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20   using.  ** the 
1d960 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1d970 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65  ().  If the asse
1d980 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69  rt() fails, it i
1d990 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20  ndicates a.  ** 
1d9a0 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20  memory leak and 
1d9b0 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73  a need to call s
1d9c0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1d9d0 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f  ease(&mem1).  */
1d9e0 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
1d9f0 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  szMalloc==0 );..
1da00 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
1da10 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
1da20 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65  r both of the ke
1da30 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
1da40 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  elds and.  ** al
1da50 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
1da60 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
1da70 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e  re equal. Return
1da80 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a   the default_rc.
1da90 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a    ** value.  */.
1daa0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
1dab0 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  T_DB .       || 
1dac0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1dad0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1dae0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b  ey1, pPKey2, pPK
1daf0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29  ey2->default_rc)
1db00 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79   .       || pKey
1db10 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
1db20 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65  Failed.  );.  re
1db30 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  turn pPKey2->def
1db40 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73  ault_rc;.}.int s
1db50 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1db60 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e  Compare(.  int n
1db70 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1db80 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65   *pKey1,   /* Le
1db90 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1dba0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1dbb0 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  y2          /* R
1dbc0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
1dbd0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1dbe0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1dbf0 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
1dc00 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30  pKey1, pPKey2, 0
1dc10 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
1dc20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e  s function is an
1dc30 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69   optimized versi
1dc40 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
1dc50 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1dc60 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68   .** that (a) th
1dc70 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66  e first field of
1dc80 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e   pPKey2 is an in
1dc90 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74  teger, and (b) t
1dca0 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68  he .** size-of-h
1dcb0 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20  eader varint at 
1dcc0 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b  the start of (pK
1dcd0 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20  ey1/nKey1) fits 
1dce0 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62  in a single.** b
1dcf0 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73  yte (i.e. is les
1dd00 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a  s than 128)..**.
1dd10 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63  ** To avoid conc
1dd20 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65  erns about buffe
1dd30 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69  r overreads, thi
1dd40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
1dd50 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68  y used.** on sch
1dd60 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d  emas where the m
1dd70 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61  aximum valid hea
1dd80 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62  der size is 63 b
1dd90 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f  ytes or less..*/
1dda0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
1ddb0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1ddc0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1ddd0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1dde0 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
1ddf0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1de00 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
1de10 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1de20 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
1de30 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20  aKey = &((const 
1de40 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e  u8*)pKey1)[*(con
1de50 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30  st u8*)pKey1 & 0
1de60 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69  x3F];.  int seri
1de70 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73  al_type = ((cons
1de80 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b  t u8*)pKey1)[1];
1de90 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33  .  int res;.  u3
1dea0 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20  2 y;.  u64 x;.  
1deb0 69 36 34 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e  i64 v = pPKey2->
1dec0 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69  aMem[0].u.i;.  i
1ded0 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41  64 lhs;..  vdbeA
1dee0 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
1def0 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79  ithinLimits(nKey
1df00 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1df10 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61  ->pKeyInfo);.  a
1df20 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b  ssert( (*(u8*)pK
1df30 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f  ey1)<=0x3F || CO
1df40 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77  RRUPT_DB );.  sw
1df50 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
1df60 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a  e ){.    case 1:
1df70 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
1df80 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1df90 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42       lhs = ONE_B
1dfa0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1dfb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1dfc0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1dfd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1dfe0 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
1dff0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1e000 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
1e010 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b   TWO_BYTE_INT(aK
1e020 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1e030 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1e040 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e050 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
1e060 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
1e070 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1e080 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54   lhs = THREE_BYT
1e090 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1e0a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1e0b0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1e0c0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1e0d0 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
1e0e0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1e0f0 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  */.      y = FOU
1e100 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1e110 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28  );.      lhs = (
1e120 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20  i64)*(int*)&y;. 
1e130 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1e140 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1e150 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1e160 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
1e170 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1e180 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
1e190 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1e1a0 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34  aKey+2) + (((i64
1e1b0 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
1e1c0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1e1d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1e1e0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1e1f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1e200 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65  e 6: { /* 8-byte
1e210 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1e220 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55  */.      x = FOU
1e230 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1e240 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
1e250 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45  <32) | FOUR_BYTE
1e260 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20  _UINT(aKey+4);. 
1e270 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34       lhs = *(i64
1e280 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&x;.      test
1e290 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1e2a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e2b0 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20  }.    case 8: . 
1e2c0 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20       lhs = 0;.  
1e2d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1e2e0 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73  ase 9:.      lhs
1e2f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
1e300 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  k;..    /* This 
1e310 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65  case could be re
1e320 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68  moved without ch
1e330 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c  anging the resul
1e340 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20  ts of running.  
1e350 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20    ** this code. 
1e360 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75  Including it cau
1e370 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72  ses gcc to gener
1e380 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69  ate a faster swi
1e390 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74  tch .    ** stat
1e3a0 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65  ement (since the
1e3b0 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68   range of switch
1e3c0 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61   targets now sta
1e3d0 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a  rts at zero and.
1e3e0 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67      ** is contig
1e3f0 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e  uous) but does n
1e400 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70  ot cause any dup
1e410 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62  licate code to b
1e420 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20  e generated.    
1e430 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c  ** (as gcc is cl
1e440 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63  ever enough to c
1e450 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c  ombine the two l
1e460 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65  ike cases). Othe
1e470 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  r .    ** compil
1e480 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d  ers might be sim
1e490 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63  ilar.  */ .    c
1e4a0 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20  ase 0: case 7:. 
1e4b0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1e4c0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1e4d0 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79  pare(nKey1, pKey
1e4e0 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20  1, pPKey2);..   
1e4f0 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
1e500 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1e510 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1e520 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1e530 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Key2);.  }..  if
1e540 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72  ( v>lhs ){.    r
1e550 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
1e560 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c  .  }else if( v<l
1e570 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  hs ){.    res = 
1e580 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65  pPKey2->r2;.  }e
1e590 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  lse if( pPKey2->
1e5a0 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20  nField>1 ){.    
1e5b0 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65  /* The first fie
1e5c0 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b  lds of the two k
1e5d0 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43  eys are equal. C
1e5e0 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61 69 6c  ompare the trail
1e5f0 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ing .    ** fiel
1e600 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20  ds.  */.    res 
1e610 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
1e620 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
1e630 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ip(nKey1, pKey1,
1e640 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d   pPKey2, 1);.  }
1e650 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
1e660 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
1e670 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72   the two keys ar
1e680 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72  e equal and ther
1e690 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e  e are no trailin
1e6a0 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e  g.    ** fields.
1e6b0 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e   Return pPKey2->
1e6c0 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68  default_rc in th
1e6d0 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20  is case. */.    
1e6e0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65  res = pPKey2->de
1e6f0 66 61 75 6c 74 5f 72 63 3b 0a 20 20 7d 0a 0a 20  fault_rc;.  }.. 
1e700 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
1e710 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1e720 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1e730 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20  Key2, res) );.  
1e740 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
1e750 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e760 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  on is an optimiz
1e770 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
1e780 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1e790 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61  ompare() .** tha
1e7a0 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20  t (a) the first 
1e7b0 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
1e7c0 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61  is a string, tha
1e7d0 74 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20  t (b) the first 
1e7e0 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68  field.** uses th
1e7f0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1e800 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20  ence BINARY and 
1e810 28 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a  (c) that the siz
1e820 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
1e830 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74  nt .** at the st
1e840 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b  art of (pKey1/nK
1e850 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73  ey1) fits in a s
1e860 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73  ingle byte..*/.s
1e870 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
1e880 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1e890 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g(.  int nKey1, 
1e8a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1e8b0 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
1e8c0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1e8d0 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
1e8e0 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1e8f0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
1e900 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
1e910 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74  u8*)pKey1;.  int
1e920 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20   serial_type;.  
1e930 69 6e 74 20 72 65 73 3b 0a 0a 20 20 76 64 62 65  int res;..  vdbe
1e940 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1e950 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65  WithinLimits(nKe
1e960 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1e970 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  2->pKeyInfo);.  
1e980 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1e990 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  y1[1], serial_ty
1e9a0 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61  pe);.  if( seria
1e9b0 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
1e9c0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1e9d0 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79  1;      /* (pKey
1e9e0 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75  1/nKey1) is a nu
1e9f0 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a  mber or a null *
1ea00 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28  /.  }else if( !(
1ea10 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1ea20 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20  01) ){ .    res 
1ea30 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20  = pPKey2->r2;   
1ea40 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65     /* (pKey1/nKe
1ea50 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  y1) is a blob */
1ea60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1ea70 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20  t nCmp;.    int 
1ea80 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a  nStr;.    int sz
1ea90 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  Hdr = aKey1[0];.
1eaa0 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72  .    nStr = (ser
1eab0 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32  ial_type-12) / 2
1eac0 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72  ;.    if( (szHdr
1ead0 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31   + nStr) > nKey1
1eae0 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32   ){.      pPKey2
1eaf0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1eb00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1eb10 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
1eb20 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75  n 0;    /* Corru
1eb30 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ption */.    }. 
1eb40 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70     nCmp = MIN( p
1eb50 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e  PKey2->aMem[0].n
1eb60 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65  , nStr );.    re
1eb70 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  s = memcmp(&aKey
1eb80 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32  1[szHdr], pPKey2
1eb90 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d  ->aMem[0].z, nCm
1eba0 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73  p);..    if( res
1ebb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  ==0 ){.      res
1ebc0 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32   = nStr - pPKey2
1ebd0 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20  ->aMem[0].n;.   
1ebe0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
1ebf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b  .        if( pPK
1ec00 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
1ec10 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d  .          res =
1ec20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1ec30 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
1ec40 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
1ec50 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20  pPKey2, 1);.    
1ec60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ec70 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
1ec80 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
1ec90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1eca0 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
1ecb0 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
1ecc0 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
1ecd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ece0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1ecf0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1ed00 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
1ed10 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
1ed20 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65  Key2->r2;.    }e
1ed30 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  lse{.      res =
1ed40 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
1ed50 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1ed60 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
1ed70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1ed80 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
1ed90 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f  es).       || CO
1eda0 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20  RRUPT_DB.       
1edb0 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  || pPKey2->pKeyI
1edc0 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
1edd0 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74  ailed.  );.  ret
1ede0 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
1edf0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1ee00 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
1ee10 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1ee20 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66  e() compatible f
1ee30 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61  unction.** suita
1ee40 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  ble for comparin
1ee50 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63  g serialized rec
1ee60 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61  ords to the unpa
1ee70 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73  cked record pass
1ee80 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c  ed.** as the onl
1ee90 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52  y argument..*/.R
1eea0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c  ecordCompare sql
1eeb0 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
1eec0 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  are(UnpackedReco
1eed0 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72  rd *p){.  /* var
1eee0 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
1eef0 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74  Int() and varint
1ef00 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
1ef10 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d  ing() both assum
1ef20 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  e.  ** that the 
1ef30 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
1ef40 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72  arint that occur
1ef50 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
1ef60 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20  f each record.  
1ef70 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  ** fits in a sin
1ef80 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69  gle byte (i.e. i
1ef90 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20  s 127 or less). 
1efa0 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
1efb0 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c  areInt().  ** al
1efc0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  so assumes that 
1efd0 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76  it is safe to ov
1efe0 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20  erread a buffer 
1eff0 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20  by at least the 
1f000 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f  .  ** maximum po
1f010 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61  ssible legal hea
1f020 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20  der size plus 8 
1f030 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74  bytes. Because t
1f040 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61  here is.  ** gua
1f050 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74  ranteed to be at
1f060 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e   least 74 (but n
1f070 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66  ot 136) bytes of
1f080 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69   padding followi
1f090 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66  ng each.  ** buf
1f0a0 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61  fer passed to va
1f0b0 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
1f0c0 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65  eInt() this make
1f0d0 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20  s it convenient 
1f0e0 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68  to.  ** limit th
1f0f0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
1f100 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73  ader to 64 bytes
1f110 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20   in cases where 
1f120 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a  the first field.
1f130 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67    ** is an integ
1f140 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  er..  **.  ** Th
1f150 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
1f160 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69   enforce this li
1f170 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64  mit is to consid
1f180 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20  er only records 
1f190 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65  with.  ** 13 fie
1f1a0 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20  lds or less. If 
1f1b0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1f1c0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74  is an integer, t
1f1d0 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
1f1e0 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a  .  ** header siz
1f1f0 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b  e is (12*5 + 1 +
1f200 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20   1) bytes.  */. 
1f210 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66   if( (p->pKeyInf
1f220 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70  o->nField + p->p
1f230 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1f240 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74  )<=13 ){.    int
1f250 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d   flags = p->aMem
1f260 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69  [0].flags;.    i
1f270 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  f( p->pKeyInfo->
1f280 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b  aSortOrder[0] ){
1f290 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31  .      p->r1 = 1
1f2a0 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
1f2b0 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
1f2c0 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b       p->r1 = -1;
1f2d0 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31  .      p->r2 = 1
1f2e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f2f0 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  (flags & MEM_Int
1f300 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1f310 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
1f320 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  areInt;.    }.  
1f330 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
1f340 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a  s & MEM_Real );.
1f350 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
1f360 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
1f370 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1f380 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
1f390 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61   );.    if( (fla
1f3a0 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d  gs & (MEM_Real|M
1f3b0 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62  EM_Null|MEM_Blob
1f3c0 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79  ))==0 && p->pKey
1f3d0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d  Info->aColl[0]==
1f3e0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1f3f0 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  t( flags & MEM_S
1f400 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tr );.      retu
1f410 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
1f420 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20  pareString;.    
1f430 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1f440 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1f450 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a  dCompare;.}../*.
1f460 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  ** pCur points a
1f470 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
1f480 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
1f490 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
1f4a0 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64   opcode..** Read
1f4b0 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20   the rowid (the 
1f4c0 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68  last field in th
1f4d0 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74  e record) and st
1f4e0 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64  ore it in *rowid
1f4f0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
1f500 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
1f510 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e  ing works, or an
1f520 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
1f530 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75  rwise..**.** pCu
1f540 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74  r might be point
1f550 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61  ing to text obta
1f560 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72  ined from a corr
1f570 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
1f580 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e  e..** So the con
1f590 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74  tent cannot be t
1f5a0 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72  rusted.  Do appr
1f5b0 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f  opriate checks o
1f5c0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a  n the content..*
1f5d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
1f5e0 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65  eIdxRowid(sqlite
1f5f0 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20  3 *db, BtCursor 
1f600 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
1f610 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
1f620 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
1f630 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
1f640 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1f650 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
1f660 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
1f670 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
1f680 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
1f690 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
1f6a0 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
1f6b0 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
1f6c0 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20  Mem m, v;..  /* 
1f6d0 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  Get the size of 
1f6e0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e  the index entry.
1f6f0 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65    Only indices e
1f700 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20  ntries of less. 
1f710 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72   ** than 2GiB ar
1f720 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74  e support - anyt
1f730 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20  hing large must 
1f740 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  be database corr
1f750 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79  uption..  ** Any
1f760 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
1f770 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74  etected in sqlit
1f780 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
1f790 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73  Ptr(), though, s
1f7a0 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65  o.  ** this code
1f7b0 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75   can safely assu
1f7c0 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79  me that nCellKey
1f7d0 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20   is 32-bits  .  
1f7e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
1f7f0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
1f800 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
1f810 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29    VVA_ONLY(rc =)
1f820 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1f830 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
1f840 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
1f850 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f860 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  ;     /* pCur is
1f870 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
1f880 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
1f890 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  fail */.  assert
1f8a0 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51  ( (nCellKey & SQ
1f8b0 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28  LITE_MAX_U32)==(
1f8c0 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a  u64)nCellKey );.
1f8d0 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
1f8e0 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
1f8f0 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nt of the index 
1f900 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  entry */.  sqlit
1f910 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d  e3VdbeMemInit(&m
1f920 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d  , db, 0);.  rc =
1f930 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
1f940 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
1f950 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
1f960 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
1f970 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1f980 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
1f990 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75  e index entry mu
1f9a0 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  st begin with a 
1f9b0 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20  header size */. 
1f9c0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
1f9d0 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
1f9e0 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  dr);.  testcase(
1f9f0 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74   szHdr==3 );.  t
1fa00 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
1fa10 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  m.n );.  if( unl
1fa20 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
1fa30 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29   (int)szHdr>m.n)
1fa40 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
1fa50 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
1fa60 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
1fa70 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
1fa80 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
1fa90 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
1faa0 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
1fab0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1fac0 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
1fad0 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
1fae0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
1faf0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
1fb00 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
1fb10 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
1fb20 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
1fb30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1fb40 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
1fb50 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1fb60 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
1fb70 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1fb80 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
1fb90 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
1fba0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1fbb0 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
1fbc0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1fbd0 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
1fbe0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1fbf0 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
1fc00 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
1fc10 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
1fc20 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
1fc30 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
1fc40 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
1fc50 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
1fc60 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61  wid = sqlite3Sma
1fc70 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65  llTypeSizes[type
1fc80 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61  Rowid];.  testca
1fc90 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a  se( (u32)m.n==sz
1fca0 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a  Hdr+lenRowid );.
1fcb0 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28    if( unlikely((
1fcc0 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65  u32)m.n<szHdr+le
1fcd0 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67  nRowid) ){.    g
1fce0 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
1fcf0 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
1fd00 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e   /* Fetch the in
1fd10 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e  teger off the en
1fd20 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72  d of the index r
1fd30 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
1fd40 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1fd50 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  (u8*)&m.z[m.n-le
1fd60 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
1fd70 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
1fd80 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c  d = v.u.i;.  sql
1fd90 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1fda0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
1fdb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1fdc0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64  * Jump here if d
1fdd0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1fde0 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61  on is detected a
1fdf0 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a  fter m has been.
1fe00 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20    ** allocated. 
1fe10 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65   Free the m obje
1fe20 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ct and return SQ
1fe30 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f  LITE_CORRUPT. */
1fe40 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75  .idx_rowid_corru
1fe50 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73  ption:.  testcas
1fe60 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30  e( m.szMalloc!=0
1fe70 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
1fe80 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
1fe90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1fea0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d  _CORRUPT_BKPT;.}
1feb0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
1fec0 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
1fed0 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
1fee0 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
1fef0 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74  nting to against
1ff00 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69  .** the key stri
1ff10 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e  ng in pUnpacked.
1ff20 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52    Write into *pR
1ff30 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74  es a number.** t
1ff40 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c  hat is negative,
1ff50 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
1ff60 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73  ve if pC is less
1ff70 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
1ff80 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
1ff90 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20  han pUnpacked.  
1ffa0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1ffb0 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a   on success..**.
1ffc0 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20  ** pUnpacked is 
1ffd0 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77  either created w
1ffe0 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f  ithout a rowid o
1fff0 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73  r is truncated s
20000 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69  o that it.** omi
20010 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20  ts the rowid at 
20020 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f  the end.  The ro
20030 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
20040 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
20050 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20  y.** is ignored 
20060 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c  as well.  Hence,
20070 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
20080 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  ly compares the 
20090 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20  prefixes .** of 
200a0 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74  the keys prior t
200b0 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  o the final rowi
200c0 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72  d, not the entir
200d0 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e key..*/.int sq
200e0 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
200f0 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65  ompare(.  sqlite
20100 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
20110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
20120 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
20130 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  n */.  VdbeCurso
20140 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
20150 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
20160 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
20170 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e   against */.  Un
20180 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
20190 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f  npacked,       /
201a0 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69  * Unpacked versi
201b0 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69  on of key */.  i
201c0 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
201d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201e0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
201f0 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
20200 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
20210 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
20220 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
20230 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70  or *pCur = pC->p
20240 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b  Cursor;.  Mem m;
20250 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
20260 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
20270 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
20280 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
20290 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
202a0 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
202b0 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
202c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
202d0 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
202e0 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
202f0 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
20300 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c  il */.  /* nCell
20310 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  Key will always 
20320 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
20330 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61   0xffffffff beca
20340 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20  use of the way. 
20350 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61   ** that btreePa
20360 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
20370 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
20380 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d  t32() are implem
20390 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e  ented */.  if( n
203a0 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43  CellKey<=0 || nC
203b0 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ellKey>0x7ffffff
203c0 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  f ){.    *res = 
203d0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
203e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
203f0 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  T;.  }.  sqlite3
20400 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
20410 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
20420 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
20430 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
20440 6f 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c  or, 0, (u32)nCel
20450 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
20460 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
20470 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
20480 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
20490 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d  eRecordCompare(m
204a0 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b  .n, m.z, pUnpack
204b0 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ed);.  sqlite3Vd
204c0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
204d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
204e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
204f0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
20500 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
20510 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
20520 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
20530 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
20540 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
20550 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
20560 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
20570 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
20580 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
20590 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61  nt nChange){.  a
205a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
205b0 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
205c0 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43  tex) );.  db->nC
205d0 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b  hange = nChange;
205e0 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
205f0 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
20600 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66  }../*.** Set a f
20610 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20  lag in the vdbe 
20620 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
20630 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65  ange counter whe
20640 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65  n it is finalise
20650 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a  d.** or reset..*
20660 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
20670 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56  beCountChanges(V
20680 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68  dbe *v){.  v->ch
20690 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d  angeCntOn = 1;.}
206a0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65  ../*.** Mark eve
206b0 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ry prepared stat
206c0 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ement associated
206d0 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
206e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
206f0 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  s expired..**.**
20700 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   An expired stat
20710 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74  ement means that
20720 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
20730 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
20740 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e  is.** recommend.
20750 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70    Statements exp
20760 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20  ire when things 
20770 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65  happen that make
20780 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61   their.** progra
20790 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65  ms obsolete.  Re
207a0 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69  moving user-defi
207b0 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ned functions or
207c0 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
207d0 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e  quences, or chan
207e0 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a  ging an authoriz
207f0 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61  ation function a
20800 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a  re the types of.
20810 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d  ** things that m
20820 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ake prepared sta
20830 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65  tements obsolete
20840 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20850 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
20860 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65  tatements(sqlite
20870 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
20880 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d  p;.  for(p = db-
20890 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e  >pVdbe; p; p=p->
208a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65  pNext){.    p->e
208b0 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  xpired = 1;.  }.
208c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
208d0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
208e0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
208f0 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
20900 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
20910 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
20920 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  urn v->db;.}../*
20930 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
20940 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
20950 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
20960 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
20970 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a  e value bound.**
20980 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20   parameter iVar 
20990 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c  of VM v. Except,
209a0 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
209b0 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65   an SQL NULL, re
209c0 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65  turn .** 0 inste
209d0 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73  ad. Unless it is
209e0 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66   NULL, apply aff
209f0 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f  inity aff (one o
20a00 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46  f the SQLITE_AFF
20a10 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29  _*.** constants)
20a20 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65   to the value be
20a30 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
20a40 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  t..**.** The ret
20a50 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74  urned value must
20a60 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
20a70 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
20a80 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29  lite3ValueFree()
20a90 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c  ..*/.sqlite3_val
20aa0 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  ue *sqlite3VdbeG
20ab0 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 62  etBoundValue(Vdb
20ac0 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20  e *v, int iVar, 
20ad0 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72  u8 aff){.  asser
20ae0 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69  t( iVar>0 );.  i
20af0 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20  f( v ){.    Mem 
20b00 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72  *pMem = &v->aVar
20b10 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66  [iVar-1];.    if
20b20 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67  ( 0==(pMem->flag
20b30 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b  s & MEM_Null) ){
20b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
20b50 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c  alue *pRet = sql
20b60 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e  ite3ValueNew(v->
20b70 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  db);.      if( p
20b80 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Ret ){.        s
20b90 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70  qlite3VdbeMemCop
20ba0 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70  y((Mem *)pRet, p
20bb0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
20bc0 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41  lite3ValueApplyA
20bd0 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66  ffinity(pRet, af
20be0 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  f, SQLITE_UTF8);
20bf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
20c00 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20  eturn pRet;.    
20c10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
20c20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69  ;.}../*.** Confi
20c30 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c  gure SQL variabl
20c40 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62  e iVar so that b
20c50 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c  inding a new val
20c60 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73  ue to it signals
20c70 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72  .** to sqlite3_r
20c80 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74  eoptimize() that
20c90 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68   re-preparing th
20ca0 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20  e statement may 
20cb0 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62  result.** in a b
20cc0 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e  etter query plan
20cd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20ce0 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28  3VdbeSetVarmask(
20cf0 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
20d00 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  r){.  assert( iV
20d10 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56  ar>0 );.  if( iV
20d20 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e  ar>32 ){.    v->
20d30 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66  expmask = 0xffff
20d40 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ffff;.  }else{. 
20d50 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d     v->expmask |=
20d60 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61   ((u32)1 << (iVa
20d70 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  r-1));.  }.}..#i
20d80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20d90 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
20da0 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72  *.** Transfer er
20db0 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
20dc0 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33   from an sqlite3
20dd0 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74  _vtab.zErrMsg (t
20de0 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  ext stored.** in
20df0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
20e00 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
20e10 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62  lloc) into a Vdb
20e20 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20  e.zErrMsg (text 
20e30 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d  stored.** in mem
20e40 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
20e50 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  m sqlite3DbMallo
20e60 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  c)..*/.void sqli
20e70 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72  te3VtabImportErr
20e80 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c  msg(Vdbe *p, sql
20e90 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
20ea0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
20eb0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69   = p->db;.  sqli
20ec0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
20ed0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
20ee0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
20ef0 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 56  3DbStrDup(db, pV
20f00 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
20f10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
20f20 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
20f30 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
20f40 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  = 0;.}.#endif /*
20f50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
20f60 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a           TUALTABLE */.