/ Hex Artifact Content
Login

Artifact 4c82d6f686f72ea7d266d26d528a171b728626f7:


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 46 75 6e 63 74 69 6f 6e 3a  ase OP_Function:
3920: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41  .      case OP_A
3930: 67 67 53 74 65 70 3a 20 7b 0a 20 20 20 20 20 20  ggStep: {.      
3940: 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d    if( pOp->p5>nM
3950: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
3960: 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20  s = pOp->p5;.   
3970: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3980: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f    }.      case O
3990: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b  P_Transaction: {
39a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
39b0: 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61  ->p2!=0 ) p->rea
39c0: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
39d0: 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20     /* fall thru 
39e0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
39f0: 20 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d   case OP_AutoCom
3a00: 6d 69 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20  mit:.      case 
3a10: 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a  OP_Savepoint: {.
3a20: 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65          p->bIsRe
3a30: 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  ader = 1;.      
3a40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3a50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3a60: 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 63  OMIT_WAL.      c
3a70: 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  ase OP_Checkpoin
3a80: 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t:.#endif.      
3a90: 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a  case OP_Vacuum:.
3aa0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f        case OP_Jo
3ab0: 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20  urnalMode: {.   
3ac0: 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79       p->readOnly
3ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 0;.        p-
3ae0: 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a  >bIsReader = 1;.
3af0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3b00: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
3b10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
3b20: 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 63 61  ALTABLE.      ca
3b30: 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b  se OP_VUpdate: {
3b40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
3b50: 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20  ->p2>nMaxArgs ) 
3b60: 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e  nMaxArgs = pOp->
3b70: 70 32 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  p2;.        brea
3b80: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3b90: 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72   case OP_VFilter
3ba0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
3bb0: 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
3bc0: 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d  t( p->nOp - i >=
3bd0: 20 33 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73   3 );.        as
3be0: 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70  sert( pOp[-1].op
3bf0: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72  code==OP_Integer
3c00: 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20   );.        n = 
3c10: 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20  pOp[-1].p1;.    
3c20: 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72      if( n>nMaxAr
3c30: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
3c40: 6e 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  n;.        break
3c50: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
3c60: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e  .      case OP_N
3c70: 65 78 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20  ext:.      case 
3c80: 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a 20  OP_NextIfOpen:. 
3c90: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72       case OP_Sor
3ca0: 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20  terNext: {.     
3cb0: 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61     pOp->p4.xAdva
3cc0: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  nce = sqlite3Btr
3cd0: 65 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  eeNext;.        
3ce0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
3cf0: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
3d00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3d10: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50  .      case OP_P
3d20: 72 65 76 3a 0a 20 20 20 20 20 20 63 61 73 65 20  rev:.      case 
3d30: 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b  OP_PrevIfOpen: {
3d40: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  .        pOp->p4
3d50: 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69  .xAdvance = sqli
3d60: 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
3d70: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
3d80: 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e  4type = P4_ADVAN
3d90: 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  CE;.        brea
3da0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
3db0: 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61  ..    pOp->opfla
3dc0: 67 73 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f  gs = sqlite3Opco
3dd0: 64 65 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64  deProperty[opcod
3de0: 65 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 4f 70  e];.    if( (pOp
3df0: 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c  ->opflags & OPFL
3e00: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f  G_JUMP)!=0 && pO
3e10: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
3e20: 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d   assert( -1-pOp-
3e30: 3e 70 32 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62  >p2<pParse->nLab
3e40: 65 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d  el );.      pOp-
3e50: 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d  >p2 = aLabel[-1-
3e60: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a  pOp->p2];.    }.
3e70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
3e80: 72 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73  ree(p->db, pPars
3e90: 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50  e->aLabel);.  pP
3ea0: 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30  arse->aLabel = 0
3eb0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62  ;.  pParse->nLab
3ec0: 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46  el = 0;.  *pMaxF
3ed0: 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72  uncArgs = nMaxAr
3ee0: 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  gs;.  assert( p-
3ef0: 3e 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c  >bIsReader!=0 ||
3f00: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
3f10: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a  ->btreeMask) );.
3f20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3f30: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
3f40: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
3f50: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
3f60: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3f70: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
3f80: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
3f90: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3fa0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3fb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
3fc0: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Op;.}../*.** Thi
3fd0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
3fe0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
3ff0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63  the array of opc
4000: 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  odes associated 
4010: 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65  with.** the Vdbe
4020: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
4030: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49  irst argument. I
4040: 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
4050: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
4060: 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f  ** to arrange fo
4070: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  r the returned a
4080: 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74  rray to be event
4090: 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
40a0: 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72  g the .** vdbeFr
40b0: 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63  eeOpArray() func
40c0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  tion..**.** Befo
40d0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
40e0: 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68  nOp is set to th
40f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
4100: 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72  ies in the retur
4110: 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c  ned.** array. Al
4120: 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73  so, *pnMaxArg is
4130: 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67   set to the larg
4140: 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e  er of its curren
4150: 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20  t value and .** 
4160: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
4170: 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62  tries in the Vdb
4180: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20  e.apArg[] array 
4190: 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63  required to exec
41a0: 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  ute the .** retu
41b0: 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  rned program..*/
41c0: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
41d0: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28  VdbeTakeOpArray(
41e0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Vdbe *p, int *pn
41f0: 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72  Op, int *pnMaxAr
4200: 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f  g){.  VdbeOp *aO
4210: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73  p = p->aOp;.  as
4220: 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d  sert( aOp && !p-
4230: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4240: 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  d );..  /* Check
4250: 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62   that sqlite3Vdb
4260: 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73  eUsesBtree() was
4270: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74   not called on t
4280: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65  his VM */.  asse
4290: 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  rt( DbMaskAllZer
42a0: 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20  o(p->btreeMask) 
42b0: 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56  );..  resolveP2V
42c0: 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72  alues(p, pnMaxAr
42d0: 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d  g);.  *pnOp = p-
42e0: 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d  >nOp;.  p->aOp =
42f0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70   0;.  return aOp
4300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
4310: 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f   whole list of o
4320: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  perations to the
4330: 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b   operation stack
4340: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a  .  Return the.**
4350: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
4360: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
4370: 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  added..*/.int sq
4380: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
4390: 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  st(Vdbe *p, int 
43a0: 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20  nOp, VdbeOpList 
43b0: 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 69 6e 74 20  const *aOp, int 
43c0: 69 4c 69 6e 65 6e 6f 29 7b 0a 20 20 69 6e 74 20  iLineno){.  int 
43d0: 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20  addr;.  assert( 
43e0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
43f0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
4400: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
4410: 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  > p->pParse->nOp
4420: 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41  Alloc && growOpA
4430: 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a  rray(p, nOp) ){.
4440: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4450: 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f  }.  addr = p->nO
4460: 70 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  p;.  if( ALWAYS(
4470: 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e  nOp>0) ){.    in
4480: 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c  t i;.    VdbeOpL
4490: 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d  ist const *pIn =
44a0: 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d   aOp;.    for(i=
44b0: 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70  0; i<nOp; i++, p
44c0: 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  In++){.      int
44d0: 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20   p2 = pIn->p2;. 
44e0: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75       VdbeOp *pOu
44f0: 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  t = &p->aOp[i+ad
4500: 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  dr];.      pOut-
4510: 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f  >opcode = pIn->o
4520: 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75  pcode;.      pOu
4530: 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b  t->p1 = pIn->p1;
4540: 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20  .      if( p2<0 
4550: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
4560: 74 28 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  t( sqlite3Opcode
4570: 50 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f  Property[pOut->o
4580: 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a  pcode] & OPFLG_J
4590: 55 4d 50 20 29 3b 0a 20 20 20 20 20 20 20 20 70  UMP );.        p
45a0: 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b  Out->p2 = addr +
45b0: 20 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20   ADDR(p2);.     
45c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
45d0: 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20  pOut->p2 = p2;. 
45e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75       }.      pOu
45f0: 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b  t->p3 = pIn->p3;
4600: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74  .      pOut->p4t
4610: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
4620: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34  ;.      pOut->p4
4630: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  .p = 0;.      pO
4640: 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64  ut->p5 = 0;.#ifd
4650: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4660: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
4670: 53 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43  S.      pOut->zC
4680: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  omment = 0;.#end
4690: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
46a0: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20  _VDBE_COVERAGE. 
46b0: 20 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c       pOut->iSrcL
46c0: 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b  ine = iLineno+i;
46d0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 28 76 6f  .#else.      (vo
46e0: 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64  id)iLineno;.#end
46f0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
4700: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28  _DEBUG.      if(
4710: 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20   p->db->flags & 
4720: 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70  SQLITE_VdbeAddop
4730: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Trace ){.       
4740: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
4750: 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26  tOp(0, i+addr, &
4760: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b  p->aOp[i+addr]);
4770: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
4780: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70      }.    p->nOp
4790: 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72   += nOp;.  }.  r
47a0: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23  eturn addr;.}..#
47b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
47c0: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
47d0: 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20  ANSTATUS)./*.** 
47e0: 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  Add an entry to 
47f0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75  the array of cou
4800: 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79  nters managed by
4810: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
4820: 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76  anstatus()..*/.v
4830: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
4840: 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62  canStatus(.  Vdb
4850: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4870: 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74  VM to add scanst
4880: 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69  atus() to */.  i
4890: 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  nt addrExplain, 
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
48b0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
48c0: 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a  Explain (or 0) *
48d0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70  /.  int addrLoop
48e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
48f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4900: 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  f loop counter *
4910: 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73  / .  int addrVis
4920: 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  it,             
4930: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
4940: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
4950: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67  counter */.  Log
4960: 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20  Est nEst,       
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4980: 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  Estimated number
4990: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
49a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
49b0: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  *zName          
49c0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
49d0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62  table or index b
49e0: 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  eing scanned */.
49f0: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
4a00: 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20   (p->nScan+1) * 
4a10: 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74 75  sizeof(ScanStatu
4a20: 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75 73  s);.  ScanStatus
4a30: 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d   *aNew;.  aNew =
4a40: 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73 71   (ScanStatus*)sq
4a50: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
4a60: 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20  ->db, p->aScan, 
4a70: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 4e  nByte);.  if( aN
4a80: 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53 74  ew ){.    ScanSt
4a90: 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e  atus *pNew = &aN
4aa0: 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a  ew[p->nScan++];.
4ab0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45 78      pNew->addrEx
4ac0: 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70 6c  plain = addrExpl
4ad0: 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ain;.    pNew->a
4ae0: 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f  ddrLoop = addrLo
4af0: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  op;.    pNew->ad
4b00: 64 72 56 69 73 69 74 20 3d 20 61 64 64 72 56 69  drVisit = addrVi
4b10: 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  sit;.    pNew->n
4b20: 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20  Est = nEst;.    
4b30: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pNew->zName = sq
4b40: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 2d  lite3DbStrDup(p-
4b50: 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
4b60: 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77   p->aScan = aNew
4b70: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
4b80: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
4b90: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
4ba0: 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  1 operand for a 
4bb0: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
4bc0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
4bd0: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
4be0: 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f  when a large pro
4bf0: 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66  gram is loaded f
4c00: 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20  rom a.** static 
4c10: 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69  array using sqli
4c20: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
4c30: 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   but we want to 
4c40: 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69  make a.** few mi
4c50: 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74  nor changes to t
4c60: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  he program..*/.v
4c70: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
4c80: 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c  hangeP1(Vdbe *p,
4c90: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
4ca0: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
4cb0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75  !=0 );.  if( ((u
4cc0: 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20  32)p->nOp)>addr 
4cd0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
4ce0: 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20  dr].p1 = val;.  
4cf0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
4d00: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
4d10: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f  he P2 operand fo
4d20: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
4d30: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
4d40: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4d50: 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ful for setting 
4d60: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
4d70: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
4d80: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
4d90: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
4da0: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
4db0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
4dc0: 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f   if( ((u32)p->nO
4dd0: 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70  p)>addr ){.    p
4de0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d  ->aOp[addr].p2 =
4df0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
4e00: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
4e10: 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70  lue of the P3 op
4e20: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
4e30: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
4e40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4e50: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64  3VdbeChangeP3(Vd
4e60: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
4e70: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73   int val){.  ass
4e80: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69  ert( p!=0 );.  i
4e90: 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29  f( ((u32)p->nOp)
4ea0: 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >addr ){.    p->
4eb0: 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76  aOp[addr].p3 = v
4ec0: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
4ed0: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
4ee0: 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72  e of the P5 oper
4ef0: 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  and for the most
4f00: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64   recently.** add
4f10: 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  ed operation..*/
4f20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4f30: 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a  eChangeP5(Vdbe *
4f40: 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73  p, u8 val){.  as
4f50: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
4f60: 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20  if( p->aOp ){.  
4f70: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
4f80: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70  >0 );.    p->aOp
4f90: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20  [p->nOp-1].p5 = 
4fa0: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
4fb0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20  * Change the P2 
4fc0: 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72  operand of instr
4fd0: 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74  uction addr so t
4fe0: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
4ff0: 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20  .** the address 
5000: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
5010: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f  ruction to be co
5020: 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ded..*/.void sql
5030: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
5040: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
5050: 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  dr){.  sqlite3Vd
5060: 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64  beChangeP2(p, ad
5070: 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 70  dr, p->nOp);.  p
5080: 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65 64  ->pParse->iFixed
5090: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  Op = p->nOp - 1;
50a0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
50b0: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
50c0: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
50d0: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
50e0: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
50f0: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
5100: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
5110: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
5120: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
5130: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
5140: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
5150: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
5160: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20  f( ALWAYS(pDef) 
5170: 26 26 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  && (pDef->funcFl
5180: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
5190: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
51a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
51b0: 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a  (db, pDef);.  }.
51c0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  }..static void v
51d0: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
51e0: 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20  qlite3 *, Op *, 
51f0: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  int);../*.** Del
5200: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69  ete a P4 value i
5210: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
5220: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
5230: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
5240: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
5250: 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20   *p4){.  if( p4 
5260: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
5270: 62 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28  b );.    switch(
5280: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20   p4type ){.     
5290: 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20   case P4_REAL:. 
52a0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
52b0: 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  64:.      case P
52c0: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20  4_DYNAMIC:.     
52d0: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
52e0: 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y: {.        sql
52f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5300: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
5310: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5320: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
5330: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
5340: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
5350: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79  ==0 ) sqlite3Key
5360: 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e  InfoUnref((KeyIn
5370: 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  fo*)p4);.       
5380: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5390: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50        case P4_MP
53a0: 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 20  RINTF: {.       
53b0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
53c0: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
53d0: 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20 20  e3_free(p4);.   
53e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
53f0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
5400: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
5410: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
5420: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28  alFunction(db, (
5430: 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20  FuncDef*)p4);.  
5440: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5450: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5460: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
5470: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
5480: 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20  sFreed==0 ){.   
5490: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
54a0: 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33  lueFree((sqlite3
54b0: 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20  _value*)p4);.   
54c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
54d0: 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28        Mem *p = (
54e0: 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  Mem*)p4;.       
54f0: 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c     if( p->szMall
5500: 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  oc ) sqlite3DbFr
5510: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
5520: 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  c);.          sq
5530: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5540: 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
5550: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5560: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5570: 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20  P4_VTAB : {.    
5580: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
5590: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
55a0: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28  lite3VtabUnlock(
55b0: 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20  (VTable *)p4);. 
55c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
55d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
55e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
55f0: 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  e space allocate
5600: 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e  d for aOp and an
5610: 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f  y p4 values allo
5620: 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a  cated for the.**
5630: 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e   opcodes contain
5640: 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f  ed within. If aO
5650: 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74  p is not NULL it
5660: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63   is assumed to c
5670: 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65  ontain .** nOp e
5680: 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74  ntries. .*/.stat
5690: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
56a0: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
56b0: 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e  *db, Op *aOp, in
56c0: 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f  t nOp){.  if( aO
56d0: 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  p ){.    Op *pOp
56e0: 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f  ;.    for(pOp=aO
56f0: 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d  p; pOp<&aOp[nOp]
5700: 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ; pOp++){.      
5710: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
5720: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
5730: 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
5740: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
5750: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20  _COMMENTS.      
5760: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5770: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
5780: 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20  ;.#endif     .  
5790: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
57a0: 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29  3DbFree(db, aOp)
57b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20  ;.}../*.** Link 
57c0: 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f  the SubProgram o
57d0: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
57e0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
57f0: 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ent into the lin
5800: 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56  ked.** list at V
5810: 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e  dbe.pSubProgram.
5820: 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75 73   This list is us
5830: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c  ed to delete all
5840: 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20   sub-program.** 
5850: 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65  objects when the
5860: 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72   VM is no longer
5870: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f   required..*/.vo
5880: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  id sqlite3VdbeLi
5890: 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62  nkSubProgram(Vdb
58a0: 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f  e *pVdbe, SubPro
58b0: 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70  gram *p){.  p->p
58c0: 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50  Next = pVdbe->pP
58d0: 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d  rogram;.  pVdbe-
58e0: 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d  >pProgram = p;.}
58f0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
5900: 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64  he opcode at add
5910: 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a  r into OP_Noop.*
5920: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5930: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56  beChangeToNoop(V
5940: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
5950: 29 7b 0a 20 20 69 66 28 20 61 64 64 72 3c 70 2d  ){.  if( addr<p-
5960: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65  >nOp ){.    Vdbe
5970: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
5980: 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c  p[addr];.    sql
5990: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
59a0: 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62 2c  ;.    freeP4(db,
59b0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
59c0: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65  p->p4.p);.    me
59d0: 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a  mset(pOp, 0, siz
59e0: 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20  eof(pOp[0]));.  
59f0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
5a00: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 66 28  OP_Noop;.    if(
5a10: 20 61 64 64 72 3d 3d 70 2d 3e 6e 4f 70 2d 31 20   addr==p->nOp-1 
5a20: 29 20 70 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d 0a  ) p->nOp--;.  }.
5a30: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
5a40: 6c 61 73 74 20 6f 70 63 6f 64 65 20 69 73 20 22  last opcode is "
5a50: 6f 70 22 20 61 6e 64 20 69 74 20 69 73 20 6e 6f  op" and it is no
5a60: 74 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61  t a jump destina
5a70: 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65  tion,.** then re
5a80: 6d 6f 76 65 20 69 74 2e 20 20 52 65 74 75 72 6e  move it.  Return
5a90: 20 74 72 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c   true if and onl
5aa0: 79 20 69 66 20 61 6e 20 6f 70 63 6f 64 65 20 77  y if an opcode w
5ab0: 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  as removed..*/.i
5ac0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  nt sqlite3VdbeDe
5ad0: 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28  letePriorOpcode(
5ae0: 56 64 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b  Vdbe *p, u8 op){
5af0: 0a 20 20 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31  .  if( (p->nOp-1
5b00: 29 3e 28 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46  )>(p->pParse->iF
5b10: 69 78 65 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f  ixedOp) && p->aO
5b20: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f  p[p->nOp-1].opco
5b30: 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71  de==op ){.    sq
5b40: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
5b50: 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d  oNoop(p, p->nOp-
5b60: 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  1);.    return 1
5b70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
5b80: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
5b90: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
5ba0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
5bb0: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
5bc0: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
5bd0: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
5be0: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
5bf0: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
5c00: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
5c10: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
5c20: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
5c30: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
5c40: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
5c50: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
5c60: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
5c70: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
5c80: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
5c90: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20  e P4 operand is 
5ca0: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
5cb0: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
5cc0: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
5cd0: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
5ce0: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
5cf0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
5d00: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
5d10: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20  n==0 means copy 
5d20: 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20  bytes of zP4 up 
5d30: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  to and including
5d40: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75   the.** first nu
5d50: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30  ll byte.  If n>0
5d60: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62   then copy n+1 b
5d70: 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20  ytes of zP4..** 
5d80: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
5d90: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
5da0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
5db0: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
5dc0: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
5dd0: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
5de0: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
5df0: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
5e00: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
5e10: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
5e20: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
5e30: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
5e40: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
5e50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
5e60: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
5e70: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
5e80: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
5e90: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
5ea0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5eb0: 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c  hangeP4(Vdbe *p,
5ec0: 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74   int addr, const
5ed0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20   char *zP4, int 
5ee0: 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  n){.  Op *pOp;. 
5ef0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
5f00: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
5f10: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
5f20: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
5f30: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
5f40: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
5f50: 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
5f60: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
5f70: 69 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29  if( n!=P4_VTAB )
5f80: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64  {.      freeP4(d
5f90: 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  b, n, (void*)*(c
5fa0: 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20  har**)&zP4);.   
5fb0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   }.    return;. 
5fc0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
5fd0: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
5fe0: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
5ff0: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
6000: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
6010: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
6020: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
6030: 72 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  r];.  assert( pO
6040: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f  p->p4type==P4_NO
6050: 54 55 53 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  TUSED.       || 
6060: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
6070: 49 4e 54 33 32 0a 20 20 20 20 20 20 20 7c 7c 20  INT32.       || 
6080: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
6090: 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 66 72 65  KEYINFO );.  fre
60a0: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
60b0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
60c0: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
60d0: 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e  ;.  if( n==P4_IN
60e0: 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  T32 ){.    /* No
60f0: 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73  te: this cast is
6100: 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74   safe, because t
6110: 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70  he origin data p
6120: 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a  oint was an int.
6130: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20      ** that was 
6140: 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74  cast to a (const
6150: 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20   char *). */.   
6160: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c   pOp->p4.i = SQL
6170: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a  ITE_PTR_TO_INT(z
6180: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
6190: 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b  type = P4_INT32;
61a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34  .  }else if( zP4
61b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  ==0 ){.    pOp->
61c0: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f  p4.p = 0;.    pO
61d0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
61e0: 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  OTUSED;.  }else 
61f0: 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46  if( n==P4_KEYINF
6200: 4f 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  O ){.    pOp->p4
6210: 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b  .p = (void*)zP4;
6220: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
6230: 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P4_KEYINFO;. 
6240: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
6250: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70  _VTAB ){.    pOp
6260: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
6270: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
6280: 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a  type = P4_VTAB;.
6290: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c      sqlite3VtabL
62a0: 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50  ock((VTable *)zP
62b0: 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  4);.    assert( 
62c0: 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d  ((VTable *)zP4)-
62d0: 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20  >db==p->db );.  
62e0: 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b  }else if( n<0 ){
62f0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
6300: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
6310: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28   pOp->p4type = (
6320: 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20  signed char)n;. 
6330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
6340: 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74  n==0 ) n = sqlit
6350: 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b  e3Strlen30(zP4);
6360: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d  .    pOp->p4.z =
6370: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
6380: 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29  p(p->db, zP4, n)
6390: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
63a0: 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a  e = P4_DYNAMIC;.
63b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
63c0: 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d   the P4 on the m
63d0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
63e0: 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65  ed opcode to the
63f0: 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65   KeyInfo for the
6400: 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e  .** index given.
6410: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6420: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
6430: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6440: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
6450: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
6460: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
6470: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
6480: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
6490: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
64a0: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
64b0: 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
64c0: 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
64d0: 2c 20 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20  , pIdx),.       
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
64f0: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23  4_KEYINFO);.}..#
6500: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6510: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
6520: 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ENTS./*.** Chang
6530: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
6540: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
6550: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
6560: 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73  tion.  Or.** ins
6570: 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20  ert a No-op and 
6580: 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  add the comment 
6590: 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74  to that new inst
65a0: 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a  ruction.  This.*
65b0: 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65  * makes the code
65c0: 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20   easier to read 
65d0: 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67  during debugging
65e0: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20  .  None of this 
65f0: 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20  happens.** in a 
6600: 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64  production build
6610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6620: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64   vdbeVComment(Vd
6630: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
6640: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c  r *zFormat, va_l
6650: 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72  ist ap){.  asser
6660: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
6670: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
6680: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
6690: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
66a0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
66b0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
66c0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
66d0: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73  p->nOp ){.    as
66e0: 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a  sert( p->aOp );.
66f0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6700: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b  e(p->db, p->aOp[
6710: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
6720: 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  nt);.    p->aOp[
6730: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
6740: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  nt = sqlite3VMPr
6750: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
6760: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a  mat, ap);.  }.}.
6770: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6780: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
6790: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
67a0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
67b0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
67c0: 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72  p ){.    va_star
67d0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
67e0: 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74      vdbeVComment
67f0: 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  (p, zFormat, ap)
6800: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
6810: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
6820: 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ite3VdbeNoopComm
6830: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
6840: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
6850: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
6860: 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  t ap;.  if( p ){
6870: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6880: 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f  AddOp0(p, OP_Noo
6890: 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  p);.    va_start
68a0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
68b0: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
68c0: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
68d0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
68e0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f  .  }.}.#endif  /
68f0: 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  * NDEBUG */..#if
6900: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
6910: 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53  COVERAGE./*.** S
6920: 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 66 20  et the value if 
6930: 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65  the iSrcLine fie
6940: 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ld for the previ
6950: 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ously coded inst
6960: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
6970: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c   sqlite3VdbeSetL
6980: 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a  ineNumber(Vdbe *
6990: 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20  v, int iLine){. 
69a0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
69b0: 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e  p(v,-1)->iSrcLin
69c0: 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e  e = iLine;.}.#en
69d0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44  dif /* SQLITE_VD
69e0: 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a  BE_COVERAGE */..
69f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6a00: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69   opcode for a gi
6a10: 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66  ven address.  If
6a20: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20   the address is 
6a30: 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  -1, then.** retu
6a40: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
6a50: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70  ntly inserted op
6a60: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  code..**.** If a
6a70: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6a80: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
6a90: 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74  urred prior to t
6aa0: 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68  he calling of th
6ab0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74  is.** routine, t
6ac0: 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
6ad0: 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20   a dummy VdbeOp 
6ae0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
6af0: 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a  .  That opcode.*
6b00: 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75  * is readable bu
6b10: 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20  t not writable, 
6b20: 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73  though it is cas
6b30: 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20  t to a writable 
6b40: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
6b50: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20  turn of a dummy 
6b60: 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68  opcode allows th
6b70: 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e  e call to contin
6b80: 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a  ue functioning.*
6b90: 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66  * after an OOM f
6ba0: 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76  ault without hav
6bb0: 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20  ing to check to 
6bc0: 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72  see if the retur
6bd0: 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20  n from .** this 
6be0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c  routine is a val
6bf0: 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74  id pointer.  But
6c00: 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d   because the dum
6c10: 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a  my.opcode is 0,.
6c20: 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65  ** dummy will ne
6c30: 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74  ver be written t
6c40: 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69  o.  This is veri
6c50: 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73  fied by code ins
6c60: 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62  pection and.** b
6c70: 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56  y running with V
6c80: 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65  algrind..*/.Vdbe
6c90: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
6ca0: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
6cb0: 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38  t addr){.  /* C8
6cc0: 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74  9 specifies that
6cd0: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64   the constant "d
6ce0: 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e  ummy" will be in
6cf0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
6d00: 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69  .  ** zeros, whi
6d10: 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20  ch is correct.  
6d20: 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61  MSVC generates a
6d30: 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74   warning, nevert
6d40: 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61  heless. */.  sta
6d50: 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79  tic VdbeOp dummy
6d60: 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65  ;  /* Ignore the
6d70: 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62   MSVC warning ab
6d80: 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a  out no initializ
6d90: 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
6da0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
6db0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
6dc0: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
6dd0: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
6de0: 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
6df0: 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64  ( (addr>=0 && ad
6e00: 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d  dr<p->nOp) || p-
6e10: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
6e20: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  d );.  if( p->db
6e30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6e40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64  {.    return (Vd
6e50: 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20  beOp*)&dummy;.  
6e60: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
6e70: 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  n &p->aOp[addr];
6e80: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69  .  }.}..#if defi
6e90: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
6ea0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
6eb0: 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  TS)./*.** Return
6ec0: 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
6ed0: 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
6ee0: 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
6ef0: 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a  he opcode pOp.**
6f00: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63   determined by c
6f10: 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73  haracter c..*/.s
6f20: 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 6c  tatic int transl
6f30: 61 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f 6e  ateP(char c, con
6f40: 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69  st Op *pOp){.  i
6f50: 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74 75  f( c=='1' ) retu
6f60: 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66  rn pOp->p1;.  if
6f70: 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75 72  ( c=='2' ) retur
6f80: 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28  n pOp->p2;.  if(
6f90: 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72 6e   c=='3' ) return
6fa0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20   pOp->p3;.  if( 
6fb0: 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e 20  c=='4' ) return 
6fc0: 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74  pOp->p4.i;.  ret
6fd0: 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a  urn pOp->p5;.}..
6fe0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
6ff0: 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 22  string for the "
7000: 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f  comment" field o
7010: 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65 20  f a VDBE opcode 
7020: 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  listing..**.** T
7030: 68 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69 65  he Synopsis: fie
7040: 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69  ld in comments i
7050: 6e 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75  n the vdbe.c sou
7060: 72 63 65 20 66 69 6c 65 20 67 65 74 73 20 63 6f  rce file gets co
7070: 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e  nverted.** to an
7080: 20 65 78 74 72 61 20 73 74 72 69 6e 67 20 74 68   extra string th
7090: 61 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  at is appended t
70a0: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70 63  o the sqlite3Opc
70b0: 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74  odeName().  In t
70c0: 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66  he.** absence of
70d0: 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c   other comments,
70e0: 20 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20 62   this synopsis b
70f0: 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65  ecomes the comme
7100: 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65  nt on the opcode
7110: 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c  ..** Some transl
7120: 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a  ation occurs:.**
7130: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20 20  .**       "PX"  
7140: 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a      ->  "r[X]".*
7150: 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 22 20  *       "PX@PY" 
7160: 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d    ->  "r[X..X+Y-
7170: 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20 69  1]"  or "r[x]" i
7180: 66 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a  f y is 0 or 1.**
7190: 20 20 20 20 20 20 20 22 50 58 40 50 59 2b 31 22         "PX@PY+1"
71a0: 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22   ->  "r[X..X+Y]"
71b0: 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66      or "r[x]" if
71c0: 20 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20 20   y is 0.**      
71d0: 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22   "PY..PY"  ->  "
71e0: 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72  r[X..Y]"      or
71f0: 20 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a   "r[x]" if y<=x.
7200: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69  */.static int di
7210: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20  splayComment(.  
7220: 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20  const Op *pOp,  
7230: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
7240: 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64   to be commented
7250: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
7260: 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76   *zP4,   /* Prev
7270: 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20  iously obtained 
7280: 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a  value for P4 */.
7290: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20    char *zTemp,  
72a0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
72b0: 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69  sult here */.  i
72c0: 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20  nt nTemp        
72d0: 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c    /* Space avail
72e0: 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20  able in zTemp[] 
72f0: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
7300: 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63  ar *zOpName;.  c
7310: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f  onst char *zSyno
7320: 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e  psis;.  int nOpN
7330: 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  ame;.  int ii, j
7340: 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73  j;.  zOpName = s
7350: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
7360: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20  (pOp->opcode);. 
7370: 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74   nOpName = sqlit
7380: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61  e3Strlen30(zOpNa
7390: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61  me);.  if( zOpNa
73a0: 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b  me[nOpName+1] ){
73b0: 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d  .    int seenCom
73c0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63   = 0;.    char c
73d0: 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20  ;.    zSynopsis 
73e0: 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70  = zOpName += nOp
73f0: 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f  Name + 1;.    fo
7400: 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54  r(ii=jj=0; jj<nT
7410: 65 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53  emp-1 && (c = zS
7420: 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b  ynopsis[ii])!=0;
7430: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66   ii++){.      if
7440: 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20  ( c=='P' ){.    
7450: 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69      c = zSynopsi
7460: 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20  s[++ii];.       
7470: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20   if( c=='4' ){. 
7480: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7490: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
74a0: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
74b0: 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20  s", zP4);.      
74c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
74d0: 58 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  X' ){.          
74e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
74f0: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
7500: 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  +jj, "%s", pOp->
7510: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20  zComment);.     
7520: 20 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31       seenCom = 1
7530: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7540: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76  .          int v
7550: 31 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63  1 = translateP(c
7560: 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  , pOp);.        
7570: 20 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20    int v2;.      
7580: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7590: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
75a0: 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76  Temp+jj, "%d", v
75b0: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
75c0: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
75d0: 73 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20  sis+ii+1, "@P", 
75e0: 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
75f0: 20 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20       ii += 3;.  
7600: 20 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20            jj += 
7610: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7620: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20  zTemp+jj);.     
7630: 20 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e         v2 = tran
7640: 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73  slateP(zSynopsis
7650: 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20  [ii], pOp);.    
7660: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e          if( strn
7670: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69  cmp(zSynopsis+ii
7680: 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b  +1,"+1",2)==0 ){
7690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
76a0: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
76b0: 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20        v2++;.    
76c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
76d0: 20 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29        if( v2>1 )
76e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
76f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7700: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
7710: 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b  +jj, "..%d", v1+
7720: 76 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20  v2-1);.         
7730: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
7740: 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
7750: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
7760: 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26   "..P3", 4)==0 &
7770: 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a  & pOp->p3==0 ){.
7780: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
7790: 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 4;.          }
77a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
77b0: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
77c0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
77d0: 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  j);.      }else{
77e0: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a  .        zTemp[j
77f0: 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20  j++] = c;.      
7800: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
7810: 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e  !seenCom && jj<n
7820: 54 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a  Temp-5 && pOp->z
7830: 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  Comment ){.     
7840: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7850: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
7860: 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f  p+jj, "; %s", pO
7870: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  p->zComment);.  
7880: 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65      jj += sqlite
7890: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b  3Strlen30(zTemp+
78a0: 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  jj);.    }.    i
78b0: 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54  f( jj<nTemp ) zT
78c0: 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d  emp[jj] = 0;.  }
78d0: 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43  else if( pOp->zC
78e0: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71  omment ){.    sq
78f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7900: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73  Temp, zTemp, "%s
7910: 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  ", pOp->zComment
7920: 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69  );.    jj = sqli
7930: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
7940: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
7950: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
7960: 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20     jj = 0;.  }. 
7970: 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65   return jj;.}.#e
7980: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
7990: 45 42 55 47 20 2a 2f 0a 0a 0a 23 69 66 20 21 64  EBUG */...#if !d
79a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
79b0: 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21  IT_EXPLAIN) || !
79c0: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
79d0: 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65  \.     || define
79e0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
79f0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
7a00: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43  E_DEBUG)./*.** C
7a10: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
7a20: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
7a30: 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20  he P4 parameter 
7a40: 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a  for an opcode..*
7a50: 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20  * Use zTemp for 
7a60: 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d  any required tem
7a70: 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70  porary buffer sp
7a80: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ace..*/.static c
7a90: 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f  har *displayP4(O
7aa0: 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54  p *pOp, char *zT
7ab0: 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b  emp, int nTemp){
7ac0: 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a  .  char *zP4 = z
7ad0: 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20  Temp;.  assert( 
7ae0: 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73  nTemp>=20 );.  s
7af0: 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79  witch( pOp->p4ty
7b00: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  pe ){.    case P
7b10: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
7b20: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
7b30: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
7b40: 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
7b50: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61  KeyInfo;.      a
7b60: 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
7b70: 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
7b80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
7b90: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
7ba0: 7a 54 65 6d 70 2c 20 22 6b 28 25 64 22 2c 20 70  zTemp, "k(%d", p
7bb0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29  KeyInfo->nField)
7bc0: 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c 69  ;.      i = sqli
7bd0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
7be0: 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  p);.      for(j=
7bf0: 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  0; j<pKeyInfo->n
7c00: 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Field; j++){.   
7c10: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
7c20: 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  oll = pKeyInfo->
7c30: 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
7c40: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
7c50: 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43  oll = pColl ? pC
7c60: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e 69  oll->zName : "ni
7c70: 6c 22 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  l";.        int 
7c80: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
7c90: 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  n30(zColl);.    
7ca0: 20 20 20 20 69 66 28 20 6e 3d 3d 36 20 26 26 20      if( n==6 && 
7cb0: 6d 65 6d 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49  memcmp(zColl,"BI
7cc0: 4e 41 52 59 22 2c 36 29 3d 3d 30 20 29 7b 0a 20  NARY",6)==0 ){. 
7cd0: 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d           zColl =
7ce0: 20 22 42 22 3b 0a 20 20 20 20 20 20 20 20 20 20   "B";.          
7cf0: 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  n = 1;.        }
7d00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e  .        if( i+n
7d10: 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20  >nTemp-6 ){.    
7d20: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
7d30: 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29  emp[i],",...",4)
7d40: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
7d50: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
7d60: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
7d70: 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69  = ',';.        i
7d80: 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
7d90: 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20  rtOrder[j] ){.  
7da0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
7db0: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  +] = '-';.      
7dc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63    }.        memc
7dd0: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43  py(&zTemp[i], zC
7de0: 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20  oll, n+1);.     
7df0: 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20     i += n;.     
7e00: 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69   }.      zTemp[i
7e10: 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20  ++] = ')';.     
7e20: 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20   zTemp[i] = 0;. 
7e30: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e       assert( i<n
7e40: 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72  Temp );.      br
7e50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7e60: 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20  ase P4_COLLSEQ: 
7e70: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
7e80: 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34  *pColl = pOp->p4
7e90: 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71  .pColl;.      sq
7ea0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7eb0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25  Temp, zTemp, "(%
7ec0: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a  .20s)", pColl->z
7ed0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Name);.      bre
7ee0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7ef0: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
7f00: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
7f10: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pDef = pOp->p4.p
7f20: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
7f30: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7f40: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25  mp, zTemp, "%s(%
7f50: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  d)", pDef->zName
7f60: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20  , pDef->nArg);. 
7f70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7f80: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  }.    case P4_IN
7f90: 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  T64: {.      sql
7fa0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7fb0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
7fc0: 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36  d", *pOp->p4.pI6
7fd0: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
7fe0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7ff0: 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20  P4_INT32: {.    
8000: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8010: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
8020: 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69   "%d", pOp->p4.i
8030: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8040: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
8050: 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  4_REAL: {.      
8060: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8070: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
8080: 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34  %.16g", *pOp->p4
8090: 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62  .pReal);.      b
80a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
80b0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
80c0: 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d       Mem *pMem =
80d0: 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20   pOp->p4.pMem;. 
80e0: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66       if( pMem->f
80f0: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
8100: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
8110: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pMem->z;.      }
8120: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
8130: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
8140: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8150: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8160: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
8170: 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20   pMem->u.i);.   
8180: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
8190: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  m->flags & MEM_R
81a0: 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eal ){.        s
81b0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
81c0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
81d0: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72  .16g", pMem->u.r
81e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
81f0: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
8200: 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20   MEM_Null ){.   
8210: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
8220: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
8230: 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  mp, "NULL");.   
8240: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8250: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
8260: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
8270: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   );.        zP4 
8280: 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20  = "(blob)";.    
8290: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
82a0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
82b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
82c0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
82d0: 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20   P4_VTAB: {.    
82e0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
82f0: 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e  pVtab = pOp->p4.
8300: 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20  pVtab->pVtab;.  
8310: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8320: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
8330: 70 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56  p, "vtab:%p", pV
8340: 74 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tab);.      brea
8350: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
8360: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
8370: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71  RRAY: {.      sq
8380: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8390: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e  Temp, zTemp, "in
83a0: 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20  tarray");.      
83b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
83c0: 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47   case P4_SUBPROG
83d0: 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAM: {.      sql
83e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
83f0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f  emp, zTemp, "pro
8400: 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72  gram");.      br
8410: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8420: 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20  ase P4_ADVANCE: 
8430: 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  {.      zTemp[0]
8440: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
8450: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
8460: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50  ault: {.      zP
8470: 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  4 = pOp->p4.z;. 
8480: 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20       if( zP4==0 
8490: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
84a0: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   zTemp;.        
84b0: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
84c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
84d0: 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30    assert( zP4!=0
84e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34   );.  return zP4
84f0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
8500: 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65  * Declare to the
8510: 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42   Vdbe that the B
8520: 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64  Tree object at d
8530: 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65  b->aDb[i] is use
8540: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65  d..**.** The pre
8550: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
8560: 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e   need to know in
8570: 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d   advance the com
8580: 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20  plete set of.** 
8590: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
85a0: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  es that will be 
85b0: 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20  use.  A mask of 
85c0: 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a  these databases.
85d0: 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64  ** is maintained
85e0: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
85f0: 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61  .  The p->lockMa
8600: 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  sk value is the 
8610: 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e  subset of.** p->
8620: 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74  btreeMask of dat
8630: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
8640: 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e   require a lock.
8650: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8660: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64  VdbeUsesBtree(Vd
8670: 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20  be *p, int i){. 
8680: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
8690: 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26   i<p->db->nDb &&
86a0: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79   i<(int)sizeof(y
86b0: 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61  DbMask)*8 );.  a
86c0: 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69  ssert( i<(int)si
86d0: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
86e0: 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b  k)*8 );.  DbMask
86f0: 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  Set(p->btreeMask
8700: 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31  , i);.  if( i!=1
8710: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
8720: 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e  Sharable(p->db->
8730: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20  aDb[i].pBt) ){. 
8740: 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e     DbMaskSet(p->
8750: 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20  lockMask, i);.  
8760: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
8770: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
8780: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
8790: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
87a0: 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  >0./*.** If SQLi
87b0: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
87c0: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
87d0: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
87e0: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
87f0: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
8800: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
8810: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
8820: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
8830: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
8840: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
8850: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
8860: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
8870: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
8880: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
8890: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
88a0: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
88b0: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
88c0: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
88d0: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
88e0: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
88f0: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
8900: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
8910: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
8920: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
8930: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
8940: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
8950: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
8960: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
8970: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
8980: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
8990: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
89a0: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
89b0: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
89c0: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
89d0: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
89e0: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
89f0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
8a00: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
8a10: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
8a20: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
8a30: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
8a40: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
8a50: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
8a60: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
8a70: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
8a80: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
8a90: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
8aa0: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
8ab0: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
8ac0: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
8ad0: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
8ae0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
8af0: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
8b00: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
8b10: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
8b20: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
8b30: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
8b40: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
8b50: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
8b60: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
8b70: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
8b80: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
8b90: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
8ba0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
8bb0: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
8bc0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
8bd0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
8be0: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
8bf0: 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  Db;.  if( DbMask
8c00: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
8c10: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
8c20: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
8c30: 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e  se */.  db = p->
8c40: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
8c50: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
8c60: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
8c70: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
8c80: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
8c90: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
8ca0: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
8cb0: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
8cc0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8cd0: 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b  3BtreeEnter(aDb[
8ce0: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
8cf0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
8d00: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8d10: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
8d20: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
8d30: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
8d40: 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74   Unlock all of t
8d50: 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f  he btrees previo
8d60: 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61  usly locked by a
8d70: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8d80: 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a  VdbeEnter()..*/.
8d90: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
8da0: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65  INLINE void vdbe
8db0: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
8dc0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
8dd0: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
8de0: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
8df0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
8e00: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
8e10: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
8e20: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
8e30: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
8e40: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
8e50: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
8e60: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
8e70: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
8e80: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
8e90: 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ave(aDb[i].pBt);
8ea0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69  .    }.  }.}.voi
8eb0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61  d sqlite3VdbeLea
8ec0: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
8ed0: 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  f( DbMaskAllZero
8ee0: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20  (p->lockMask) ) 
8ef0: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
8f00: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
8f10: 20 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d   vdbeLeave(p);.}
8f20: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
8f30: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
8f40: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
8f50: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
8f60: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
8f70: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
8f80: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
8f90: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
8fa0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
8fb0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
8fc0: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
8fd0: 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68  , Op *pOp){.  ch
8fe0: 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20  ar *zP4;.  char 
8ff0: 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72  zPtr[50];.  char
9000: 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74   zCom[100];.  st
9010: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
9020: 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64  *zFormat1 = "%4d
9030: 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25   %-13s %4d %4d %
9040: 34 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73  4d %-13s %.2X %s
9050: 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d  \n";.  if( pOut=
9060: 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f  =0 ) pOut = stdo
9070: 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70  ut;.  zP4 = disp
9080: 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c  layP4(pOp, zPtr,
9090: 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a   sizeof(zPtr));.
90a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
90b0: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
90c0: 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43  MENTS.  displayC
90d0: 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c  omment(pOp, zP4,
90e0: 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43   zCom, sizeof(zC
90f0: 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43  om));.#else.  zC
9100: 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69  om[0] = 0;.#endi
9110: 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20  f.  /* NB:  The 
9120: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
9130: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  e() function is 
9140: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63  implemented by c
9150: 6f 64 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a  ode created.  **
9160: 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65   by the mkopcode
9170: 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f  h.awk and mkopco
9180: 64 65 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20  dec.awk scripts 
9190: 77 68 69 63 68 20 65 78 74 72 61 63 74 20 74 68  which extract th
91a0: 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  e.  ** informati
91b0: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65  on from the vdbe
91c0: 2e 63 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a  .c source text *
91d0: 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74  /.  fprintf(pOut
91e0: 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20  , zFormat1, pc, 
91f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
9200: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
9210: 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20  code), pOp->p1, 
9220: 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33  pOp->p2, pOp->p3
9230: 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a  , zP4, pOp->p5,.
9240: 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a        zCom.  );.
9250: 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a    fflush(pOut);.
9260: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
9270: 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79  Release an array
9280: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
9290: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
92a0: 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61  d releaseMemArra
92b0: 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29  y(Mem *p, int N)
92c0: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29  {.  if( p && N )
92d0: 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20  {.    Mem *pEnd 
92e0: 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c  = &p[N];.    sql
92f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
9300: 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f  ;.    u8 malloc_
9310: 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  failed = db->mal
9320: 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69  locFailed;.    i
9330: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
9340: 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b  eed ){.      do{
9350: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
9360: 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  szMalloc ) sqlit
9370: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
9380: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
9390: 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45  }while( (++p)<pE
93a0: 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  nd );.      retu
93b0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  rn;.    }.    do
93c0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
93d0: 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c  (&p[1])==pEnd ||
93e0: 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64   p[0].db==p[1].d
93f0: 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  b );.      asser
9400: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  t( sqlite3VdbeCh
9410: 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73  eckMemInvariants
9420: 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  (p) );..      /*
9430: 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72   This block is r
9440: 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64  eally an inlined
9450: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
9460: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
9470: 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  e().      ** tha
9480: 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67  t takes advantag
9490: 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68  e of the fact th
94a0: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  at the memory ce
94b0: 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20  ll value is .   
94c0: 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20     ** being set 
94d0: 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65  to NULL after re
94e0: 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61  leasing any dyna
94f0: 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20  mic resources.. 
9500: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
9510: 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69   The justificati
9520: 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69  on for duplicati
9530: 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20  ng code is that 
9540: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20  according to .  
9550: 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64      ** callgrind
9560: 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20  , this causes a 
9570: 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73  certain test cas
9580: 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55  e to hit the CPU
9590: 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70   4.7 .      ** p
95a0: 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36  ercent less (x86
95b0: 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73   linux, gcc vers
95c0: 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20  ion 4.1.2, -O6) 
95d0: 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a  than if .      *
95e0: 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65  * sqlite3MemRele
95f0: 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65  ase() were calle
9600: 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74  d from here. Wit
9610: 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70  h -O2, this jump
9620: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e  s.      ** to 6.
9630: 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74  6 percent. The t
9640: 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65  est case is inse
9650: 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20  rting 1000 rows 
9660: 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20  into a table .  
9670: 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69      ** with no i
9680: 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73  ndexes using a s
9690: 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49  ingle prepared I
96a0: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c  NSERT statement,
96b0: 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a   bind() .      *
96c0: 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49  * and reset(). I
96d0: 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70  nserts are group
96e0: 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61  ed into a transa
96f0: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
9700: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9710: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41  p->flags & MEM_A
9720: 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  gg );.      test
9730: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
9740: 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20   MEM_Dyn );.    
9750: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
9760: 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65  lags & MEM_Frame
9770: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
9780: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
9790: 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 20  EM_RowSet );.   
97a0: 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26     if( p->flags&
97b0: 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e  (MEM_Agg|MEM_Dyn
97c0: 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52  |MEM_Frame|MEM_R
97d0: 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20  owSet) ){.      
97e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
97f0: 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20  Release(p);.    
9800: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
9810: 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  zMalloc ){.     
9820: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9830: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
9840: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d  ;.        p->szM
9850: 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20  alloc = 0;.     
9860: 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61   }..      p->fla
9870: 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs = MEM_Undefin
9880: 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  ed;.    }while( 
9890: 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20  (++p)<pEnd );.  
98a0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
98b0: 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ed = malloc_fail
98c0: 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed;.  }.}../*.**
98d0: 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72   Delete a VdbeFr
98e0: 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69  ame object and i
98f0: 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62  ts contents. Vdb
9900: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61  eFrame objects a
9910: 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
9920: 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61  by the OP_Progra
9930: 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69  m opcode in sqli
9940: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a  te3VdbeExec()..*
9950: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
9960: 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64  beFrameDelete(Vd
9970: 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69  beFrame *p){.  i
9980: 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65  nt i;.  Mem *aMe
9990: 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d  m = VdbeFrameMem
99a0: 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  (p);.  VdbeCurso
99b0: 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62  r **apCsr = (Vdb
99c0: 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d  eCursor **)&aMem
99d0: 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a  [p->nChildMem];.
99e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
99f0: 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b  nChildCsr; i++){
9a00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9a10: 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c  FreeCursor(p->v,
9a20: 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a   apCsr[i]);.  }.
9a30: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
9a40: 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c  y(aMem, p->nChil
9a50: 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  dMem);.  sqlite3
9a60: 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c  DbFree(p->v->db,
9a70: 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   p);.}..#ifndef 
9a80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
9a90: 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61  AIN./*.** Give a
9aa0: 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
9ab0: 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76  program in the v
9ac0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
9ad0: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
9ae0: 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ace is the same 
9af0: 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  as sqlite3VdbeEx
9b00: 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65  ec().  But inste
9b10: 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67  ad of.** running
9b20: 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e   the code, it in
9b30: 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61  vokes the callba
9b40: 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ck once for each
9b50: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
9b60: 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73   This feature is
9b70: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
9b80: 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a  nt "EXPLAIN"..**
9b90: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
9ba0: 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73  ain==1, each ins
9bb0: 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74  truction is list
9bc0: 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e  ed.  When.** p->
9bd0: 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79  explain==2, only
9be0: 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
9bf0: 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73  ructions are lis
9c00: 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a  ted and these.**
9c10: 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20   are shown in a 
9c20: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74  different format
9c30: 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  .  p->explain==2
9c40: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
9c50: 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e  ement.** EXPLAIN
9c60: 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a   QUERY PLAN..**.
9c70: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
9c80: 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65  in==1, first the
9c90: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73   main program is
9ca0: 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61   listed, then ea
9cb0: 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69  ch of.** the tri
9cc0: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
9cd0: 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20   are listed one 
9ce0: 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  by one..*/.int s
9cf0: 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a  qlite3VdbeList(.
9d00: 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20    Vdbe *p       
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9d20: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
9d30: 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20  int nRow;       
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65       /* Stop whe
9d60: 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63  n row count reac
9d70: 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e  hes this */.  in
9d80: 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20  t nSub = 0;     
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9da0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9db0: 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73  sub-vdbes seen s
9dc0: 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72  o far */.  SubPr
9dd0: 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20  ogram **apSub = 
9de0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9df0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d  /* Array of sub-
9e00: 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a  vdbes */.  Mem *
9e10: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e30: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68  /* Memory cell h
9e40: 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62  old array of sub
9e50: 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  progs */.  sqlit
9e60: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20  e3 *db = p->db; 
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e80: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
9e90: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
9ea0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ec0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9ed0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
9ee0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
9ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9f00: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
9f10: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26  .  Mem *pMem = &
9f20: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20  p->aMem[1];     
9f30: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
9f40: 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73   Mem of result s
9f50: 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
9f60: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20   p->explain );. 
9f70: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
9f80: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
9f90: 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
9fa0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
9fb0: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
9fc0: 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d  _BUSY || p->rc==
9fd0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
9fe0: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
9ff0: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
a000: 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d  es not use dynam
a010: 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20  ic strings for. 
a020: 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20   ** the result, 
a030: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
a040: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
a050: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
a060: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
a070: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
a080: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
a090: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
a0a0: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
a0b0: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
a0c0: 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70  ay(pMem, 8);.  p
a0d0: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
a0e0: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
a0f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
a100: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
a110: 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ens if a malloc(
a120: 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20  ) inside a call 
a130: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  to sqlite3_colum
a140: 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20  n_text() or.    
a150: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
a160: 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65  n_text16() faile
a170: 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d  d.  */.    db->m
a180: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
a190: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a1a0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
a1b0: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
a1c0: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
a1d0: 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c  ws reaches nRow,
a1e0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a   that means the.
a1f0: 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73    ** listing has
a200: 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71   finished and sq
a210: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f  lite3_step() sho
a220: 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  uld return SQLIT
a230: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f  E_DONE..  ** nRo
a240: 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  w is the sum of 
a250: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
a260: 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70  ws in the main p
a270: 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a  rogram, plus.  *
a280: 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  * the sum of the
a290: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
a2a0: 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73  in all trigger s
a2b0: 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75  ubprograms encou
a2c0: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66  ntered.  ** so f
a2d0: 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61  ar.  The nRow va
a2e0: 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  lue will increas
a2f0: 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72  e as new trigger
a300: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
a310: 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  .  ** encountere
a320: 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c  d, but p->pc wil
a330: 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74  l eventually cat
a340: 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20  ch up to nRow.. 
a350: 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e   */.  nRow = p->
a360: 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78  nOp;.  if( p->ex
a370: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
a380: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d  /* The first 8 m
a390: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20  emory cells are 
a3a0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73  used for the res
a3b0: 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20  ult set.  So we 
a3c0: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d  will.    ** comm
a3d0: 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63  andeer the 9th c
a3e0: 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74  ell to use as st
a3f0: 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72  orage for an arr
a400: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20  ay of pointers. 
a410: 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72     ** to trigger
a420: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54   subprograms.  T
a430: 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61  he VDBE is guara
a440: 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74  nteed to have at
a450: 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20   least 9.    ** 
a460: 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61  cells.  */.    a
a470: 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39  ssert( p->nMem>9
a480: 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26   );.    pSub = &
a490: 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20  p->aMem[9];.    
a4a0: 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26  if( pSub->flags&
a4b0: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
a4c0: 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73    /* On the firs
a4d0: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
a4e0: 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77  3_step(), pSub w
a4f0: 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e  ill hold a NULL.
a500: 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a    It is.      **
a510: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
a520: 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34  a BLOB by the P4
a530: 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63  _SUBPROGRAM proc
a540: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c  essing logic bel
a550: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62  ow */.      nSub
a560: 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f   = pSub->n/sizeo
a570: 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20  f(Vdbe*);.      
a580: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
a590: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
a5a0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
a5b0: 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b  0; i<nSub; i++){
a5c0: 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61  .      nRow += a
a5d0: 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[i]->nOp;.  
a5e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20    }.  }..  do{. 
a5f0: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
a600: 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77    }while( i<nRow
a610: 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   && p->explain==
a620: 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2 && p->aOp[i].o
a630: 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69  pcode!=OP_Explai
a640: 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52  n );.  if( i>=nR
a650: 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ow ){.    p->rc 
a660: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
a670: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
a680: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  E;.  }else if( d
a690: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
a6a0: 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ted ){.    p->rc
a6b0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
a6c0: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
a6d0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
a6e0: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
a6f0: 28 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  (p, sqlite3ErrSt
a700: 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c  r(p->rc));.  }el
a710: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50  se{.    char *zP
a720: 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  4;.    Op *pOp;.
a730: 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70      if( i<p->nOp
a740: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
a750: 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d   output line num
a760: 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  ber is small eno
a770: 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20  ugh that we are 
a780: 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20  still in the.   
a790: 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72     ** main progr
a7a0: 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70  am. */.      pOp
a7b0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
a7c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a7d0: 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e  /* We are curren
a7e0: 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70  tly listing subp
a7f0: 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65  rograms.  Figure
a800: 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61   out which one a
a810: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b  nd.      ** pick
a820: 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69   up the appropri
a830: 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20  ate opcode. */. 
a840: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
a850: 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20    i -= p->nOp;. 
a860: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e       for(j=0; i>
a870: 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20  =apSub[j]->nOp; 
a880: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20  j++){.        i 
a890: 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  -= apSub[j]->nOp
a8a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a8b0: 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d  pOp = &apSub[j]-
a8c0: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aOp[i];.    }. 
a8d0: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
a8e0: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d  n==1 ){.      pM
a8f0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
a900: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
a910: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a930: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
a940: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
a950: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
a960: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
a970: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
a980: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
a990: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
a9a0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
a9b0: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
a9c0: 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64  pcode); /* Opcod
a9d0: 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
a9e0: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
a9f0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
aa00: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
aa10: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
aa20: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
aa30: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
aa40: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  pMem++;..      /
aa50: 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f  * When an OP_Pro
aa60: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65  gram opcode is e
aa70: 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e  ncounter (the on
aa80: 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68  ly opcode that h
aa90: 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34  as.      ** a P4
aaa0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75  _SUBPROGRAM argu
aab0: 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68  ment), expand th
aac0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  e size of the ar
aad0: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
aae0: 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74  ms.      ** kept
aaf0: 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a   in p->aMem[9].z
ab00: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77   to hold the new
ab10: 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d   program - assum
ab20: 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67  ing this subprog
ab30: 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ram.      ** has
ab40: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
ab50: 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f  n seen..      */
ab60: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
ab70: 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52  p4type==P4_SUBPR
ab80: 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20  OGRAM ){.       
ab90: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53   int nByte = (nS
aba0: 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62  ub+1)*sizeof(Sub
abb0: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
abc0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
abd0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75    for(j=0; j<nSu
abe0: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  b; j++){.       
abf0: 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d     if( apSub[j]=
ac00: 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61  =pOp->p4.pProgra
ac10: 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
ac20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
ac30: 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49   j==nSub && SQLI
ac40: 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64  TE_OK==sqlite3Vd
ac50: 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20  beMemGrow(pSub, 
ac60: 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20  nByte, nSub!=0) 
ac70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  ){.          apS
ac80: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
ac90: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
aca0: 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75         apSub[nSu
acb0: 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  b++] = pOp->p4.p
acc0: 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20  Program;.       
acd0: 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c     pSub->flags |
ace0: 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20  = MEM_Blob;.    
acf0: 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20        pSub->n = 
ad00: 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50  nSub*sizeof(SubP
ad10: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
ad20: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ad30: 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  }..    pMem->fla
ad40: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
ad50: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
ad60: 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20  p->p1;          
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad80: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P1 */.    pMe
ad90: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
ada0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
adb0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
adc0: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20   pOp->p2;       
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ade0: 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20     /* P2 */.    
adf0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
ae00: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
ae10: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
ae20: 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20  i = pOp->p3;    
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae40: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
ae50: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
ae60: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
ae70: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
ae80: 28 70 4d 65 6d 2c 20 33 32 29 20 29 7b 20 2f 2a  (pMem, 32) ){ /*
ae90: 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73   P4 */.      ass
aea0: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
aeb0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
aec0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
aed0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
aee0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
aef0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
af00: 0a 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c  .    zP4 = displ
af10: 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP4(pOp, pMem->
af20: 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20  z, 32);.    if( 
af30: 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a  zP4!=pMem->z ){.
af40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
af50: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
af60: 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45   zP4, -1, SQLITE
af70: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
af80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
af90: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
afa0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
afb0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
afc0: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
afd0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
afe0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d  LITE_UTF8;.    }
aff0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
b000: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
b010: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
b020: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
b030: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
b040: 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20  em, 4) ){.      
b050: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
b060: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
b070: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b080: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
b090: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
b0a0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
b0b0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
b0c0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20    pMem->n = 2;. 
b0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
b0e0: 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a  rintf(3, pMem->z
b0f0: 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70  , "%.2x", pOp->p
b100: 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20  5);   /* P5 */. 
b110: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
b120: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
b130: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23      pMem++;.  .#
b140: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
b150: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
b160: 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 73  ENTS.      if( s
b170: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
b180: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
b190: 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20  , 500) ){.      
b1a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
b1b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
b1c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b1d0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
b1e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
b1f0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
b200: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
b210: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70    pMem->n = disp
b220: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
b230: 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30  zP4, pMem->z, 50
b240: 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0);.      pMem->
b250: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
b260: 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70  8;.#else.      p
b270: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
b280: 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  _Null;          
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b2a0: 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69  Comment */.#endi
b2b0: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  f.    }..    p->
b2c0: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
b2d0: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
b2e0: 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c  );.    p->pResul
b2f0: 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  tSet = &p->aMem[
b300: 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  1];.    p->rc = 
b310: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
b320: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
b330: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b340: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
b350: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
b360: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
b370: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
b380: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
b390: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
b3a0: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
b3b0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
b3c0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
b3d0: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63  ql(Vdbe *p){.  c
b3e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30  onst char *z = 0
b3f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20  ;.  if( p->zSql 
b400: 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53  ){.    z = p->zS
b410: 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ql;.  }else if( 
b420: 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20  p->nOp>=1 ){.   
b430: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70   const VdbeOp *p
b440: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
b450: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
b460: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
b470: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
b480: 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e  .      z = pOp->
b490: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c  p4.z;.      whil
b4a0: 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
b4b0: 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
b4c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29   }.  }.  if( z )
b4d0: 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25   printf("SQL: [%
b4e0: 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e  s]\n", z);.}.#en
b4f0: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
b500: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
b510: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
b520: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
b530: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69  TRACE)./*.** Pri
b540: 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65  nt an IOTRACE me
b550: 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51  ssage showing SQ
b560: 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f  L content..*/.vo
b570: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f  id sqlite3VdbeIO
b580: 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70  TraceSql(Vdbe *p
b590: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
b5a0: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
b5b0: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69  *pOp;.  if( sqli
b5c0: 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20  te3IoTrace==0 ) 
b5d0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f  return;.  if( nO
b5e0: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
b5f0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
b600: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
b610: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
b620: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
b630: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
b640: 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a    char z[1000];.
b650: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
b660: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
b670: 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  z, "%s", pOp->p4
b680: 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  .z);.    for(i=0
b690: 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ; sqlite3Isspace
b6a0: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
b6b0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
b6c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
b6d0: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
b6e0: 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  (z[i]) ){.      
b6f0: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20    if( z[i-1]!=' 
b700: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
b710: 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [j++] = ' ';.   
b720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
b730: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
b740: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20  +] = z[i];.     
b750: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
b760: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
b770: 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25  e3IoTrace("SQL %
b780: 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  s\n", z);.  }.}.
b790: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
b7a0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20  E_OMIT_TRACE && 
b7b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
b7c0: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TRACE */../*.** 
b7d0: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
b7e0: 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65  rom a fixed size
b7f0: 20 62 75 66 66 65 72 20 61 6e 64 20 72 65 74 75   buffer and retu
b800: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
b810: 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20 20  ** that space.  
b820: 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  If insufficient 
b830: 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
b840: 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  le, return NULL.
b850: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20  .**.** The pBuf 
b860: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
b870: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   initial value o
b880: 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63  f a pointer whic
b890: 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76  h will.** receiv
b8a0: 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79  e the new memory
b8b0: 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61  .  pBuf is norma
b8c0: 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42  lly NULL.  If pB
b8d0: 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c  uf is not.** NUL
b8e0: 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  L, it means that
b8f0: 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61   memory space ha
b900: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
b910: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61  llocated and tha
b920: 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  t.** this routin
b930: 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c  e should not all
b940: 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65  ocate any new me
b950: 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66  mory.  When pBuf
b960: 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20   is not.** NULL 
b970: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42  simply return pB
b980: 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61  uf.  Only alloca
b990: 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70  te new memory sp
b9a0: 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a  ace when pBuf.**
b9b0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
b9c0: 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d  nByte is the num
b9d0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
b9e0: 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a  space needed..**
b9f0: 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e  .** *ppFrom poin
ba00: 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20  ts to available 
ba10: 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70  space and pEnd p
ba20: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64  oints to the end
ba30: 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c   of the.** avail
ba40: 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65  able space.  Whe
ba50: 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63  n space is alloc
ba60: 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73  ated, *ppFrom is
ba70: 20 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a   advanced past.*
ba80: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
ba90: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
baa0: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20  ..**.** *pnByte 
bab0: 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20  is a counter of 
bac0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
bad0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68 61  tes of space tha
bae0: 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a  t have failed.**
baf0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49   to allocate.  I
bb00: 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75 66  f there is insuf
bb10: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e  ficient space in
bb20: 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69   *ppFrom to sati
bb30: 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65  sfy the.** reque
bb40: 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  st, then increme
bb50: 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68  nt *pnByte by th
bb60: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
bb70: 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74  request..*/.stat
bb80: 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70  ic void *allocSp
bb90: 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75  ace(.  void *pBu
bba0: 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  f,          /* W
bbb0: 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e  here return poin
bbc0: 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72  ter will be stor
bbd0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
bbe0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
bbf0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
bc00: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20  to allocate */. 
bc10: 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20   u8 **ppFrom,   
bc20: 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
bc30: 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a   Allocate from *
bc40: 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a  ppFrom */.  u8 *
bc50: 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  pEnd,           
bc60: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31   /* Pointer to 1
bc70: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65   byte past the e
bc80: 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75  nd of *ppFrom bu
bc90: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ffer */.  int *p
bca0: 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 2f  nByte          /
bcb0: 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * If allocation 
bcc0: 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20  cannot be made, 
bcd0: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74  increment *pnByt
bce0: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
bcf0: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
bd00: 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20  GNMENT(*ppFrom) 
bd10: 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29 20  );.  if( pBuf ) 
bd20: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e  return pBuf;.  n
bd30: 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42  Byte = ROUND8(nB
bd40: 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70  yte);.  if( &(*p
bd50: 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d  pFrom)[nByte] <=
bd60: 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75   pEnd ){.    pBu
bd70: 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72  f = (void*)*ppFr
bd80: 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20  om;.    *ppFrom 
bd90: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73  += nByte;.  }els
bda0: 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b  e{.    *pnByte +
bdb0: 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72  = nByte;.  }.  r
bdc0: 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f  eturn pBuf;.}../
bdd0: 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20  *.** Rewind the 
bde0: 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65  VDBE back to the
bdf0: 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72   beginning in pr
be00: 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a  eparation for.**
be10: 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a   running it..*/.
be20: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
be30: 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b  Rewind(Vdbe *p){
be40: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
be50: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
be60: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
be70: 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e  LE).  int i;.#en
be80: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21  dif.  assert( p!
be90: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
bea0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
beb0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20  AGIC_INIT );..  
bec0: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
bed0: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
bee0: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
bef0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
bf00: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
bf10: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
bf20: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
bf30: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
bf40: 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63  r. */.  p->magic
bf50: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
bf60: 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  N;..#ifdef SQLIT
bf70: 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d  E_DEBUG.  for(i=
bf80: 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  1; i<p->nMem; i+
bf90: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
bfa0: 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70  p->aMem[i].db==p
bfb0: 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ->db );.  }.#end
bfc0: 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b  if.  p->pc = -1;
bfd0: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
bfe0: 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72  E_OK;.  p->error
bff0: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
c000: 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  t;.  p->magic = 
c010: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
c020: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
c030: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
c040: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
c050: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
c060: 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d  55;.  p->iStatem
c070: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ent = 0;.  p->nF
c080: 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b  kConstraint = 0;
c090: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
c0a0: 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20  FILE.  for(i=0; 
c0b0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
c0c0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
c0d0: 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f  t = 0;.    p->aO
c0e0: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
c0f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
c100: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
c110: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
c120: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72  or execution for
c130: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
c140: 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e  after.** creatin
c150: 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  g the virtual ma
c160: 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76  chine.  This inv
c170: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
c180: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
c190: 6e 67 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ng registers and
c1a0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
c1b0: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
c1c0: 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  r..** After the 
c1d0: 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70  VDBE has be prep
c1e0: 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65  ped, it can be e
c1f0: 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f  xecuted by one o
c200: 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20  r more.** calls 
c210: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  to sqlite3VdbeEx
c220: 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ec().  .**.** Th
c230: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
c240: 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c  be called exactl
c250: 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76  y once on each v
c260: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
c270: 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
c280: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
c290: 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
c2a0: 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69  "packaged" and i
c2b0: 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75  s ready.** to ru
c2c0: 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72  n.  After this r
c2d0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
c2e0: 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20  , further calls 
c2f0: 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  to .** sqlite3Vd
c300: 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69  beAddOp() functi
c310: 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74  ons are prohibit
c320: 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
c330: 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a  e disconnects.**
c340: 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74   the Vdbe from t
c350: 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
c360: 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65  that helped gene
c370: 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20  rate it so that 
c380: 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  the.** the Vdbe 
c390: 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70  becomes an indep
c3a0: 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e  endent entity an
c3b0: 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  d the Parse obje
c3c0: 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73  ct can be.** des
c3d0: 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73  troyed..**.** Us
c3e0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  e the sqlite3Vdb
c3f0: 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64  eRewind() proced
c400: 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ure to restore a
c410: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
c420: 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20   back.** to its 
c430: 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66  initial state af
c440: 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ter it has been 
c450: 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  run..*/.void sql
c460: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
c470: 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  y(.  Vdbe *p,   
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c490: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
c4a0: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
c4b0: 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
c4c0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
c4d0: 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73  ontext */.){.  s
c4e0: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c500: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
c510: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
c520: 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20  t nVar;         
c530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c540: 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65  Number of parame
c550: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ters */.  int nM
c560: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
c570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c580: 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20  er of VM memory 
c590: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69  registers */.  i
c5a0: 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20  nt nCursor;     
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c5c0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   Number of curso
c5d0: 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  rs required */. 
c5e0: 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20   int nArg;      
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c600: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
c610: 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f  uments in subpro
c620: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
c630: 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  Once;           
c640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c650: 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69  ber of OP_Once i
c660: 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20  nstructions */. 
c670: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c690: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
c6a0: 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20  */.  u8 *zCsr;  
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6c0: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76      /* Memory av
c6d0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f  ailable for allo
c6e0: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a  cation */.  u8 *
c6f0: 7a 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  zEnd;           
c700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
c710: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 61 6c  rst byte past al
c720: 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a  located memory *
c730: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65     /* How much e
c760: 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e  xtra memory is n
c770: 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  eeded */..  asse
c780: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
c790: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
c7a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
c7b0: 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  se!=0 );.  asser
c7c0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
c7d0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
c7e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
c7f0: 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20  ==p->pParse );. 
c800: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
c810: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
c820: 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20  cFailed==0 );.  
c830: 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nVar = pParse->n
c840: 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50  Var;.  nMem = pP
c850: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43  arse->nMem;.  nC
c860: 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
c870: 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70  nTab;.  nArg = p
c880: 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a  Parse->nMaxArg;.
c890: 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65    nOnce = pParse
c8a0: 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e  ->nOnce;.  if( n
c8b0: 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20  Once==0 ) nOnce 
c8c0: 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61  = 1; /* Ensure a
c8d0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65  t least one byte
c8e0: 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67   in p->aOnceFlag
c8f0: 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f  [] */.  .  /* Fo
c900: 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65  r each cursor re
c910: 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c  quired, also all
c920: 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63  ocate a memory c
c930: 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a  ell. Memory.  **
c940: 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e   cells (nMem+1-n
c950: 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69  Cursor)..nMem, i
c960: 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e  nclusive, will n
c970: 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a  ever be used by.
c980: 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72    ** the vdbe pr
c990: 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74  ogram. Instead t
c9a0: 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20  hey are used to 
c9b0: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
c9c0: 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73  or.  ** VdbeCurs
c9d0: 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75  or/BtCursor stru
c9e0: 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62  ctures. The blob
c9f0: 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
ca00: 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a  iated with .  **
ca10: 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f   cursor 0 is sto
ca20: 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  red in memory ce
ca30: 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20  ll nMem. Memory 
ca40: 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20  cell (nMem-1).  
ca50: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c  ** stores the bl
ca60: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
ca70: 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
ca80: 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a  sor 1, etc..  **
ca90: 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20  .  ** See also: 
caa0: 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29  allocateCursor()
cab0: 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d  ..  */.  nMem +=
cac0: 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20   nCursor;..  /* 
cad0: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
cae0: 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  or memory regist
caf0: 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c  ers, SQL variabl
cb00: 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73  es, VDBE cursors
cb10: 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72   and .  ** an ar
cb20: 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53  ray to marshal S
cb30: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  QL function argu
cb40: 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20  ments in..  */. 
cb50: 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d   zCsr = (u8*)&p-
cb60: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20  >aOp[p->nOp];   
cb70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
cb80: 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72  ry avaliable for
cb90: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
cba0: 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d   zEnd = (u8*)&p-
cbb0: 3e 61 4f 70 5b 70 50 61 72 73 65 2d 3e 6e 4f 70  >aOp[pParse->nOp
cbc0: 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73  Alloc];  /* Firs
cbd0: 74 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20  t byte past end 
cbe0: 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20 20  of zCsr[] */..  
cbf0: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
cc00: 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e  p, &nArg);.  p->
cc10: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
cc20: 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69  = (u8)(pParse->i
cc30: 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70  sMultiWrite && p
cc40: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
cc50: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
cc60: 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c  explain && nMem<
cc70: 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d  10 ){.    nMem =
cc80: 20 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65   10;.  }.  memse
cc90: 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d  t(zCsr, 0, zEnd-
cca0: 7a 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b 3d  zCsr);.  zCsr +=
ccb0: 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29   (zCsr - (u8*)0)
ccc0: 26 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  &7;.  assert( EI
ccd0: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
cce0: 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70 2d  NT(zCsr) );.  p-
ccf0: 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20  >expired = 0;.. 
cd00: 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72   /* Memory for r
cd10: 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65  egisters, parame
cd20: 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74  ters, cursor, et
cd30: 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  c, is allocated 
cd40: 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73  in two.  ** pass
cd50: 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73  es.  On the firs
cd60: 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74  t pass, we try t
cd70: 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 73  o reuse unused s
cd80: 70 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 2a  pace at the .  *
cd90: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  * end of the opc
cda0: 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77  ode array.  If w
cdb0: 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
cdc0: 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f  satisfy all memo
cdd0: 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d  ry.  ** requirem
cde0: 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20  ents by reusing 
cdf0: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
ce00: 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20   tail, then the 
ce10: 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73  second.  ** pass
ce20: 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68   will fill in th
ce30: 65 20 72 65 73 74 20 75 73 69 6e 67 20 61 20 66  e rest using a f
ce40: 72 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  resh allocation.
ce50: 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
ce60: 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f  s two-pass appro
ce70: 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20  ach that reuses 
ce80: 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
ce90: 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a  s possible from.
cea0: 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65    ** the leftove
ceb0: 72 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  r space at the e
cec0: 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
ced0: 20 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69   array can signi
cee0: 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65  ficantly.  ** re
cef0: 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  duce the amount 
cf00: 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  of memory held b
cf10: 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  y a prepared sta
cf20: 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64  tement..  */.  d
cf30: 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  o {.    nByte = 
cf40: 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d  0;.    p->aMem =
cf50: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
cf60: 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66  Mem, nMem*sizeof
cf70: 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45  (Mem), &zCsr, zE
cf80: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
cf90: 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63   p->aVar = alloc
cfa0: 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e  Space(p->aVar, n
cfb0: 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c  Var*sizeof(Mem),
cfc0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
cfd0: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70  Byte);.    p->ap
cfe0: 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Arg = allocSpace
cff0: 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a  (p->apArg, nArg*
d000: 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a  sizeof(Mem*), &z
d010: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
d020: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72  e);.    p->azVar
d030: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
d040: 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  >azVar, nVar*siz
d050: 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73  eof(char*), &zCs
d060: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
d070: 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d  ;.    p->apCsr =
d080: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
d090: 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69  pCsr, nCursor*si
d0a0: 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a  zeof(VdbeCursor*
d0b0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43               &zC
d0d0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
d0e0: 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46  );.    p->aOnceF
d0f0: 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  lag = allocSpace
d100: 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e  (p->aOnceFlag, n
d110: 4f 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Once, &zCsr, zEn
d120: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 23 69 66 64  d, &nByte);.#ifd
d130: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d140: 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
d150: 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d  .    p->anExec =
d160: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
d170: 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69  nExec, p->nOp*si
d180: 7a 65 6f 66 28 69 36 34 29 2c 20 26 7a 43 73 72  zeof(i64), &zCsr
d190: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
d1a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
d1b0: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70  nByte ){.      p
d1c0: 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65  ->pFree = sqlite
d1d0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
d1e0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
d1f0: 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46      zCsr = p->pF
d200: 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20  ree;.    zEnd = 
d210: 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20  &zCsr[nByte];.  
d220: 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26  }while( nByte &&
d230: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
d240: 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72  ed );..  p->nCur
d250: 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20  sor = nCursor;. 
d260: 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20   p->nOnceFlag = 
d270: 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e  nOnce;.  if( p->
d280: 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  aVar ){.    p->n
d290: 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61  Var = (ynVar)nVa
d2a0: 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  r;.    for(n=0; 
d2b0: 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20  n<nVar; n++){.  
d2c0: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66      p->aVar[n].f
d2d0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
d2e0: 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e  .      p->aVar[n
d2f0: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d  ].db = db;.    }
d300: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a  .  }.  if( p->az
d310: 56 61 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Var && pParse->n
d320: 7a 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 70 2d  zVar>0 ){.    p-
d330: 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d  >nzVar = pParse-
d340: 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63  >nzVar;.    memc
d350: 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61  py(p->azVar, pPa
d360: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e  rse->azVar, p->n
d370: 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  zVar*sizeof(p->a
d380: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d  zVar[0]));.    m
d390: 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a  emset(pParse->az
d3a0: 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  Var, 0, pParse->
d3b0: 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61  nzVar*sizeof(pPa
d3c0: 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b  rse->azVar[0]));
d3d0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d  .  }.  if( p->aM
d3e0: 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65  em ){.    p->aMe
d3f0: 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20  m--;            
d400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
d410: 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e  m[] goes from 1.
d420: 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e  .nMem */.    p->
d430: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20  nMem = nMem;    
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d450: 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30        not from 0
d460: 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20  ..nMem-1 */.    
d470: 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d  for(n=1; n<=nMem
d480: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; n++){.      p-
d490: 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aMem[n].flags =
d4a0: 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a   MEM_Undefined;.
d4b0: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d        p->aMem[n]
d4c0: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
d4d0: 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e    }.  p->explain
d4e0: 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61   = pParse->expla
d4f0: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  in;.  sqlite3Vdb
d500: 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f  eRewind(p);.}../
d510: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42  *.** Close a VDB
d520: 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c  E cursor and rel
d530: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73  ease all the res
d540: 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73  ources that curs
d550: 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74  or .** happens t
d560: 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20  o hold..*/.void 
d570: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
d580: 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56  ursor(Vdbe *p, V
d590: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  dbeCursor *pCx){
d5a0: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
d5b0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
d5c0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f  .  sqlite3VdbeSo
d5d0: 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c  rterClose(p->db,
d5e0: 20 70 43 78 29 3b 0a 20 20 69 66 28 20 70 43 78   pCx);.  if( pCx
d5f0: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c  ->pBt ){.    sql
d600: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
d610: 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a  Cx->pBt);.    /*
d620: 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f   The pCx->pCurso
d630: 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20  r will be close 
d640: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69  automatically, i
d650: 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a  f it exists, by.
d660: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
d670: 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73  above. */.  }els
d680: 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73  e if( pCx->pCurs
d690: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
d6a0: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
d6b0: 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b  r(pCx->pCursor);
d6c0: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
d6d0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
d6e0: 54 41 42 4c 45 0a 20 20 65 6c 73 65 20 69 66 28  TABLE.  else if(
d6f0: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
d700: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
d710: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
d720: 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d  tabCursor = pCx-
d730: 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  >pVtabCursor;.  
d740: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
d750: 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20  module *pModule 
d760: 3d 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70  = pVtabCursor->p
d770: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20  Vtab->pModule;. 
d780: 20 20 20 61 73 73 65 72 74 28 20 70 56 74 61 62     assert( pVtab
d790: 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 6e  Cursor->pVtab->n
d7a0: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 56 74  Ref>0 );.    pVt
d7b0: 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d  abCursor->pVtab-
d7c0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 70 4d 6f  >nRef--;.    pMo
d7d0: 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74  dule->xClose(pVt
d7e0: 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23  abCursor);.  }.#
d7f0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
d800: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
d810: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
d820: 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  frame..*/.static
d830: 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f   void closeCurso
d840: 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a  rsInFrame(Vdbe *
d850: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  p){.  if( p->apC
d860: 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
d870: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
d880: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
d890: 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
d8a0: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
d8b0: 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
d8c0: 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
d8d0: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
d8e0: 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
d8f0: 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
d900: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
d910: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
d920: 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20  Copy the values 
d930: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64  stored in the Vd
d940: 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72  beFrame structur
d950: 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54  e to its Vdbe. T
d960: 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  his.** is used, 
d970: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
d980: 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d  n a trigger sub-
d990: 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65  program is halte
d9a0: 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20  d to restore.** 
d9b0: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d  control to the m
d9c0: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ain program..*/.
d9d0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
d9e0: 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65  rameRestore(Vdbe
d9f0: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a  Frame *pFrame){.
da00: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61    Vdbe *v = pFra
da10: 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75  me->v;.  closeCu
da20: 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b  rsorsInFrame(v);
da30: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
da40: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
da50: 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65  TATUS.  v->anExe
da60: 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78  c = pFrame->anEx
da70: 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e  ec;.#endif.  v->
da80: 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61  aOnceFlag = pFra
da90: 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20  me->aOnceFlag;. 
daa0: 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20   v->nOnceFlag = 
dab0: 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61  pFrame->nOnceFla
dac0: 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46  g;.  v->aOp = pF
dad0: 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e  rame->aOp;.  v->
dae0: 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f  nOp = pFrame->nO
daf0: 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70  p;.  v->aMem = p
db00: 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76  Frame->aMem;.  v
db10: 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->nMem = pFrame-
db20: 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73  >nMem;.  v->apCs
db30: 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73  r = pFrame->apCs
db40: 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20  r;.  v->nCursor 
db50: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f  = pFrame->nCurso
db60: 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74  r;.  v->db->last
db70: 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e  Rowid = pFrame->
db80: 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e  lastRowid;.  v->
db90: 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65  nChange = pFrame
dba0: 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e  ->nChange;.  v->
dbb0: 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46  db->nChange = pF
dbc0: 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b  rame->nDbChange;
dbd0: 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65  .  return pFrame
dbe0: 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ->pc;.}../*.** C
dbf0: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
dc00: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c  ..**.** Also rel
dc10: 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63  ease any dynamic
dc20: 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
dc30: 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64  the VM in the Vd
dc40: 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a  be.aMem memory .
dc50: 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54  ** cell array. T
dc60: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
dc70: 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   as the memory c
dc80: 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f  ell array may co
dc90: 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72  ntain.** pointer
dca0: 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f  s to VdbeFrame o
dcb0: 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61  bjects, which ma
dcc0: 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69  y in turn contai
dcd0: 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  n pointers to.**
dce0: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a   open cursors..*
dcf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
dd00: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64  oseAllCursors(Vd
dd10: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  be *p){.  if( p-
dd20: 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  >pFrame ){.    V
dd30: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
dd40: 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65  ;.    for(pFrame
dd50: 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61  =p->pFrame; pFra
dd60: 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72  me->pParent; pFr
dd70: 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72  ame=pFrame->pPar
dd80: 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ent);.    sqlite
dd90: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
dda0: 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20 70  e(pFrame);.    p
ddb0: 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20  ->pFrame = 0;.  
ddc0: 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b    p->nFrame = 0;
ddd0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
dde0: 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20  ->nFrame==0 );. 
ddf0: 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
de00: 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20 70  rame(p);.  if( p
de10: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  ->aMem ){.    re
de20: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70  leaseMemArray(&p
de30: 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d  ->aMem[1], p->nM
de40: 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  em);.  }.  while
de50: 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29  ( p->pDelFrame )
de60: 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
de70: 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46  *pDel = p->pDelF
de80: 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65  rame;.    p->pDe
de90: 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70  lFrame = pDel->p
dea0: 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69  Parent;.    sqli
deb0: 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65  te3VdbeFrameDele
dec0: 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20  te(pDel);.  }.. 
ded0: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61   /* Delete any a
dee0: 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f  uxdata allocatio
def0: 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 56  ns made by the V
df00: 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41  M */.  if( p->pA
df10: 75 78 44 61 74 61 20 29 20 73 71 6c 69 74 65 33  uxData ) sqlite3
df20: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
df30: 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61  a(p, -1, 0);.  a
df40: 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61  ssert( p->pAuxDa
df50: 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ta==0 );.}../*.*
df60: 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56  * Clean up the V
df70: 4d 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65  M after a single
df80: 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   run..*/.static 
df90: 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62  void Cleanup(Vdb
dfa0: 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
dfb0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23   *db = p->db;..#
dfc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
dfd0: 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20  UG.  /* Execute 
dfe0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
dff0: 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  nts to ensure th
e000: 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73  at the Vdbe.apCs
e010: 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64  r[] and .  ** Vd
e020: 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73  be.aMem[] arrays
e030: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
e040: 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20  en cleaned up.  
e050: 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  */.  int i;.  if
e060: 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72  ( p->apCsr ) for
e070: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
e080: 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28  or; i++) assert(
e090: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20   p->apCsr[i]==0 
e0a0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d  );.  if( p->aMem
e0b0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
e0c0: 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b   i<=p->nMem; i++
e0d0: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65  ) assert( p->aMe
e0e0: 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f  m[i].flags==MEM_
e0f0: 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d  Undefined );.  }
e100: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
e110: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
e120: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
e130: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d  ErrMsg = 0;.  p-
e140: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
e150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
e160: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
e170: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
e180: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
e190: 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
e1a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
e1b0: 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
e1c0: 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
e1d0: 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
e1e0: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
e1f0: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
e200: 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
e210: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
e220: 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
e230: 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
e240: 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
e250: 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
e260: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
e270: 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
e280: 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
e290: 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  ){.  Mem *pColNa
e2a0: 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  me;.  int n;.  s
e2b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
e2c0: 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65  db;..  releaseMe
e2d0: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
e2e0: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
e2f0: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
e300: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e310: 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
e320: 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
e330: 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
e340: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75  >nResColumn = (u
e350: 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20  16)nResColumn;. 
e360: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70   p->aColName = p
e370: 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29  ColName = (Mem*)
e380: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
e390: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d  ero(db, sizeof(M
e3a0: 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70  em)*n );.  if( p
e3b0: 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20  ->aColName==0 ) 
e3c0: 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28  return;.  while(
e3d0: 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   n-- > 0 ){.    
e3e0: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20  pColName->flags 
e3f0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
e400: 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70  pColName->db = p
e410: 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  ->db;.    pColNa
e420: 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  me++;.  }.}../*.
e430: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
e440: 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
e450: 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
e460: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
e470: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
e480: 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
e490: 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
e4a0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
e4b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
e4c0: 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
e4d0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
e4e0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
e4f0: 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ols()..**.** The
e500: 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
e510: 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20  , xDel, must be 
e520: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59  one of SQLITE_DY
e530: 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54  NAMIC, SQLITE_ST
e540: 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  ATIC.** or SQLIT
e550: 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20  E_TRANSIENT. If 
e560: 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e  it is SQLITE_DYN
e570: 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62  AMIC, then the b
e580: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a  uffer pointed.**
e590: 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c   to by zName wil
e5a0: 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71  l be freed by sq
e5b0: 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68  lite3DbFree() wh
e5c0: 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64  en the vdbe is d
e5d0: 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74  estroyed..*/.int
e5e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
e5f0: 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a  olName(.  Vdbe *
e600: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
e610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
e620: 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75  be being configu
e630: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  red */.  int idx
e640: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
e660: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61  ex of column zNa
e670: 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  me applies to */
e680: 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20  .  int var,     
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6a0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
e6b0: 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73  e COLNAME_* cons
e6c0: 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tants */.  const
e6d0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
e6f0: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
e700: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65   containing name
e710: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
e720: 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20  l)(void*)       
e730: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
e740: 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61   management stra
e750: 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a  tegy for zName *
e760: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
e770: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
e780: 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
e790: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
e7a0: 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
e7b0: 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
e7c0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
e7d0: 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
e7e0: 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65  t( !zName || xDe
e7f0: 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  l!=SQLITE_DYNAMI
e800: 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
e810: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e820: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  }.  assert( p->a
e830: 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ColName!=0 );.  
e840: 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e  pColName = &(p->
e850: 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72  aColName[idx+var
e860: 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29  *p->nResColumn])
e870: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
e880: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
e890: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
e8a0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
e8b0: 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  xDel);.  assert(
e8c0: 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65   rc!=0 || !zName
e8d0: 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66   || (pColName->f
e8e0: 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d  lags&MEM_Term)!=
e8f0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
e900: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
e910: 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
e920: 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
e930: 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
e940: 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
e950: 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
e960: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
e970: 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
e980: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
e990: 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
e9a0: 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
e9b0: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
e9c0: 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
e9d0: 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
e9e0: 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
e9f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
ea00: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
ea10: 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
ea20: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
ea30: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
ea40: 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
ea50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
ea60: 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
ea70: 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
ea80: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nsaction */.  in
ea90: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
eaa0: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
eab0: 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  mit = 0;..#ifdef
eac0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
ead0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57  TUALTABLE.  /* W
eae0: 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c  ith this option,
eaf0: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
eb00: 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
eb10: 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a   be simply .  **
eb20: 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20   SQLITE_OK so p 
eb30: 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20  is not used. .  
eb40: 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
eb50: 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66  METER(p);.#endif
eb60: 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f  ..  /* Before do
eb70: 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
eb80: 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e  e, call the xSyn
eb90: 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  c() callback for
eba0: 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61   any.  ** virtua
ebb0: 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20  l module tables 
ebc0: 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20  written in this 
ebd0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
ebe0: 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65  s has to.  ** be
ebf0: 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74   done before det
ec00: 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72  ermining whether
ec10: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
ec20: 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20  l file is .  ** 
ec30: 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20  required, as an 
ec40: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
ec50: 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61   may add an atta
ec60: 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20  ched database.  
ec70: 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  ** to the transa
ec80: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
ec90: 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79   = sqlite3VtabSy
eca0: 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a  nc(db, p);..  /*
ecb0: 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72   This loop deter
ecc0: 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65  mines (a) if the
ecd0: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f   commit hook sho
ece0: 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61  uld be invoked a
ecf0: 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20  nd.  ** (b) how 
ed00: 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69  many database fi
ed10: 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72  les have open wr
ed20: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
ed30: 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c  , not .  ** incl
ed40: 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64  uding the temp d
ed50: 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20  atabase. (b) is 
ed60: 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73  important becaus
ed70: 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a  e if more than .
ed80: 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73    ** one databas
ed90: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70  e file has an op
eda0: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
edb0: 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a  tion, a master j
edc0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
edd0: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
ede0: 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69   an atomic commi
edf0: 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69  t..  */ .  for(i
ee00: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
ee10: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
ee20: 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65  i++){ .    Btree
ee30: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
ee40: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
ee50: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
ee60: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
ee70: 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20      needXcommit 
ee80: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
ee90: 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a  !=1 ) nTrans++;.
eea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
eeb0: 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20  eeEnter(pBt);.  
eec0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
eed0: 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
eee0: 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  ck(sqlite3BtreeP
eef0: 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20  ager(pBt));.    
ef00: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
ef10: 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  ave(pBt);.    }.
ef20: 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
ef30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
ef40: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
ef50: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
ef60: 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73   any write-trans
ef70: 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20  actions at all, 
ef80: 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69  invoke the commi
ef90: 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20  t hook */.  if( 
efa0: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64  needXcommit && d
efb0: 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
efc0: 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64  ck ){.    rc = d
efd0: 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
efe0: 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  ck(db->pCommitAr
eff0: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
f000: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
f010: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
f020: 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20  _COMMITHOOK;.   
f030: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
f040: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e   simple case - n
f050: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
f060: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
f070: 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a  ot counting the.
f080: 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61    ** TEMP databa
f090: 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61  se) has a transa
f0a0: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20  ction active.   
f0b0: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
f0c0: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61   for the.  ** ma
f0d0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster-journal..  
f0e0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
f0f0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
f100: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
f110: 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65  lename() is a ze
f120: 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73  ro length.  ** s
f130: 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20  tring, it means 
f140: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
f150: 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72  e is :memory: or
f160: 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49   a temp file.  I
f170: 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73  n .  ** that cas
f180: 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  e we do not supp
f190: 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69  ort atomic multi
f1a0: 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73  -file commits, s
f1b0: 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  o use the .  ** 
f1c0: 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e  simple case then
f1d0: 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
f1e0: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65   0==sqlite3Strle
f1f0: 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65  n30(sqlite3Btree
f200: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
f210: 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20  aDb[0].pBt)).   
f220: 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29  || nTrans<=1.  )
f230: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  {.    for(i=0; r
f240: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
f250: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
f260: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
f270: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
f280: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
f290: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
f2a0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
f2b0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
f2c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
f2d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74    }..    /* Do t
f2e0: 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69  he commit only i
f2f0: 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  f all databases 
f300: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
f310: 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a  plete phase 1. .
f320: 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66      ** If one of
f330: 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74   the BtreeCommit
f340: 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73  PhaseOne() calls
f350: 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64   fails, this ind
f360: 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a  icates an.    **
f370: 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20   IO error while 
f380: 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
f390: 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  cating a journal
f3a0: 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c   file. It is unl
f3b0: 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75  ikely,.    ** bu
f3c0: 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20  t could happen. 
f3d0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61  In this case aba
f3e0: 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
f3f0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
f400: 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
f410: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
f420: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
f430: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
f440: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
f450: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
f460: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
f470: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
f480: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
f490: 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b  haseTwo(pBt, 0);
f4a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f4b0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f4c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
f4d0: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
f4e0: 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
f4f0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78    /* The complex
f500: 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73   case - There is
f510: 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72   a multi-file wr
f520: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
f530: 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69  active..  ** Thi
f540: 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73  s requires a mas
f550: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
f560: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74   to ensure the t
f570: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
f580: 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f  ** committed ato
f590: 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69  mically..  */.#i
f5a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f5b0: 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b  T_DISKIO.  else{
f5c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
f5d0: 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66   *pVfs = db->pVf
f5e0: 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  s;.    int needS
f5f0: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  ync = 0;.    cha
f600: 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
f610: 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66    /* File-name f
f620: 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  or the master jo
f630: 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61  urnal */.    cha
f640: 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69  r const *zMainFi
f650: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
f660: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
f670: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
f680: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
f690: 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  pMaster = 0;.   
f6a0: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
f6b0: 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  .    int res;.  
f6c0: 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74    int retryCount
f6d0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
f6e0: 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a  ainFile;..    /*
f6f0: 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
f700: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
f710: 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46  me */.    nMainF
f720: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ile = sqlite3Str
f730: 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29  len30(zMainFile)
f740: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
f750: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
f760: 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39  b, "%s-mjXXXXXX9
f770: 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29  XXz", zMainFile)
f780: 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65  ;.    if( zMaste
f790: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
f7a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
f7b0: 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69  do {.      u32 i
f7c0: 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66  Random;.      if
f7d0: 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a  ( retryCount ){.
f7e0: 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72          if( retr
f7f0: 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20  yCount>100 ){.  
f800: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f810: 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  log(SQLITE_FULL,
f820: 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22   "MJ delete: %s"
f830: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
f840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
f850: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
f860: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
f870: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f880: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72    }else if( retr
f890: 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20  yCount==1 ){.   
f8a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
f8b0: 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
f8c0: 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22  "MJ collide: %s"
f8d0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
f8e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f8f0: 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b      retryCount++
f900: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
f910: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
f920: 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61  f(iRandom), &iRa
f930: 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  ndom);.      sql
f940: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33  ite3_snprintf(13
f950: 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e  , &zMaster[nMain
f960: 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39  File], "-mj%06X9
f970: 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20  %02X",.         
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f990: 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e        (iRandom>>
f9a0: 38 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61  8)&0xffffff, iRa
f9b0: 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20  ndom&0xff);.    
f9c0: 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e    /* The antipen
f9d0: 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74  ultimate charact
f9e0: 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  er of the master
f9f0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
fa00: 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22  st.      ** be "
fa10: 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65  9" to avoid name
fa20: 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e   collisions when
fa30: 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e   using 8+3 filen
fa40: 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ames. */.      a
fa50: 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73  ssert( zMaster[s
fa60: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
fa70: 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20  Master)-3]=='9' 
fa80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fa90: 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69  FileSuffix3(zMai
faa0: 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b  nFile, zMaster);
fab0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
fac0: 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
fad0: 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
fae0: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
faf0: 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69   &res);.    }whi
fb00: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
fb10: 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20  K && res );.    
fb20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
fb30: 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70  K ){.      /* Op
fb40: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
fb50: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20  urnal. */.      
fb60: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
fb70: 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a  enMalloc(pVfs, z
fb80: 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72  Master, &pMaster
fb90: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  , .          SQL
fba0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
fbb0: 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
fbc0: 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
fbd0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
fbe0: 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
fbf0: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
fc00: 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  L, 0.      );.  
fc10: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
fc20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
fc30: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
fc40: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
fc50: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fc60: 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57      }. .    /* W
fc70: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
fc80: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
fc90: 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ile in the trans
fca0: 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  action into the 
fcb0: 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  new.    ** maste
fcc0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
fcd0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
fce0: 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
fcf0: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e   close.    ** an
fd00: 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  d delete the mas
fd10: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
fd20: 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69  . All the indivi
fd30: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
fd40: 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  es.    ** still 
fd50: 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74  have 'null' as t
fd60: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
fd70: 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68  l pointer, so th
fd80: 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20  ey will roll.   
fd90: 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e   ** back indepen
fda0: 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c  dently if a fail
fdb0: 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20  ure occurs..    
fdc0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
fdd0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
fde0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
fdf0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
fe00: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  Bt;.      if( sq
fe10: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
fe20: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
fe30: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
fe40: 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  zFile = sqlite3B
fe50: 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
fe60: 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  me(pBt);.       
fe70: 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b   if( zFile==0 ){
fe80: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
fe90: 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  nue;  /* Ignore 
fea0: 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79  TEMP and :memory
feb0: 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  : databases */. 
fec0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fed0: 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30   assert( zFile[0
fee0: 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]!=0 );.        
fef0: 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26  if( !needSync &&
ff00: 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79   !sqlite3BtreeSy
ff10: 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20  ncDisabled(pBt) 
ff20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
ff30: 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
ff40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
ff50: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
ff60: 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c  (pMaster, zFile,
ff70: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
ff80: 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65  (zFile)+1, offse
ff90: 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  t);.        offs
ffa0: 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  et += sqlite3Str
ffb0: 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a  len30(zFile)+1;.
ffc0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
ffd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ffe0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
fff0: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
10000 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
10010 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
10020 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
10030 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10040 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
10050 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
10060 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10070 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10080 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
10090 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
100a0 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
100b0 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
100c0 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20  L device.    ** 
100d0 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73  flag is set this
100e0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
100f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10100 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20   needSync .     
10110 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73  && 0==(sqlite3Os
10120 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
10130 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53  stics(pMaster)&S
10140 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
10150 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20  ENTIAL).     && 
10160 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
10170 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
10180 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53  Master, SQLITE_S
10190 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20  YNC_NORMAL)).   
101a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
101b0 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
101c0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
101d0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
101e0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
101f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
10200 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
10210 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
10220 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
10230 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
10240 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
10250 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
10260 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
10270 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
10280 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10290 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
102a0 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
102b0 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
102c0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
102d0 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
102e0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
102f0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
10300 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
10310 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
10320 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
10330 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
10340 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
10350 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
10360 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
10370 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
10380 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
10390 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
103a0 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
103b0 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
103c0 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
103d0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
103e0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
103f0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
10400 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
10410 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
10420 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  e failure occurr
10430 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
10440 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
10450 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
10460 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
10470 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
10480 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
10490 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
104a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
104b0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
104c0 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73  aseOne(pBt, zMas
104d0 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
104e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
104f0 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
10500 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
10510 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
10520 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
10530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10540 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
10550 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
10560 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10570 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
10580 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
10590 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
105a0 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74  is commits the t
105b0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65  ransaction. Afte
105c0 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74  r.    ** doing t
105d0 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  his the director
105e0 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69  y is synced agai
105f0 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64  n before any ind
10600 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74  ividual.    ** t
10610 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73  ransaction files
10620 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20   are deleted..  
10630 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
10640 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
10650 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 65 65  fs, zMaster, nee
10660 64 53 79 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69  dSync);.    sqli
10670 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
10680 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
10690 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
106a0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
106b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
106c0 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
106d0 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
106e0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
106f0 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
10700 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
10710 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
10720 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
10730 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
10740 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
10750 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
10760 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
10770 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
10780 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
10790 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
107a0 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
107b0 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
107c0 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
107d0 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
107e0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
107f0 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
10800 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
10810 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
10820 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
10830 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
10840 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
10850 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
10860 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
10870 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
10880 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
10890 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
108a0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
108b0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
108c0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
108d0 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
108e0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
108f0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
10900 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
10910 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
10920 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
10930 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
10940 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
10950 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
10960 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
10970 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
10980 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
10990 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
109a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
109b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
109c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
109d0 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
109e0 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63   sqlite3.nVdbeAc
109f0 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61  tive count varia
10a00 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
10a10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
10a20 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
10a30 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
10a40 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
10a50 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
10a60 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
10a70 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
10a80 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
10a90 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
10aa0 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
10ab0 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
10ac0 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
10ad0 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
10ae0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
10af0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
10b00 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
10b10 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
10b20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
10b30 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
10b40 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
10b50 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
10b60 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  nt = 0;.  int nW
10b70 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rite = 0;.  int 
10b80 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d  nRead = 0;.  p =
10b90 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68   db->pVdbe;.  wh
10ba0 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66  ile( p ){.    if
10bb0 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62  ( sqlite3_stmt_b
10bc0 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d  usy((sqlite3_stm
10bd0 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63  t*)p) ){.      c
10be0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
10bf0 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
10c00 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20   nWrite++;.     
10c10 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65   if( p->bIsReade
10c20 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20  r ) nRead++;.   
10c30 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
10c40 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
10c50 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62  t( cnt==db->nVdb
10c60 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73  eActive );.  ass
10c70 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d  ert( nWrite==db-
10c80 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
10c90 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d   assert( nRead==
10ca0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b  db->nVdbeRead );
10cb0 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
10cc0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
10cd0 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
10ce0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65  *.** If the Vdbe
10cf0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
10d00 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70  irst argument op
10d10 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74  ened a statement
10d20 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a  -transaction,.**
10d30 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41   close it now. A
10d40 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74  rgument eOp must
10d50 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50   be either SAVEP
10d60 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
10d70 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  .** SAVEPOINT_RE
10d80 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20  LEASE. If it is 
10d90 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10da0 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61  CK, then the sta
10db0 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
10dc0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
10dd0 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20  back. If eOp is 
10de0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
10df0 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  E, then the .** 
10e00 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
10e10 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
10e20 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
10e30 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
10e40 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
10e50 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
10e60 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
10e70 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   Otherwise SQLIT
10e80 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
10e90 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
10ea0 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  tement(Vdbe *p, 
10eb0 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69  int eOp){.  sqli
10ec0 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20  te3 *const db = 
10ed0 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
10ee0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
10ef0 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d  /* If p->iStatem
10f00 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  ent is greater t
10f10 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
10f20 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20  his Vdbe opened 
10f30 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  a .  ** statemen
10f40 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  t transaction th
10f50 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  at should be clo
10f60 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e  sed here. The on
10f70 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a  ly exception.  *
10f80 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20  * is that an IO 
10f90 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f  error may have o
10fa0 63 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67  ccurred, causing
10fb0 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f   an emergency ro
10fc0 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20  llback..  ** In 
10fd0 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e  this case (db->n
10fe0 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61  Statement==0), a
10ff0 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  nd there is noth
11000 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a  ing to do..  */.
11010 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65    if( db->nState
11020 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74  ment && p->iStat
11030 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74  ement ){.    int
11040 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   i;.    const in
11050 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70  t iSavepoint = p
11060 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a  ->iStatement-1;.
11070 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70  .    assert( eOp
11080 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
11090 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56  BACK || eOp==SAV
110a0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b  EPOINT_RELEASE);
110b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
110c0 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b  >nStatement>0 );
110d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
110e0 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d  iStatement==(db-
110f0 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e  >nStatement+db->
11100 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a  nSavepoint) );..
11110 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
11120 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
11130 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53       int rc2 = S
11140 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
11150 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
11160 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
11170 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
11180 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
11190 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
111a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
111b0 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
111c0 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
111d0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
111e0 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  CK, iSavepoint);
111f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11200 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49     if( rc2==SQLI
11210 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11220 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
11230 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70  BtreeSavepoint(p
11240 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  Bt, SAVEPOINT_RE
11250 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
11260 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
11270 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
11280 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11290 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
112a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
112b0 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e  .    }.    db->n
112c0 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20  Statement--;.   
112d0 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
112e0 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   0;..    if( rc=
112f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11300 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
11310 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
11320 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
11330 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
11340 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
11350 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
11360 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
11370 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
11380 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11390 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
113a0 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
113b0 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  b, SAVEPOINT_REL
113c0 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
113d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
113e0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
113f0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
11400 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72  ction is being r
11410 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f  olled back, also
11420 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20   restore the .  
11430 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61    ** database ha
11440 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63  ndles deferred c
11450 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65  onstraint counte
11460 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  r to the value i
11470 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20  t had when .    
11480 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
11490 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
114a0 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20   opened.  */.   
114b0 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
114c0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
114d0 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
114e0 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74  redCons = p->nSt
114f0 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20  mtDefCons;.     
11500 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
11510 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  mCons = p->nStmt
11520 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20  DefImmCons;.    
11530 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
11540 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
11550 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
11560 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73  led when a trans
11570 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79  action opened by
11580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
11590 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61  * handle associa
115a0 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20  ted with the VM 
115b0 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
115c0 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74  ument is about t
115d0 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74  o be .** committ
115e0 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  ed. If there are
115f0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66   outstanding def
11600 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65  erred foreign ke
11610 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  y constraint.** 
11620 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75  violations, retu
11630 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
11640 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
11650 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
11660 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
11670 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69  nding FK violati
11680 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ons and this fun
11690 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a  ction returns .*
116a0 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  * SQLITE_ERROR, 
116b0 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
116c0 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49  f the VM to SQLI
116d0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
116e0 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20  REIGNKEY.** and 
116f0 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d  write an error m
11700 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68  essage to it. Th
11710 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  en return SQLITE
11720 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64  _ERROR..*/.#ifnd
11730 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
11740 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73  OREIGN_KEY.int s
11750 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
11760 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64  k(Vdbe *p, int d
11770 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69  eferred){.  sqli
11780 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
11790 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64  .  if( (deferred
117a0 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72   && (db->nDeferr
117b0 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65  edCons+db->nDefe
117c0 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20  rredImmCons)>0) 
117d0 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65  .   || (!deferre
117e0 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  d && p->nFkConst
117f0 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20  raint>0) .  ){. 
11800 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
11810 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
11820 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e  EIGNKEY;.    p->
11830 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
11840 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69  _Abort;.    sqli
11850 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20  te3VdbeError(p, 
11860 22 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  "FOREIGN KEY con
11870 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29  straint failed")
11880 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11890 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
118a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
118b0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
118c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
118d0 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68  is called the wh
118e0 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20  en a VDBE tries 
118f0 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65  to halt.  If the
11900 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64   VDBE.** has mad
11910 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73  e changes and is
11920 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d   in autocommit m
11930 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74  ode, then commit
11940 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65   those.** change
11950 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63  s.  If a rollbac
11960 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65  k is needed, the
11970 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  n do the rollbac
11980 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
11990 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c  utine is the onl
119a0 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68  y way to move th
119b0 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20  e state of a VM 
119c0 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  from.** SQLITE_M
119d0 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49  AGIC_RUN to SQLI
119e0 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20  TE_MAGIC_HALT.  
119f0 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74  It is harmless t
11a00 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f  o.** call this o
11a10 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69  n a VM that is i
11a20 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47  n the SQLITE_MAG
11a30 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a  IC_HALT state..*
11a40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
11a50 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74  rror code.  If t
11a60 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20  he commit could 
11a70 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  not complete bec
11a80 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20  ause of.** lock 
11a90 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75  contention, retu
11aa0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
11ab0 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   If SQLITE_BUSY 
11ac0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a  is returned, it.
11ad0 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f  ** means the clo
11ae0 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65  se did not happe
11af0 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  n and needs to b
11b00 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69  e repeated..*/.i
11b10 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  nt sqlite3VdbeHa
11b20 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  lt(Vdbe *p){.  i
11b30 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11b50 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * Used to store 
11b60 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e  transient return
11b70 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69   codes */.  sqli
11b80 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
11b90 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
11ba0 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  tion contains th
11bb0 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74  e logic that det
11bc0 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61  ermines if a sta
11bd0 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74  tement or.  ** t
11be0 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
11bf0 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
11c00 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
11c10 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
11c20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66   ** execution of
11c30 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
11c40 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  chine. .  **.  *
11c50 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
11c60 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73  following errors
11c70 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a   occur:.  **.  *
11c80 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  *     SQLITE_NOM
11c90 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  EM.  **     SQLI
11ca0 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20  TE_IOERR.  **   
11cb0 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20    SQLITE_FULL.  
11cc0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e  **     SQLITE_IN
11cd0 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a  TERRUPT.  **.  *
11ce0 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72  * Then the inter
11cf0 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20  nal cache might 
11d00 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69  have been left i
11d10 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
11d20 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57  t.  ** state.  W
11d30 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e need to rollba
11d40 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
11d50 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
11d60 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f   there is.  ** o
11d70 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c  ne, or the compl
11d80 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ete transaction 
11d90 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
11da0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
11db0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66  tion..  */..  if
11dc0 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
11dd0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
11de0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11df0 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  M;.  }.  if( p->
11e00 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73  aOnceFlag ) mems
11e10 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c  et(p->aOnceFlag,
11e20 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67   0, p->nOnceFlag
11e30 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72  );.  closeAllCur
11e40 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70  sors(p);.  if( p
11e50 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
11e60 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72  GIC_RUN ){.    r
11e70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11e80 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69  .  }.  checkActi
11e90 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
11ea0 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f    /* No commit o
11eb0 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65  r rollback neede
11ec0 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d if the program
11ed0 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f   never started o
11ee0 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51  r if the.  ** SQ
11ef0 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73  L statement does
11f00 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69   not read or wri
11f10 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69  te a database fi
11f20 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  le.  */.  if( p-
11f30 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73  >pc>=0 && p->bIs
11f40 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e  Reader ){.    in
11f50 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
11f60 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
11f70 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20  rom p->rc */.   
11f80 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f   int eStatementO
11f90 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
11fa0 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20  sSpecialError;  
11fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
11fc0 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73   to true if a 's
11fd0 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f  pecial' error */
11fe0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c  ..    /* Lock al
11ff0 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79  l btrees used by
12000 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
12010 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
12020 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20  eEnter(p);..    
12030 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
12040 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
12050 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
12060 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
12070 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  ;.    isSpecialE
12080 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
12090 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
120a0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120c0 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
120d0 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
120e0 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
120f0 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
12100 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
12110 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
12120 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61   was read-only a
12130 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
12140 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45  e is SQLITE_INTE
12150 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a  RRUPT, .      **
12160 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20   no rollback is 
12170 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72  necessary. Other
12180 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61  wise, at least a
12190 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
121a0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
121b0 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20   must be rolled 
121c0 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20  back to restore 
121d0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
121e0 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73  a .      ** cons
121f0 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20  istent state..  
12200 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
12210 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74  Even if the stat
12220 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e  ement is read-on
12230 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ly, it is import
12240 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20  ant to perform. 
12250 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d       ** a statem
12260 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  ent or transacti
12270 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72  on rollback oper
12280 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72  ation. If the er
12290 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63  ror .      ** oc
122a0 63 75 72 72 65 64 20 77 68 69 6c 65 20 77 72 69  curred while wri
122b0 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
122c0 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  nal, sub-journal
122d0 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20   or database.   
122e0 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61     ** file as pa
122f0 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20  rt of an effort 
12300 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65  to free up cache
12310 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63   space (see func
12320 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61  tion.      ** pa
12330 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70  gerStress() in p
12340 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c  ager.c), the rol
12350 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65  lback is require
12360 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20  d to restore .  
12370 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72      ** the pager
12380 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74   to a consistent
12390 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
123a0 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72  .      if( !p->r
123b0 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d  eadOnly || mrc!=
123c0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
123d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
123e0 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  (mrc==SQLITE_NOM
123f0 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
12400 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73  E_FULL) && p->us
12410 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b  esStmtJournal ){
12420 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74  .          eStat
12430 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
12440 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
12450 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12460 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
12470 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
12480 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
12490 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
124a0 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
124b0 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
124c0 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
124d0 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
124e0 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
124f0 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
12500 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73    */.          s
12510 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
12520 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
12530 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
12540 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
12550 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
12560 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  b);.          db
12570 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
12580 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ;.          p->n
12590 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
125a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
125b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
125c0 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20  k for immediate 
125d0 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c  foreign key viol
125e0 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69  ations. */.    i
125f0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
12600 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
12610 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
12620 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  p, 0);.    }.  .
12630 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75      /* If the au
12640 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
12650 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69  s set and this i
12660 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76  s the only activ
12670 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a  e writer .    **
12680 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20   VM, then we do 
12690 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
126a0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
126b0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
126c0 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
126d0 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
126e0 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
126f0 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
12700 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
12710 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
12720 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65  bove has occurre
12730 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
12740 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49  f( !sqlite3VtabI
12750 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20  nSync(db) .     
12760 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  && db->autoCommi
12770 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e  t .     && db->n
12780 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72  VdbeWrite==(p->r
12790 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20  eadOnly==0) .   
127a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
127b0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
127c0 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  | (p->errorActio
127d0 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69  n==OE_Fail && !i
127e0 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29  sSpecialError) )
127f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
12800 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
12810 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  k(p, 1);.       
12820 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12830 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
12840 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61  if( NEVER(p->rea
12850 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  dOnly) ){.      
12860 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12870 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
12880 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
12890 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
128a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
128b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
128c0 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
128d0 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KEY;.        }el
128e0 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f  se{ .          /
128f0 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
12900 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
12910 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
12920 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20   was successful 
12930 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
12940 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
12950 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  ' constraint and
12960 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65   there are no de
12970 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20  ferred foreign. 
12980 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20           ** key 
12990 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68  constraints to h
129a0 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73  old up the trans
129b0 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  action. This mea
129c0 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20  ns a commit .   
129d0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
129e0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
129f0 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
12a00 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  mit(db, p);.    
12a10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
12a20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
12a30 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  Y && p->readOnly
12a40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
12a50 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
12a60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
12a70 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
12a80 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
12a90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
12ab0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
12ac0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
12ad0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
12ae0 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  E_OK);.         
12af0 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
12b00 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
12b10 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
12b20 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
12b30 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
12b40 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
12b50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
12b60 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
12b70 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20  ITE_DeferFKs;.  
12b80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
12b90 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
12ba0 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  nges(db);.      
12bb0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
12bc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12bd0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
12be0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20  SQLITE_OK);.    
12bf0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
12c00 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
12c10 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
12c20 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
12c30 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
12c40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
12c50 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
12c60 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
12c70 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
12c80 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
12c90 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
12ca0 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20  _RELEASE;.      
12cb0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72  }else if( p->err
12cc0 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f  orAction==OE_Abo
12cd0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53  rt ){.        eS
12ce0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
12cf0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
12d00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
12d20 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
12d30 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
12d40 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
12d50 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
12d60 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
12d70 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
12d80 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
12d90 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
12da0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
12db0 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65    /* If eStateme
12dc0 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ntOp is non-zero
12dd0 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65  , then a stateme
12de0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e  nt transaction n
12df0 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
12e00 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
12e10 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c  olled back. Call
12e20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
12e30 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a  eStatement() to.
12e40 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66      ** do so. If
12e50 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
12e60 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
12e70 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
12e80 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
12e90 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
12ea0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51   SQLITE_OK or SQ
12eb0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
12ec0 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68   then promote th
12ed0 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
12ee0 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72   statement error
12ef0 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   code..    */.  
12f00 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
12f10 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  Op ){.      rc =
12f20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
12f30 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53  eStatement(p, eS
12f40 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20  tatementOp);.   
12f50 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
12f60 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
12f70 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
12f80 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  >rc&0xff)==SQLIT
12f90 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a  E_CONSTRAINT ){.
12fa0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
12fb0 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
12fc0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12fd0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
12fe0 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72           p->zErr
12ff0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Msg = 0;.       
13000 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
13010 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
13020 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
13030 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
13040 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
13050 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
13060 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
13070 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
13080 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
13090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
130a0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
130b0 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c  s was an INSERT,
130c0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
130d0 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65  E and no stateme
130e0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  nt transaction. 
130f0 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72     ** has been r
13100 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61  olled back, upda
13110 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
13120 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67  connection chang
13130 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e-counter. .    
13140 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
13150 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20  angeCntOn ){.   
13160 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
13170 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52  tOp!=SAVEPOINT_R
13180 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
13190 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
131a0 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e  tChanges(db, p->
131b0 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
131c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
131d0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
131e0 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  nges(db, 0);.   
131f0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43     }.      p->nC
13200 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  hange = 0;.    }
13210 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
13220 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20   the locks */.  
13230 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
13240 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ve(p);.  }..  /*
13250 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73   We have success
13260 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64  fully halted and
13270 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20   closed the VM. 
13280 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63   Record this fac
13290 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
132a0 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  c>=0 ){.    db->
132b0 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20  nVdbeActive--;. 
132c0 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
132d0 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57  nly ) db->nVdbeW
132e0 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  rite--;.    if( 
132f0 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64  p->bIsReader ) d
13300 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a  b->nVdbeRead--;.
13310 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
13320 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d  nVdbeActive>=db-
13330 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20  >nVdbeRead );.  
13340 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
13350 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64  dbeRead>=db->nVd
13360 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61  beWrite );.    a
13370 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
13380 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a  Write>=0 );.  }.
13390 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
133a0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
133b0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
133c0 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d  nt(db);.  if( p-
133d0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
133e0 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
133f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
13400 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
13410 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
13420 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c   is set to true,
13430 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20   then any locks 
13440 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20  that were held. 
13450 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f   ** by connectio
13460 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65  n db have now be
13470 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c  en released. Cal
13480 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74  l sqlite3Connect
13490 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20  ionUnlocked() . 
134a0 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e   ** to invoke an
134b0 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63  y required unloc
134c0 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
134d0 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ks..  */.  if( d
134e0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
134f0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
13500 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64  ectionUnlocked(d
13510 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  b);.  }..  asser
13520 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
13530 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  ve>0 || db->auto
13540 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
13550 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >nStatement==0 )
13560 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
13570 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f  c==SQLITE_BUSY ?
13580 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53   SQLITE_BUSY : S
13590 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f  QLITE_OK);.}.../
135a0 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68  *.** Each VDBE h
135b0 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20  olds the result 
135c0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
135d0 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nt sqlite3_step(
135e0 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e  ) call.** in p->
135f0 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  rc.  This routin
13600 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75  e sets that resu
13610 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  lt back to SQLIT
13620 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  E_OK..*/.void sq
13630 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74  lite3VdbeResetSt
13640 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70  epResult(Vdbe *p
13650 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  ){.  p->rc = SQL
13660 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
13670 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20   Copy the error 
13680 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
13690 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  essage belonging
136a0 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73   to the VDBE pas
136b0 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
136c0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
136d0 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  its database han
136e0 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65  dle (so that the
136f0 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65  y will be .** re
13700 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20  turned by calls 
13710 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  to sqlite3_errco
13720 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  de() and sqlite3
13730 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a  _errmsg())..**.*
13740 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
13750 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74  does not clear t
13760 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f  he VDBE error co
13770 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a  de or message, j
13780 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68  ust.** copies th
13790 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  em to the databa
137a0 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
137b0 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61  t sqlite3VdbeTra
137c0 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20  nsferError(Vdbe 
137d0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
137e0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
137f0 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
13800 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
13810 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46  {.    u8 mallocF
13820 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
13830 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 73 71  ocFailed;.    sq
13840 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
13850 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66  Malloc();.    if
13860 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20  ( db->pErr==0 ) 
13870 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74  db->pErr = sqlit
13880 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a  e3ValueNew(db);.
13890 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
138a0 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
138b0 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c   -1, p->zErrMsg,
138c0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
138d0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
138e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
138f0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
13900 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
13910 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c  led = mallocFail
13920 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43  ed;.    db->errC
13930 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73  ode = rc;.  }els
13940 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  e{.    sqlite3Er
13950 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d  ror(db, rc);.  }
13960 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13970 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
13980 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a  NABLE_SQLLOG./*.
13990 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f  ** If an SQLITE_
139a0 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f  CONFIG_SQLLOG ho
139b0 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65 64  ok is registered
139c0 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20   and the VM has 
139d0 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e  been run, .** in
139e0 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  voke it..*/.stat
139f0 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f  ic void vdbeInvo
13a00 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76  keSqllog(Vdbe *v
13a10 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
13a20 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
13a30 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53  llog && v->rc==S
13a40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a  QLITE_OK && v->z
13a50 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20  Sql && v->pc>=0 
13a60 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78  ){.    char *zEx
13a70 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33  panded = sqlite3
13a80 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c  VdbeExpandSql(v,
13a90 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61   v->zSql);.    a
13aa0 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e  ssert( v->db->in
13ab0 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20  it.busy==0 );.  
13ac0 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20    if( zExpanded 
13ad0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13ae0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
13af0 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20  llog(.          
13b00 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
13b10 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20  fig.pSqllogArg, 
13b20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64  v->db, zExpanded
13b30 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 1.      );.   
13b40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
13b50 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65  (v->db, zExpande
13b60 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  d);.    }.  }.}.
13b70 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76  #else.# define v
13b80 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
13b90 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
13ba0 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45   Clean up a VDBE
13bb0 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
13bc0 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65   but do not dele
13bd0 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74  te the VDBE just
13be0 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61   yet..** Write a
13bf0 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
13c00 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  s into *pzErrMsg
13c10 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
13c20 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sult code..**.**
13c30 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
13c40 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20  ine is run, the 
13c50 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72  VDBE should be r
13c60 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75  eady to be execu
13c70 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a  ted.** again..**
13c80 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69  .** To look at i
13c90 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74  t another way, t
13ca0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65  his routine rese
13cb0 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
13cc0 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d  the.** virtual m
13cd0 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45  achine from VDBE
13ce0 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44  _MAGIC_RUN or VD
13cf0 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61  BE_MAGIC_HALT ba
13d00 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41  ck to.** VDBE_MA
13d10 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74  GIC_INIT..*/.int
13d20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
13d30 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  t(Vdbe *p){.  sq
13d40 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20  lite3 *db;.  db 
13d50 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49  = p->db;..  /* I
13d60 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74  f the VM did not
13d70 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69   run to completi
13d80 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f  on or if it enco
13d90 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20  untered an.  ** 
13da0 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d  error, then it m
13db0 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65  ight not have be
13dc0 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72  en halted proper
13dd0 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a  ly.  So halt.  *
13de0 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  * it now..  */. 
13df0 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
13e00 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
13e10 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
13e20 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
13e30 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
13e40 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
13e50 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
13e60 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
13e70 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
13e80 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
13e90 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
13ea0 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
13eb0 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
13ec0 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
13ed0 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
13ee0 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
13ef0 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
13f00 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
13f10 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
13f20 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
13f30 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
13f40 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64  >pc>=0 ){.    vd
13f50 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70  beInvokeSqllog(p
13f60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13f70 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28  beTransferError(
13f80 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
13f90 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
13fa0 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
13fb0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69  rrMsg = 0;.    i
13fc0 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  f( p->runOnlyOnc
13fd0 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  e ) p->expired =
13fe0 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
13ff0 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69  p->rc && p->expi
14000 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  red ){.    /* Th
14010 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77  e expired flag w
14020 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44  as set on the VD
14030 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  BE before the fi
14040 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rst call.    ** 
14050 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
14060 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e  ). For consisten
14070 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65  cy (since sqlite
14080 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20  3_step() was.   
14090 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74   ** called), set
140a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72   the database er
140b0 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65  ror in this case
140c0 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f   as well..    */
140d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
140e0 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e  rWithMsg(db, p->
140f0 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f  rc, p->zErrMsg ?
14100 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45   "%s" : 0, p->zE
14110 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
14120 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14130 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
14140 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
14150 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d   }..  /* Reclaim
14160 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64   all memory used
14170 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a   by the VDBE.  *
14180 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  /.  Cleanup(p);.
14190 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
141a0 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
141b0 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
141c0 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  run..  */.#ifdef
141d0 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
141e0 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
141f0 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72  = fopen("vdbe_pr
14200 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29  ofile.out", "a")
14210 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b  ;.    if( out ){
14220 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
14230 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
14240 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
14250 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
14260 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
14270 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
14280 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
14290 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
142a0 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
142b0 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
142c0 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b    if( p->zSql ){
142d0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 2c  .        char c,
142e0 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pc = 0;.       
142f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
14300 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  - ");.        fo
14310 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a  r(i=0; (c = p->z
14320 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  Sql[i])!=0; i++)
14330 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
14340 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc=='\n' ) fprin
14350 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
14360 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28 63            putc(c
14370 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  , out);.        
14380 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20    pc = c;.      
14390 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
143a0 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e  pc!='\n' ) fprin
143b0 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
143c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
143d0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
143e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
143f0 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20  ar zHdr[100];.  
14400 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
14410 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48  printf(sizeof(zH
14420 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20  dr), zHdr, "%6u 
14430 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a  %12llu %8llu ",.
14440 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
14450 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20  p[i].cnt,.      
14460 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
14470 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20  ycles,.         
14480 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e    p->aOp[i].cnt>
14490 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79  0 ? p->aOp[i].cy
144a0 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63  cles/p->aOp[i].c
144b0 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29  nt : 0.        )
144c0 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
144d0 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64  f(out, "%s", zHd
144e0 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
144f0 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
14500 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
14510 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
14520 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
14530 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
14540 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d    p->iCurrentTim
14550 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = 0;.  p->magi
14560 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
14570 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  NIT;.  return p-
14580 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
14590 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
145a0 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
145b0 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
145c0 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
145d0 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
145e0 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
145f0 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
14600 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
14610 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
14620 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
14630 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
14640 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
14650 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14660 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
14670 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
14680 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
14690 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
146a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
146b0 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
146c0 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
146d0 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
146e0 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71  ==rc );.  }.  sq
146f0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
14700 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
14710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72  .}../*.** If par
14720 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65  ameter iOp is le
14730 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
14740 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  en invoke the de
14750 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20  structor for.** 
14760 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61  all auxiliary da
14770 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72  ta pointers curr
14780 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 20  ently cached by 
14790 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
147a0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
147b0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  gument..**.** Or
147c0 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 61  , if iOp is grea
147d0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
147e0 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  l to zero, then 
147f0 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
14800 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  s.** only invoke
14810 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69  d for those auxi
14820 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
14830 65 72 73 20 63 72 65 61 74 65 64 20 62 79 20 74  ers created by t
14840 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63  he user .** func
14850 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20  tion invoked by 
14860 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20  the OP_Function 
14870 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75  opcode at instru
14880 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a  ction iOp of .**
14890 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f   VM pVdbe, and o
148a0 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a  nly then if:.**.
148b0 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f  **    * the asso
148c0 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20  ciated function 
148d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
148e0 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28   32nd or later (
148f0 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20  counting.**     
14900 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
14910 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20  ght), or.**.**  
14920 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f    * the correspo
14930 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67  nding bit in arg
14940 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c  ument mask is cl
14950 65 61 72 20 28 77 68 65 72 65 20 74 68 65 20 66  ear (where the f
14960 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e  irst.**      fun
14970 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
14980 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 62  corresponds to b
14990 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76  it 0 etc.)..*/.v
149a0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
149b0 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62  eleteAuxData(Vdb
149c0 65 20 2a 70 56 64 62 65 2c 20 69 6e 74 20 69 4f  e *pVdbe, int iO
149d0 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  p, int mask){.  
149e0 41 75 78 44 61 74 61 20 2a 2a 70 70 20 3d 20 26  AuxData **pp = &
149f0 70 56 64 62 65 2d 3e 70 41 75 78 44 61 74 61 3b  pVdbe->pAuxData;
14a00 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b  .  while( *pp ){
14a10 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41  .    AuxData *pA
14a20 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66  ux = *pp;.    if
14a30 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c  ( (iOp<0).     |
14a40 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f  | (pAux->iOp==iO
14a50 70 20 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67  p && (pAux->iArg
14a60 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20  >31 || !(mask & 
14a70 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e  MASKBIT32(pAux->
14a80 69 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a  iArg)))).    ){.
14a90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14aa0 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29  pAux->iArg==31 )
14ab0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  ;.      if( pAux
14ac0 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
14ad0 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
14ae0 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
14af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
14b00 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b  p = pAux->pNext;
14b10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
14b20 46 72 65 65 28 70 56 64 62 65 2d 3e 64 62 2c 20  Free(pVdbe->db, 
14b30 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pAux);.    }else
14b40 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41 75  {.      pp= &pAu
14b50 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  x->pNext;.    }.
14b60 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
14b70 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
14b80 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
14b90 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
14ba0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
14bb0 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66  ent,.** except f
14bc0 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  or object itself
14bd0 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65  , which is prese
14be0 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rved..**.** The 
14bf0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
14c00 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
14c10 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65   and sqlite3Vdbe
14c20 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74  Delete() is that
14c30 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29  .** VdbeDelete()
14c40 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68   also unlinks th
14c50 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
14c60 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f  list of VMs asso
14c70 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
14c80 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
14c90 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73  ection and frees
14ca0 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65   the object itse
14cb0 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  lf..*/.void sqli
14cc0 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65  te3VdbeClearObje
14cd0 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
14ce0 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50  Vdbe *p){.  SubP
14cf0 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70  rogram *pSub, *p
14d00 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Next;.  int i;. 
14d10 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d   assert( p->db==
14d20 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29  0 || p->db==db )
14d30 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
14d40 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
14d50 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65  nVar);.  release
14d60 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
14d70 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
14d80 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
14d90 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50    for(pSub=p->pP
14da0 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53  rogram; pSub; pS
14db0 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ub=pNext){.    p
14dc0 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65  Next = pSub->pNe
14dd0 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65  xt;.    vdbeFree
14de0 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62  OpArray(db, pSub
14df0 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70  ->aOp, pSub->nOp
14e00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
14e10 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  Free(db, pSub);.
14e20 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e    }.  for(i=p->n
14e30 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  zVar-1; i>=0; i-
14e40 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  -) sqlite3DbFree
14e50 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d  (db, p->azVar[i]
14e60 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41  );.  vdbeFreeOpA
14e70 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c  rray(db, p->aOp,
14e80 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69   p->nOp);.  sqli
14e90 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14ea0 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71  >aColName);.  sq
14eb0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14ec0 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69  p->zSql);.  sqli
14ed0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14ee0 3e 70 46 72 65 65 29 3b 0a 23 69 66 64 65 66 20  >pFree);.#ifdef 
14ef0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
14f00 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
14f10 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
14f20 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  can; i++){.    s
14f30 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14f40 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61   p->aScan[i].zNa
14f50 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
14f60 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
14f70 61 53 63 61 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d  aScan);.#endif.}
14f80 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
14f90 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a  n entire VDBE..*
14fa0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
14fb0 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70  beDelete(Vdbe *p
14fc0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
14fd0 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  ;..  if( NEVER(p
14fe0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
14ff0 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
15000 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15010 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
15020 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
15030 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74  3VdbeClearObject
15040 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  (db, p);.  if( p
15050 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
15060 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
15070 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c   p->pNext;.  }el
15080 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
15090 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a  db->pVdbe==p );.
150a0 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20      db->pVdbe = 
150b0 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
150c0 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
150d0 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
150e0 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
150f0 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
15100 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44   VDBE_MAGIC_DEAD
15110 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20  ;.  p->db = 0;. 
15120 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
15130 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
15140 54 68 65 20 63 75 72 73 6f 72 20 22 70 22 20 68  The cursor "p" h
15150 61 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65  as a pending see
15160 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  k operation that
15170 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
15180 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74  n.** carried out
15190 2e 20 20 53 65 65 6b 20 74 68 65 20 63 75 72 73  .  Seek the curs
151a0 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65  or now.  If an e
151b0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
151c0 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f  urn.** the appro
151d0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
151e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
151f0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
15200 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d   handleDeferredM
15210 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
15220 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c   *p){.  int res,
15230 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49   rc;.#ifdef SQLI
15240 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e  TE_TEST.  extern
15250 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
15260 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69  rch_count;.#endi
15270 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  f.  assert( p->d
15280 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b  eferredMoveto );
15290 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73  .  assert( p->is
152a0 54 61 62 6c 65 20 29 3b 0a 20 20 72 63 20 3d 20  Table );.  rc = 
152b0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
152c0 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43  toUnpacked(p->pC
152d0 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76  ursor, 0, p->mov
152e0 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72  etoTarget, 0, &r
152f0 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  es);.  if( rc ) 
15300 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
15310 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e   res!=0 ) return
15320 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
15330 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c  BKPT;.#ifdef SQL
15340 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
15350 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
15360 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64  +;.#endif.  p->d
15370 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
15380 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61  0;.  p->cacheSta
15390 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
153a0 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  E;.  return SQLI
153b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
153c0 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f  Something has mo
153d0 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f  ved cursor "p" o
153e0 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61  ut of place.  Ma
153f0 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77  ybe the row it w
15400 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f  as.** pointed to
15410 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74   was deleted out
15420 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20   from under it. 
15430 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74   Or maybe the bt
15440 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c  ree was.** rebal
15450 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72  anced.  Whatever
15460 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20   the cause, try 
15470 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74  to restore "p" t
15480 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a  o the place it.*
15490 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f  * is supposed to
154a0 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49   be pointing.  I
154b0 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65  f the row was de
154c0 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
154d0 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73  nder the.** curs
154e0 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73  or, set the curs
154f0 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  or to point to a
15500 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74   NULL row..*/.st
15510 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
15520 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d  NOINLINE handleM
15530 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43  ovedCursor(VdbeC
15540 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ursor *p){.  int
15550 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c   isDifferentRow,
15560 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
15570 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  ->pCursor!=0 );.
15580 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15590 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
155a0 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29  oved(p->pCursor)
155b0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
155c0 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
155d0 74 6f 72 65 28 70 2d 3e 70 43 75 72 73 6f 72 2c  tore(p->pCursor,
155e0 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77   &isDifferentRow
155f0 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61  );.  p->cacheSta
15600 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
15610 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66 65  E;.  if( isDiffe
15620 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c  rentRow ) p->nul
15630 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74 75  lRow = 1;.  retu
15640 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15650 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65 20  Check to ensure 
15660 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
15670 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74 6f  is valid.  Resto
15680 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  re the cursor.**
15690 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52 65   if need be.  Re
156a0 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72  turn any I/O err
156b0 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73 74  or from the rest
156c0 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ore operation..*
156d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
156e0 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 56  eCursorRestore(V
156f0 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
15700 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
15710 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
15720 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  p->pCursor) ){. 
15730 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
15740 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
15750 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
15760 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
15770 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
15780 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79  ursor p is ready
15790 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
157a0 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69  e the row to whi
157b0 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  ch it.** was las
157c0 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52  t positioned.  R
157d0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
157e0 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61  ode if an OOM fa
157f0 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72  ult or I/O error
15800 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20  .** prevents us 
15810 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67  from positioning
15820 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69   the cursor to i
15830 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74  ts correct posit
15840 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ion..**.** If a 
15850 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
15860 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
15870 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
15880 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
15890 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66   MoveTo now.  If
158a0 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64   no move is pend
158b0 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  ing, check to se
158c0 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73  e if the row has
158d0 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64   been.** deleted
158e0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
158f0 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69  the cursor and i
15900 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74  f it has, mark t
15910 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e  he row as.** a N
15920 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49  ULL row..**.** I
15930 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
15940 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
15950 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
15960 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77  row and that row
15970 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e   has.** not been
15980 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
15990 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
159a0 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  or, then this ro
159b0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
159c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
159d0 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
159e0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
159f0 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72  .  if( p->deferr
15a00 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
15a10 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66  return handleDef
15a20 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a  erredMoveto(p);.
15a30 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 43 75    }.  if( p->pCu
15a40 72 73 6f 72 20 26 26 20 73 71 6c 69 74 65 33 42  rsor && sqlite3B
15a50 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
15a60 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29  ed(p->pCursor) )
15a70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e  {.    return han
15a80 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70  dleMovedCursor(p
15a90 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
15aa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15ab0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
15ac0 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  g functions:.**.
15ad0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
15ae0 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71  rialType().** sq
15af0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
15b00 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ypeLen().** sqli
15b10 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e  te3VdbeSerialLen
15b20 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
15b30 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20  eSerialPut().** 
15b40 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
15b50 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  lGet().**.** enc
15b60 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
15b70 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
15b80 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
15b90 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
15ba0 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
15bb0 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
15bc0 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
15bd0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
15be0 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
15bf0 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
15c00 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
15c10 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
15c20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
15c30 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
15c40 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
15c50 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
15c60 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
15c70 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
15c80 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
15c90 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
15ca0 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
15cb0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
15cc0 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
15cd0 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
15ce0 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
15cf0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
15d00 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
15d10 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
15d20 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
15d30 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
15d40 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
15d50 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
15d60 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
15d70 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
15d80 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e  blob separately.
15d90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
15da0 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
15db0 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
15dc0 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
15dd0 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
15de0 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
15df0 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
15e00 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
15e10 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
15e20 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
15e30 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
15e40 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
15e50 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
15e60 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
15e70 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20      NULL.**     
15e80 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
15e90 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
15ea0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
15eb0 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20  er.**      2    
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ed0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69   2            si
15ee0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
15ef0 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
15f00 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20             3    
15f10 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
15f20 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34  nteger.**      4
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f40 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
15f50 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
15f60 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20  .**      5      
15f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
15f80 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
15f90 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
15fa0 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
15fb0 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
15fc0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
15fd0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20  eger.**      7  
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ff0 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
16000 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20  IEEE float.**   
16010 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
16020 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
16030 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
16040 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20  nstant 0.**     
16050 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20   9              
16060 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
16070 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
16080 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30  tant 1.**     10
16090 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ,11             
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160b0 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
160c0 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
160d0 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
160e0 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
160f0 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
16100 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
16110 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
16120 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54      text.**.** T
16130 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73  he 8 and 9 types
16140 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33   were added in 3
16150 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61  .3.0, file forma
16160 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73  t 4.  Prior vers
16170 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
16180 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72  e will not under
16190 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69  stand those seri
161a0 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a  al types..*/../*
161b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
161c0 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
161d0 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
161e0 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
161f0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
16200 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  lType(Mem *pMem,
16210 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
16220 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
16230 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
16240 75 33 32 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c  u32 n;..  if( fl
16250 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
16260 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16270 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
16280 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  M_Int ){.    /* 
16290 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
162a0 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
162b0 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
162c0 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
162d0 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
162e0 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32  )0x00008000)<<32
162f0 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
16300 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
16310 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69  u64 u;.    if( i
16320 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20  <0 ){.      u = 
16330 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ~i;.    }else{. 
16340 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20       u = i;.    
16350 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  }.    if( u<=127
16360 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16370 20 28 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69   ((i&1)==i && fi
16380 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20  le_format>=4) ? 
16390 38 2b 28 75 33 32 29 75 20 3a 20 31 3b 0a 20 20  8+(u32)u : 1;.  
163a0 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33    }.    if( u<=3
163b0 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b  2767 ) return 2;
163c0 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38  .    if( u<=8388
163d0 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a  607 ) return 3;.
163e0 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34      if( u<=21474
163f0 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34  83647 ) return 4
16400 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58  ;.    if( u<=MAX
16410 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20  _6BYTE ) return 
16420 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b  5;.    return 6;
16430 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
16440 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20  &MEM_Real ){.   
16450 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
16460 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
16470 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
16480 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  || flags&(MEM_St
16490 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
164a0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
164b0 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33  >=0 );.  n = (u3
164c0 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  2)pMem->n;.  if(
164d0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
164e0 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
164f0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d  em->u.nZero;.  }
16500 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29  .  return ((n*2)
16510 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26   + 12 + ((flags&
16520 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d  MEM_Str)!=0));.}
16530 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
16540 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
16550 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64   data correspond
16560 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
16570 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e  ied serial-type.
16580 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
16590 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
165a0 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
165b0 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  ){.  if( serial_
165c0 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
165d0 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
165e0 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c  ype-12)/2;.  }el
165f0 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  se{.    static c
16600 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20  onst u8 aSize[] 
16610 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20  = { 0, 1, 2, 3, 
16620 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30  4, 6, 8, 8, 0, 0
16630 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65  , 0, 0 };.    re
16640 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61  turn aSize[seria
16650 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a  l_type];.  }.}..
16660 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
16670 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75  on an architectu
16680 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e  re with mixed-en
16690 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a  dian floating .*
166a0 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52  * points (ex: AR
166b0 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68  M7) then swap th
166c0 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20  e lower 4 bytes 
166d0 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70  with the .** upp
166e0 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74  er 4 bytes.  Ret
166f0 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
16700 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61  **.** For most a
16710 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68  rchitectures, th
16720 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
16730 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49  *.** (later):  I
16740 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f  t is reported to
16750 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78   me that the mix
16760 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65  ed-endian proble
16770 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20  m.** on ARM7 is 
16780 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43  an issue with GC
16790 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20  C, not with the 
167a0 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73  ARM7 chip.  It s
167b0 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72  eems.** that ear
167c0 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  ly versions of G
167d0 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77  CC stored the tw
167e0 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d  o words of a 64-
167f0 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20  bit.** float in 
16800 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e  the wrong order.
16810 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72    And that error
16820 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67   has been propag
16830 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e  ated.** ever sin
16840 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69  ce.  The blame i
16850 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
16860 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75  y with GCC, thou
16870 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74  gh..** GCC might
16880 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69   have just copyi
16890 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66  ng the problem f
168a0 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70  rom a prior comp
168b0 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c  iler..** I am al
168c0 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77  so told that new
168d0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  er versions of G
168e0 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61  CC that follow a
168f0 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42   different.** AB
16900 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f  I get the byte o
16910 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a  rder right..**.*
16920 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69  * Developers usi
16930 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20  ng SQLite on an 
16940 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70  ARM7 should comp
16950 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69  ile and run thei
16960 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e  r.** application
16970 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
16980 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74  DEBUG=1 at least
16990 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42   once.  With DEB
169a0 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73  UG.** enabled, s
169b0 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f  ome asserts belo
169c0 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68  w will ensure th
169d0 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  at the byte orde
169e0 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67  r of.** floating
169f0 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73   point values is
16a00 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20   correct..**.** 
16a10 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72  (2007-08-30)  Fr
16a20 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73  ank van Vugt has
16a30 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72   studied this pr
16a40 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a  oblem closely.**
16a50 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69   and has send hi
16a60 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68  s findings to th
16a70 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70  e SQLite develop
16a80 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77  ers.  Frank.** w
16a90 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20  rites that some 
16aa0 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66  Linux kernels of
16ab0 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  fer floating poi
16ac0 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65  nt hardware.** e
16ad0 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73  mulation that us
16ae0 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d  es only 32-bit m
16af0 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64  antissas instead
16b00 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34   of a full .** 4
16b10 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72  8-bits as requir
16b20 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73  ed by the IEEE s
16b30 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20  tandard.  (This 
16b40 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47  is the.** CONFIG
16b50 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74  _FPE_FASTFPE opt
16b60 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73  ion.)  On such s
16b70 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67  ystems, floating
16b80 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73   point.** byte s
16b90 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20  wapping becomes 
16ba0 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64  very complicated
16bb0 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62  .  To avoid prob
16bc0 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63  lems,.** the nec
16bd0 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70  essary byte swap
16be0 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20  ping is carried 
16bf0 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62  out using a 64-b
16c00 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61  it integer.** ra
16c10 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62  ther than a 64-b
16c20 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b  it float.  Frank
16c30 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74   assures us that
16c40 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a   the code here.*
16c50 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e  * works for him.
16c60 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f    We, the develo
16c70 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61  pers, have no wa
16c80 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74  y to independent
16c90 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69  ly.** verify thi
16ca0 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65  s, but Frank see
16cb0 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20  ms to know what 
16cc0 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62  he is talking ab
16cd0 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75  out.** so we tru
16ce0 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65  st him..*/.#ifde
16cf0 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
16d00 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
16d10 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f  T.static u64 flo
16d20 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a  atSwap(u64 in){.
16d30 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36    union {.    u6
16d40 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32  4 r;.    u32 i[2
16d50 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20  ];.  } u;.  u32 
16d60 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a  t;..  u.r = in;.
16d70 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20    t = u.i[0];.  
16d80 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b  u.i[0] = u.i[1];
16d90 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20  .  u.i[1] = t;. 
16da0 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23   return u.r;.}.#
16db0 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
16dc0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20  dEndianFloat(X) 
16dd0 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58   X = floatSwap(X
16de0 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
16df0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
16e00 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a  Float(X).#endif.
16e10 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
16e20 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61   serialized data
16e30 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61   blob for the va
16e40 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
16e50 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e  em into .** buf.
16e60 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
16e70 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
16e80 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66  as allocated suf
16e90 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a  ficient space..*
16ea0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
16eb0 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
16ec0 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66  tten..**.** nBuf
16ed0 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   is the amount o
16ee0 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20  f space left in 
16ef0 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c  buf[].  The call
16f00 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
16f10 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74  e.** for allocat
16f20 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65  ing enough space
16f30 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c   to buf[] to hol
16f40 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65  d the entire fie
16f50 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  ld, exclusive.**
16f60 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e   of the pMem->u.
16f70 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20  nZero bytes for 
16f80 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65  a MEM_Zero value
16f90 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
16fa0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
16fb0 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  es actually writ
16fc0 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20  ten into buf[]. 
16fd0 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   The number.** o
16fe0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a  f bytes in the z
16ff0 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20  ero-filled tail 
17000 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  is included in t
17010 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
17020 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65  only.** if those
17030 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f   bytes were zero
17040 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20  ed in buf[]..*/ 
17050 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
17060 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75  SerialPut(u8 *bu
17070 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33  f, Mem *pMem, u3
17080 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
17090 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a    u32 len;..  /*
170a0 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61   Integer and Rea
170b0 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  l */.  if( seria
170c0 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72  l_type<=7 && ser
170d0 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20  ial_type>0 ){.  
170e0 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32    u64 v;.    u32
170f0 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   i;.    if( seri
17100 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
17110 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
17120 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d  of(v)==sizeof(pM
17130 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20  em->u.r) );.    
17140 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d    memcpy(&v, &pM
17150 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28  em->u.r, sizeof(
17160 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d  v));.      swapM
17170 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
17180 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
17190 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75       v = pMem->u
171a0 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  .i;.    }.    le
171b0 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56  n = i = sqlite3V
171c0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
171d0 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
171e0 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
171f0 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
17200 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28  buf[--i] = (u8)(
17210 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76  v&0xFF);.      v
17220 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69   >>= 8;.    }whi
17230 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74  le( i );.    ret
17240 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
17250 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
17260 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
17270 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
17280 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
17290 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
172a0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
172b0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20  em->u.nZero:0). 
172c0 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28              == (
172d0 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53  int)sqlite3VdbeS
172e0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
172f0 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20  ial_type) );.   
17300 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
17310 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20      memcpy(buf, 
17320 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
17330 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
17340 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
17350 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
17360 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
17370 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22  .}../* Input "x"
17380 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   is a sequence o
17390 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61  f unsigned chara
173a0 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65  cters that repre
173b0 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e  sent a.** big-en
173c0 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52  dian integer.  R
173d0 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61  eturn the equiva
173e0 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65  lent native inte
173f0 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f  ger.*/.#define O
17400 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  NE_BYTE_INT(x)  
17410 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23    ((i8)(x)[0]).#
17420 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f  define TWO_BYTE_
17430 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28  INT(x)    (256*(
17440 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b  i8)((x)[0])|(x)[
17450 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45  1]).#define THRE
17460 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28  E_BYTE_INT(x)  (
17470 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30  65536*(i8)((x)[0
17480 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28  ])|((x)[1]<<8)|(
17490 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[2]).#define F
174a0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29  OUR_BYTE_UINT(x)
174b0 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c    (((u32)(x)[0]<
174c0 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  <24)|((x)[1]<<16
174d0 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
174e0 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[3]).#define FO
174f0 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28  UR_BYTE_INT(x) (
17500 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78  16777216*(i8)((x
17510 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  )[0])|((x)[1]<<1
17520 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
17530 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  x)[3])../*.** De
17540 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
17550 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
17560 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
17570 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
17580 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
17590 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
175a0 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
175b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
175c0 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
175d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
175e0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77  mplemented as tw
175f0 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  o separate routi
17600 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61  nes for performa
17610 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20  nce..** The few 
17620 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69  cases that requi
17630 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  re local variabl
17640 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75  es are broken ou
17650 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74  t into a separat
17660 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20  e.** routine so 
17670 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73  that in most cas
17680 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  es the overhead 
17690 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74  of moving the st
176a0 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69  ack pointer.** i
176b0 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73  s avoided..*/ .s
176c0 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54 45  tatic u32 SQLITE
176d0 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c  _NOINLINE serial
176e0 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
176f0 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
17700 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
17710 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
17720 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
17730 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
17740 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
17750 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
17760 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
17770 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
17780 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
17790 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
177a0 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
177b0 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
177c0 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20  YTE_UINT(buf);. 
177d0 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59   u32 y = FOUR_BY
177e0 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a  TE_UINT(buf+4);.
177f0 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20    x = (x<<32) + 
17800 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  y;.  if( serial_
17810 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f  type==6 ){.    /
17820 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
17830 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c  -29851-52272 Val
17840 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
17850 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  an 64-bit.    **
17860 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
17870 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
17880 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
17890 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d  64*)&x;.    pMem
178a0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
178b0 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  t;.    testcase(
178c0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
178d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
178e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
178f0 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65  7343-49114 Value
17900 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
17910 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20 36   IEEE 754-2008 6
17920 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f  4-bit.    ** flo
17930 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62  ating point numb
17940 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  er. */.#if !defi
17950 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
17960 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
17970 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
17980 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  NT).    /* Verif
17990 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
179a0 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
179b0 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
179c0 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79  e same.    ** by
179d0 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
179e0 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
179f0 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
17a00 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a  _FLOAT is.    **
17a10 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
17a20 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
17a30 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
17a40 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
17a50 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a  ** endian..    *
17a60 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
17a70 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
17a80 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
17a90 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  2;.    static co
17aa0 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
17ab0 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20  1.0;.    u64 t2 
17ac0 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69  = t1;.    swapMi
17ad0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
17ae0 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2);.    assert( 
17af0 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
17b00 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
17b10 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
17b20 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
17b30 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
17b40 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
17b50 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
17b60 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70  )==8 );.    swap
17b70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
17b80 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (x);.    memcpy(
17b90 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20  &pMem->u.r, &x, 
17ba0 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
17bb0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71  pMem->flags = sq
17bc0 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d  lite3IsNaN(pMem-
17bd0 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  >u.r) ? MEM_Null
17be0 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d   : MEM_Real;.  }
17bf0 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75  .  return 8;.}.u
17c00 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
17c10 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
17c20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17c30 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
17c40 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
17c50 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
17c60 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
17c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
17c80 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
17c90 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
17ca0 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
17cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
17cc0 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
17cd0 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
17ce0 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
17cf0 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
17d00 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
17d10 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
17d20 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
17d30 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
17d40 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
17d50 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
17d60 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f  0: {  /* Null */
17d70 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
17d80 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30  CE-OF: R-24078-0
17d90 39 33 37 35 20 56 61 6c 75 65 20 69 73 20 61 20  9375 Value is a 
17da0 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70  NULL. */.      p
17db0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
17dc0 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
17dd0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
17de0 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  se 1: {.      /*
17df0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17e00 34 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75  44885-25196 Valu
17e10 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77  e is an 8-bit tw
17e20 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20  os-complement.  
17e30 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
17e40 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
17e50 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  .i = ONE_BYTE_IN
17e60 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
17e70 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
17e80 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
17e90 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
17ea0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
17eb0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
17ec0 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
17ed0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
17ee0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
17ef0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39  DENCE-OF: R-4979
17f00 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69 73  4-35026 Value is
17f10 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36   a big-endian 16
17f20 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
17f30 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
17f40 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
17f50 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f  pMem->u.i = TWO_
17f60 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
17f70 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
17f80 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
17f90 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
17fa0 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
17fb0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
17fc0 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
17fd0 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
17fe0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
17ff0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
18000 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56   R-37839-54301 V
18010 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
18020 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20  dian 24-bit.    
18030 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
18040 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
18050 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
18060 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
18070 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
18080 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
18090 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
180a0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
180b0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
180c0 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
180d0 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
180e0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
180f0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
18100 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34  DENCE-OF: R-0184
18110 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69 73  9-26079 Value is
18120 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32   a big-endian 32
18130 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
18140 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
18150 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
18160 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
18170 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
18180 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
18190 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
181a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
181b0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
181c0 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
181d0 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
181e0 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
181f0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
18200 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
18210 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20  : R-50385-09674 
18220 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
18230 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20  ndian 48-bit.   
18240 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
18250 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
18260 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
18270 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  i = FOUR_BYTE_UI
18280 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69  NT(buf+2) + (((i
18290 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
182a0 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
182b0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
182c0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
182d0 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
182e0 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
182f0 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a  return 6;.    }.
18300 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a      case 6:   /*
18310 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
18320 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61  nteger */.    ca
18330 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20  se 7: { /* IEEE 
18340 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a  floating point *
18350 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65  /.      /* These
18360 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61   use local varia
18370 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d  bles, so do them
18380 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 72   in a separate r
18390 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
183a0 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20  to avoid having 
183b0 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d  to move the fram
183c0 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  e pointer in the
183d0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
183e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 72        return ser
183f0 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61  ialGet(buf,seria
18400 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20  l_type,pMem);.  
18410 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
18420 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
18430 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
18440 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
18450 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
18460 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d  NCE-OF: R-12976-
18470 32 32 38 39 33 20 56 61 6c 75 65 20 69 73 20 74  22893 Value is t
18480 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f  he integer 0. */
18490 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
184a0 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31  CE-OF: R-18143-1
184b0 32 31 32 31 20 56 61 6c 75 65 20 69 73 20 74 68  2121 Value is th
184c0 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a  e integer 1. */.
184d0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
184e0 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
184f0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
18500 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
18510 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18520 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
18530 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
18540 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36  ENCE-OF: R-14606
18550 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69 73 20  -31564 Value is 
18560 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28  a BLOB that is (
18570 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e  N-12)/2 bytes in
18580 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68  .      ** length
18590 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  ..      ** EVIDE
185a0 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d  NCE-OF: R-28401-
185b0 30 30 31 34 30 20 56 61 6c 75 65 20 69 73 20 61  00140 Value is a
185c0 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74   string in the t
185d0 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64  ext encoding and
185e0 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29  .      ** (N-13)
185f0 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  /2 bytes in leng
18600 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61  th. */.      sta
18610 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46  tic const u16 aF
18620 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c  lag[] = { MEM_Bl
18630 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45  ob|MEM_Ephem, ME
18640 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20  M_Str|MEM_Ephem 
18650 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  };.      pMem->z
18660 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
18670 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
18680 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
18690 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
186a0 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65  flags = aFlag[se
186b0 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20  rial_type&1];.  
186c0 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d      return pMem-
186d0 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  >n;.    }.  }.  
186e0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a  return 0;.}./*.*
186f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
18700 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
18710 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  te sufficient sp
18720 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63  ace for an Unpac
18730 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
18740 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f  ucture large eno
18750 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77  ugh to be used w
18760 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52  ith sqlite3VdbeR
18770 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66  ecordUnpack() if
18780 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
18790 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
187a0 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73  ter to KeyInfo s
187b0 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66  tructure pKeyInf
187c0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61  o..**.** The spa
187d0 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c  ce is either all
187e0 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ocated using sql
187f0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
18800 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e  ) or from within
18810 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65  .** the unaligne
18820 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  d buffer passed 
18830 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61  via the second a
18840 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  nd third argumen
18850 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a  ts (presumably.*
18860 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20  * stack space). 
18870 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74  If the former, t
18880 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73  hen *ppFree is s
18890 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20  et to a pointer 
188a0 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
188b0 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
188c0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
188d0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
188e0 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74  Free(). Or, if t
188f0 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  he .** allocatio
18900 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65  n comes from the
18910 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20   pSpace/szSpace 
18920 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20  buffer, *ppFree 
18930 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
18940 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
18950 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
18960 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
18970 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
18980 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52  ed..*/.UnpackedR
18990 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64  ecord *sqlite3Vd
189a0 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
189b0 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f  ecord(.  KeyInfo
189c0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
189d0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63           /* Desc
189e0 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ription of the r
189f0 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20  ecord */.  char 
18a00 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  *pSpace,        
18a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
18a20 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76  aligned space av
18a30 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ailable */.  int
18a40 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20   szSpace,       
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18a60 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d  Size of pSpace[]
18a70 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
18a80 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20  har **ppFree    
18a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18aa0 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68  * OUT: Caller sh
18ab0 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70  ould free this p
18ac0 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55  ointer */.){.  U
18ad0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
18ae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
18af0 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  * Unpacked recor
18b00 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  d to return */. 
18b10 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20   int nOff;      
18b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b30 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53   /* Increment pS
18b40 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20  pace by nOff to 
18b50 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e  align it */.  in
18b60 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
18b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18b80 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
18b90 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70   required for *p
18ba0 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e   */..  /* We wan
18bb0 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70  t to shift the p
18bc0 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70  ointer pSpace up
18bd0 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73   such that it is
18be0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e   8-byte aligned.
18bf0 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e  .  ** Thus, we n
18c00 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  eed to calculate
18c10 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20   a value, nOff, 
18c20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c  between 0 and 7,
18c30 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20   to shift .  ** 
18c40 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63  it by.  If pSpac
18c50 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62  e is already 8-b
18c60 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66  yte aligned, nOf
18c70 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f  f should be zero
18c80 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20  ..  */.  nOff = 
18c90 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52  (8 - (SQLITE_PTR
18ca0 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20  _TO_INT(pSpace) 
18cb0 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79  & 7)) & 7;.  nBy
18cc0 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
18cd0 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
18ce0 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
18cf0 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
18d00 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42  eld+1);.  if( nB
18d10 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66  yte>szSpace+nOff
18d20 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70   ){.    p = (Unp
18d30 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71  ackedRecord *)sq
18d40 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
18d50 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
18d60 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72  Byte);.    *ppFr
18d70 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a  ee = (char *)p;.
18d80 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74      if( !p ) ret
18d90 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
18da0 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
18db0 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65  dRecord*)&pSpace
18dc0 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46  [nOff];.    *ppF
18dd0 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ree = 0;.  }..  
18de0 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29  p->aMem = (Mem*)
18df0 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
18e00 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
18e10 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
18e20 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
18e30 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
18e40 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20  ;.  p->pKeyInfo 
18e50 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d  = pKeyInfo;.  p-
18e60 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e  >nField = pKeyIn
18e70 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a  fo->nField + 1;.
18e80 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
18e90 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
18ea0 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e  Key-byte encodin
18eb0 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e  g of a record in
18ec0 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74   pKey[], populat
18ed0 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b  e the .** Unpack
18ee0 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
18ef0 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  re indicated by 
18f00 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
18f10 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ent with the.** 
18f20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
18f30 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a  decoded record..
18f40 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
18f50 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
18f60 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
18f70 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e  yInfo,     /* In
18f80 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
18f90 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  the record forma
18fa0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18fc0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e   Size of the bin
18fd0 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
18fe0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
18ff0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69  ,      /* The bi
19000 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
19010 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
19020 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c  *p      /* Popul
19030 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ate this structu
19040 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  re before return
19050 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ing. */.){.  con
19060 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
19070 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
19080 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
19090 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a  pKey;.  int d; .
190a0 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20    u32 idx;      
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190c0 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61    /* Offset in a
190d0 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72  Key[] to read fr
190e0 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20  om */.  u16 u;  
190f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19100 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
19110 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
19120 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
19130 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70  .  Mem *pMem = p
19140 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65  ->aMem;..  p->de
19150 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20  fault_rc = 0;.  
19160 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
19170 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65  TE_ALIGNMENT(pMe
19180 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65  m) );.  idx = ge
19190 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
191a0 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
191b0 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20  Hdr;.  u = 0;.  
191c0 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
191d0 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20   && d<=nKey ){. 
191e0 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
191f0 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20  pe;..    idx += 
19200 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
19210 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74  y[idx], serial_t
19220 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ype);.    pMem->
19230 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
19240 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64  enc;.    pMem->d
19250 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
19260 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66  ;.    /* pMem->f
19270 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c  lags = 0; // sql
19280 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
19290 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69  t() will set thi
192a0 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  s for us */.    
192b0 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d  pMem->szMalloc =
192c0 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c   0;.    d += sql
192d0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
192e0 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69  t(&aKey[d], seri
192f0 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a  al_type, pMem);.
19300 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20      pMem++;.    
19310 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46  if( (++u)>=p->nF
19320 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  ield ) break;.  
19330 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70  }.  assert( u<=p
19340 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
19350 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65  + 1 );.  p->nFie
19360 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20 53  ld = u;.}..#if S
19370 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
19380 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
19390 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64  compares two ind
193a0 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f  ex or table reco
193b0 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73  rd keys in the s
193c0 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68  ame way.** as th
193d0 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  e sqlite3VdbeRec
193e0 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75  ordCompare() rou
193f0 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62  tine. Unlike Vdb
19400 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
19410 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
19420 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20  on deserializes 
19430 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c  and compares val
19440 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ues using the.**
19450 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
19460 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  alGet() and sqli
19470 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20  te3MemCompare() 
19480 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73  functions. It is
19490 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65   used.** in asse
194a0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
194b0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
194c0 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64  he optimized cod
194d0 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56  e in.** sqlite3V
194e0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
194f0 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c  () returns resul
19500 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74 77  ts with these tw
19510 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a  o primitives..**
19520 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
19530 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  if the result of
19540 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65   comparison is e
19550 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73  quivalent to des
19560 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52  iredResult..** R
19570 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74  eturn false if t
19580 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67 72  here is a disagr
19590 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  eement..*/.stati
195a0 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
195b0 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20  CompareDebug(.  
195c0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
195d0 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
195e0 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63   Left key */.  c
195f0 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63  onst UnpackedRec
19600 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20  ord *pPKey2, /* 
19610 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
19620 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  nt desiredResult
19630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19640 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a  Correct answer *
19650 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
19660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
19670 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
19680 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
19690 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
196a0 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x1;          /* 
196b0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
196c0 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
196d0 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
196e0 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
196f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
19700 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
19710 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
19720 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
19730 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
19740 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
19750 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
19760 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49   *)pKey1;.  KeyI
19770 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
19780 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b   Mem mem1;..  pK
19790 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
197a0 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28  >pKeyInfo;.  if(
197b0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30   pKeyInfo->db==0
197c0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
197d0 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
197e0 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e  fo->enc;.  mem1.
197f0 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
19800 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61  b;.  /* mem1.fla
19810 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c  gs = 0;  // Will
19820 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
19830 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  by sqlite3VdbeSe
19840 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56  rialGet() */.  V
19850 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
19860 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
19870 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
19880 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
19890 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  nts */..  /* Com
198a0 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c  pilers may compl
198b0 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e  ain that mem1.u.
198c0 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79  i is potentially
198d0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
198e0 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e    ** We could in
198f0 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20  itialize it, as 
19900 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73  shown here, to s
19910 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d  ilence those com
19920 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75  plaints..  ** Bu
19930 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e  t in fact, mem1.
19940 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  u.i will never a
19950 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ctually be used 
19960 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61  uninitialized, a
19970 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74  nd doing .  ** t
19980 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69  he unnecessary i
19990 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61  nitialization ha
199a0 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e  s a measurable n
199b0 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61  egative performa
199c0 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c  nce.  ** impact,
199d0 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
199e0 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69  ine is a very hi
199f0 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20  gh runner.  And 
19a00 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20  so, we choose.  
19a10 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
19a20 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
19a30 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69  gs and leave thi
19a40 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69  s variable unini
19a50 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
19a60 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20   /*  mem1.u.i = 
19a70 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65  0;  // not neede
19a80 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
19a90 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
19aa0 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31  ing */.  .  idx1
19ab0 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
19ac0 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
19ad0 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
19ae0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
19af0 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66  ->nField+pKeyInf
19b00 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65  o->nXField>=pPKe
19b10 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f  y2->nField || CO
19b20 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
19b30 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
19b40 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
19b50 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
19b60 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b  nfo->nField>0 );
19b70 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c  .  assert( idx1<
19b80 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55  =szHdr1 || CORRU
19b90 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20  PT_DB );.  do{. 
19ba0 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
19bb0 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  pe1;..    /* Rea
19bc0 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  d the serial typ
19bd0 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  es for the next 
19be0 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20  element in each 
19bf0 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31  key. */.    idx1
19c00 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
19c10 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72   aKey1+idx1, ser
19c20 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20  ial_type1 );..  
19c30 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
19c40 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
19c50 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61 69   key space remai
19c60 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20  ning to avoid.  
19c70 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76    ** a buffer ov
19c80 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64 31  erread.  The "d1
19c90 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22  +serial_type1+2"
19ca0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77   subexpression w
19cb0 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  ill.    ** alway
19cc0 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  s be greater tha
19cd0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
19ce0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75  e amount of requ
19cf0 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a  ired key space..
19d00 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20      ** Use that 
19d10 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f  approximation to
19d20 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20   avoid the more 
19d30 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74  expensive call t
19d40 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
19d50 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
19d60 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  n() in the commo
19d70 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  n case..    */. 
19d80 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c     if( d1+serial
19d90 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b  _type1+2>(u32)nK
19da0 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73  ey1.     && d1+s
19db0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
19dc0 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
19dd0 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31  ype1)>(u32)nKey1
19de0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62   .    ){.      b
19df0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
19e00 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
19e10 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d  values to be com
19e20 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  pared..    */.  
19e30 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
19e40 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
19e50 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
19e60 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a  type1, &mem1);..
19e70 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
19e80 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a  mparison.    */.
19e90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19ea0 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
19eb0 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  , &pPKey2->aMem[
19ec0 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  i], pKeyInfo->aC
19ed0 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  oll[i]);.    if(
19ee0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
19ef0 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
19f00 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
19f10 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
19f20 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  w */.      if( p
19f30 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
19f40 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
19f50 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20    rc = -rc;  /* 
19f60 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c  Invert the resul
19f70 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20  t for DESC sort 
19f80 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  order. */.      
19f90 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62  }.      goto deb
19fa0 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20  ugCompareEnd;.  
19fb0 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
19fc0 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
19fd0 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
19fe0 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20  nField );..  /* 
19ff0 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  No memory alloca
1a000 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65  tion is ever use
1a010 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76  d on mem1.  Prov
1a020 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a  e this using.  *
1a030 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
1a040 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68  assert().  If th
1a050 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73  e assert() fails
1a060 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61  , it indicates a
1a070 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61  .  ** memory lea
1a080 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20  k and a need to 
1a090 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  call sqlite3Vdbe
1a0a0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
1a0b0 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
1a0c0 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1a0d0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d  =0 );..  /* rc==
1a0e0 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61  0 here means tha
1a0f0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79  t one of the key
1a100 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
1a110 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c  lds and.  ** all
1a120 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74   the fields up t
1a130 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72  o that point wer
1a140 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20  e equal. Return 
1a150 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20  the default_rc. 
1a160 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20   ** value.  */. 
1a170 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65   rc = pPKey2->de
1a180 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67  fault_rc;..debug
1a190 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66  CompareEnd:.  if
1a1a0 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d  ( desiredResult=
1a1b0 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65  =0 && rc==0 ) re
1a1c0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65  turn 1;.  if( de
1a1d0 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26  siredResult<0 &&
1a1e0 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31   rc<0 ) return 1
1a1f0 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52  ;.  if( desiredR
1a200 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20  esult>0 && rc>0 
1a210 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1a220 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
1a230 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
1a240 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c  KeyInfo->db->mal
1a250 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1a260 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
1a270 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1a280 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1a290 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
1a2a0 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61  ber of fields (a
1a2b0 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69  .k.a. columns) i
1a2c0 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76  n the record giv
1a2d0 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b  en by.** pKey,nK
1a2e0 65 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20  ey.  The verify 
1a2f0 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20  that this count 
1a300 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
1a310 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20  equal to the.** 
1a320 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70  limit given by p
1a330 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
1a340 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  + pKeyInfo->nXFi
1a350 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eld..**.** If th
1a360 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  is constraint is
1a370 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20   not satisfied, 
1a380 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1a390 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20  e high-speed.** 
1a3a0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1a3b0 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52  eInt() and vdbeR
1a3c0 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
1a3d0 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69  ng() routines wi
1a3e0 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63  ll.** not work c
1a3f0 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68  orrectly.  If th
1a400 69 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72  is assert() ever
1a410 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61   fires, it proba
1a420 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61  bly means.** tha
1a430 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46  t the KeyInfo.nF
1a440 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e  ield or KeyInfo.
1a450 6e 58 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77  nXField values w
1a460 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20  ere computed.** 
1a470 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  incorrectly..*/.
1a480 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
1a490 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1a4a0 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20  WithinLimits(.  
1a4b0 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20  int nKey, const 
1a4c0 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
1a4d0 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76   The record to v
1a4e0 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73  erify */ .  cons
1a4f0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1a500 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  nfo       /* Com
1a510 70 61 72 65 20 73 69 7a 65 20 77 69 74 68 20 74  pare size with t
1a520 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29  his KeyInfo */.)
1a530 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d  {.  int nField =
1a540 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   0;.  u32 szHdr;
1a550 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33  .  u32 idx;.  u3
1a560 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e  2 notUsed;.  con
1a570 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1a580 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
1a590 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
1a5a0 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52  Key;..  if( CORR
1a5b0 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b  UPT_DB ) return;
1a5c0 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69  .  idx = getVari
1a5d0 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
1a5e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65  );.  assert( nKe
1a5f0 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y>=0 );.  assert
1a600 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b  ( szHdr<=(u32)nK
1a610 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69  ey );.  while( i
1a620 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20  dx<szHdr ){.    
1a630 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
1a640 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74  32(aKey+idx, not
1a650 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c  Used);.    nFiel
1a660 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  d++;.  }.  asser
1a670 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65  t( nField <= pKe
1a680 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b  yInfo->nField+pK
1a690 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20  eyInfo->nXField 
1a6a0 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
1a6b0 69 6e 65 20 76 64 62 65 41 73 73 65 72 74 46 69  ine vdbeAssertFi
1a6c0 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1a6d0 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64  mits(A,B,C).#end
1a6e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a  if../*.** Both *
1a6f0 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32  pMem1 and *pMem2
1a700 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20   contain string 
1a710 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20  values. Compare 
1a720 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  the two values.*
1a730 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  * using the coll
1a740 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70  ation sequence p
1a750 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20  Coll. As usual, 
1a760 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  return a negativ
1a770 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  e , zero.** or p
1a780 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66  ositive value if
1a790 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20   *pMem1 is less 
1a7a0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
1a7b0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a  r greater than .
1a7c0 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65  ** *pMem2, respe
1a7d0 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72  ctively. Similar
1a7e0 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72   in spirit to "r
1a7f0 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28  c = (*pMem1) - (
1a800 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74  *pMem2);"..*/.st
1a810 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d  atic int vdbeCom
1a820 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20  pareMemString(. 
1a830 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1a840 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  1,.  const Mem *
1a850 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43  pMem2,.  const C
1a860 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20  ollSeq *pColl,. 
1a870 20 75 38 20 2a 70 72 63 45 72 72 20 20 20 20 20   u8 *prcErr     
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a890 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63   /* If an OOM oc
1a8a0 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c  curs, set to SQL
1a8b0 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a  ITE_NOMEM */.){.
1a8c0 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63    if( pMem1->enc
1a8d0 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a  ==pColl->enc ){.
1a8e0 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e      /* The strin
1a8f0 67 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  gs are already i
1a900 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e  n the correct en
1a910 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68  coding.  Call th
1a920 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72  e.     ** compar
1a930 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69  ison function di
1a940 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65  rectly */.    re
1a950 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  turn pColl->xCmp
1a960 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d  (pColl->pUser,pM
1a970 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c  em1->n,pMem1->z,
1a980 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e  pMem2->n,pMem2->
1a990 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
1a9a0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e   int rc;.    con
1a9b0 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32  st void *v1, *v2
1a9c0 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32  ;.    int n1, n2
1a9d0 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20  ;.    Mem c1;.  
1a9e0 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71    Mem c2;.    sq
1a9f0 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
1aa00 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c  (&c1, pMem1->db,
1aa10 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20   MEM_Null);.    
1aa20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1aa30 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64  it(&c2, pMem1->d
1aa40 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  b, MEM_Null);.  
1aa50 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1aa60 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c  ShallowCopy(&c1,
1aa70 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65   pMem1, MEM_Ephe
1aa80 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  m);.    sqlite3V
1aa90 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70  dbeMemShallowCop
1aaa0 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45  y(&c2, pMem2, ME
1aab0 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31  M_Ephem);.    v1
1aac0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
1aad0 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ext((sqlite3_val
1aae0 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e  ue*)&c1, pColl->
1aaf0 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76  enc);.    n1 = v
1ab00 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b  1==0 ? 0 : c1.n;
1ab10 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65  .    v2 = sqlite
1ab20 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69  3ValueText((sqli
1ab30 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20  te3_value*)&c2, 
1ab40 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20  pColl->enc);.   
1ab50 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20   n2 = v2==0 ? 0 
1ab60 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d  : c2.n;.    rc =
1ab70 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
1ab80 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76  ll->pUser, n1, v
1ab90 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20  1, n2, v2);.    
1aba0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1abb0 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20  lease(&c1);.    
1abc0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1abd0 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20  lease(&c2);.    
1abe0 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32  if( (v1==0 || v2
1abf0 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72 20 29  ==0) && prcErr )
1ac00 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54   *prcErr = SQLIT
1ac10 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74  E_NOMEM;.    ret
1ac20 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  urn rc;.  }.}../
1ac30 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  *.** Compare two
1ac40 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20   blobs.  Return 
1ac50 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
1ac60 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74  or positive if t
1ac70 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c  he first.** is l
1ac80 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1ac90 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
1aca0 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20  han the second, 
1acb0 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
1acc0 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20   If one blob is 
1acd0 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  a prefix of the 
1ace0 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20  other, then the 
1acf0 73 68 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c  shorter is the l
1ad00 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  essor..*/.static
1ad10 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
1ad20 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62   int sqlite3Blob
1ad30 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65  Compare(const Me
1ad40 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65  m *pB1, const Me
1ad50 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63  m *pB2){.  int c
1ad60 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a   = memcmp(pB1->z
1ad70 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e  , pB2->z, pB1->n
1ad80 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e  >pB2->n ? pB2->n
1ad90 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69 66   : pB1->n);.  if
1ada0 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a  ( c ) return c;.
1adb0 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e 20    return pB1->n 
1adc0 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 0a 2f 2a  - pB2->n;.}.../*
1add0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
1ade0 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64  values contained
1adf0 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f   by the two memo
1ae00 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e  ry cells, return
1ae10 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c  ing.** negative,
1ae20 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76   zero or positiv
1ae30 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65  e if pMem1 is le
1ae40 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1ae50 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a  o, or greater.**
1ae60 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72   than pMem2. Sor
1ae70 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55  ting order is NU
1ae80 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c  LL's first, foll
1ae90 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20  owed by numbers 
1aea0 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64  (integers.** and
1aeb0 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e   reals) sorted n
1aec0 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c  umerically, foll
1aed0 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64  owed by text ord
1aee0 65 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c  ered by the coll
1aef0 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
1af00 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61  e pColl and fina
1af10 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72  lly blob's order
1af20 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a  ed by memcmp()..
1af30 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76  **.** Two NULL v
1af40 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64  alues are consid
1af50 65 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68  ered equal by th
1af60 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
1af70 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  int sqlite3MemCo
1af80 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20  mpare(const Mem 
1af90 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65  *pMem1, const Me
1afa0 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20  m *pMem2, const 
1afb0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b  CollSeq *pColl){
1afc0 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20  .  int f1, f2;. 
1afd0 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   int combined_fl
1afe0 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65  ags;..  f1 = pMe
1aff0 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20  m1->flags;.  f2 
1b000 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a  = pMem2->flags;.
1b010 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73    combined_flags
1b020 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65   = f1|f2;.  asse
1b030 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c  rt( (combined_fl
1b040 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
1b050 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49  )==0 );. .  /* I
1b060 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e  f one value is N
1b070 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20  ULL, it is less 
1b080 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20  than the other. 
1b090 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20  If both values. 
1b0a0 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65   ** are NULL, re
1b0b0 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69  turn 0..  */.  i
1b0c0 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
1b0d0 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  s&MEM_Null ){.  
1b0e0 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d    return (f2&MEM
1b0f0 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d  _Null) - (f1&MEM
1b100 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  _Null);.  }..  /
1b110 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69  * If one value i
1b120 73 20 61 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  s a number and t
1b130 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2c  he other is not,
1b140 20 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20 6c   the number is l
1b150 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74  ess..  ** If bot
1b160 68 20 61 72 65 20 6e 75 6d 62 65 72 73 2c 20 63  h are numbers, c
1b170 6f 6d 70 61 72 65 20 61 73 20 72 65 61 6c 73 20  ompare as reals 
1b180 69 66 20 6f 6e 65 20 69 73 20 61 20 72 65 61 6c  if one is a real
1b190 2c 20 6f 72 20 61 73 20 69 6e 74 65 67 65 72 73  , or as integers
1b1a0 0a 20 20 2a 2a 20 69 66 20 62 6f 74 68 20 76 61  .  ** if both va
1b1b0 6c 75 65 73 20 61 72 65 20 69 6e 74 65 67 65 72  lues are integer
1b1c0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  s..  */.  if( co
1b1d0 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45  mbined_flags&(ME
1b1e0 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20  M_Int|MEM_Real) 
1b1f0 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 31  ){.    double r1
1b200 2c 20 72 32 3b 0a 20 20 20 20 69 66 28 20 28 66  , r2;.    if( (f
1b210 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74  1 & f2 & MEM_Int
1b220 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1b230 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70  ( pMem1->u.i < p
1b240 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
1b250 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28  rn -1;.      if(
1b260 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d   pMem1->u.i > pM
1b270 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72  em2->u.i ) retur
1b280 6e 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n 1;.      retur
1b290 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
1b2a0 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29  f( (f1&MEM_Real)
1b2b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31 20  !=0 ){.      r1 
1b2c0 3d 20 70 4d 65 6d 31 2d 3e 75 2e 72 3b 0a 20 20  = pMem1->u.r;.  
1b2d0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 31 26    }else if( (f1&
1b2e0 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
1b2f0 20 20 20 20 20 72 31 20 3d 20 28 64 6f 75 62 6c       r1 = (doubl
1b300 65 29 70 4d 65 6d 31 2d 3e 75 2e 69 3b 0a 20 20  e)pMem1->u.i;.  
1b310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1b320 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1b330 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52     if( (f2&MEM_R
1b340 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
1b350 20 72 32 20 3d 20 70 4d 65 6d 32 2d 3e 75 2e 72   r2 = pMem2->u.r
1b360 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1b370 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  (f2&MEM_Int)!=0 
1b380 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 28 64  ){.      r2 = (d
1b390 6f 75 62 6c 65 29 70 4d 65 6d 32 2d 3e 75 2e 69  ouble)pMem2->u.i
1b3a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b3b0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1b3c0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 31 3c 72    }.    if( r1<r
1b3d0 32 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  2 ) return -1;. 
1b3e0 20 20 20 69 66 28 20 72 31 3e 72 32 20 29 20 72     if( r1>r2 ) r
1b3f0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74  eturn 1;.    ret
1b400 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
1b410 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
1b420 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68   a string and th
1b430 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f  e other is a blo
1b440 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  b, the string is
1b450 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62   less..  ** If b
1b460 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c  oth are strings,
1b470 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74   compare using t
1b480 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  he collating fun
1b490 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  ctions..  */.  i
1b4a0 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
1b4b0 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  s&MEM_Str ){.   
1b4c0 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53   if( (f1 & MEM_S
1b4d0 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tr)==0 ){.      
1b4e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1b4f0 20 20 20 20 69 66 28 20 28 66 32 20 26 20 4d 45      if( (f2 & ME
1b500 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20  M_Str)==0 ){.   
1b510 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1b520 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
1b530 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65   pMem1->enc==pMe
1b540 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20 61  m2->enc );.    a
1b550 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e  ssert( pMem1->en
1b560 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  c==SQLITE_UTF8 |
1b570 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  | .            p
1b580 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
1b590 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65  E_UTF16LE || pMe
1b5a0 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1b5b0 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20  UTF16BE );..    
1b5c0 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  /* The collation
1b5d0 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62   sequence must b
1b5e0 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69  e defined at thi
1b5f0 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66  s point, even if
1b600 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72  .    ** the user
1b610 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c   deletes the col
1b620 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1b630 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20 70  after the vdbe p
1b640 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a  rogram is.    **
1b650 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20   compiled (this 
1b660 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74  was not always t
1b670 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f  he case)..    */
1b680 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43  .    assert( !pC
1b690 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43  oll || pColl->xC
1b6a0 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  mp );..    if( p
1b6b0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
1b6c0 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65  turn vdbeCompare
1b6d0 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c  MemString(pMem1,
1b6e0 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30   pMem2, pColl, 0
1b6f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
1b700 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  If a NULL pointe
1b710 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20  r was passed as 
1b720 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63  the collate func
1b730 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75  tion, fall throu
1b740 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  gh.    ** to the
1b750 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75   blob case and u
1b760 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f  se memcmp().  */
1b770 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68  .  }. .  /* Both
1b780 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
1b790 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20  blobs.  Compare 
1b7a0 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20  using memcmp(). 
1b7b0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   */.  return sql
1b7c0 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28  ite3BlobCompare(
1b7d0 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d  pMem1, pMem2);.}
1b7e0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72  .../*.** The fir
1b7f0 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
1b800 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
1b810 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d  ion is a serial-
1b820 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72  type that.** cor
1b830 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69  responds to an i
1b840 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c  nteger - all val
1b850 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e  ues between 1 an
1b860 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a  d 9 inclusive .*
1b870 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65 20  * except 7. The 
1b880 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f  second points to
1b890 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
1b8a0 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20  ning an integer 
1b8b0 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69  value.** seriali
1b8c0 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  zed according to
1b8d0 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68   serial_type. Th
1b8e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65  is function dese
1b8f0 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20  rializes.** and 
1b900 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75  returns the valu
1b910 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  e..*/.static i64
1b920 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64   vdbeRecordDecod
1b930 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f  eInt(u32 serial_
1b940 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a  type, const u8 *
1b950 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a  aKey){.  u32 y;.
1b960 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
1b970 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f  T_DB || (serial_
1b980 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61  type>=1 && seria
1b990 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72  l_type<=9 && ser
1b9a0 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a  ial_type!=7) );.
1b9b0 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
1b9c0 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
1b9d0 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a  e 0:.    case 1:
1b9e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b9f0 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1ba00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e  .      return ON
1ba10 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1ba20 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20  ;.    case 2:.  
1ba30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1ba40 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1ba50 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42      return TWO_B
1ba60 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1ba70 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20     case 3:.     
1ba80 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1ba90 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1baa0 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59   return THREE_BY
1bab0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1bac0 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20    case 4: {.    
1bad0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1bae0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1baf0 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    y = FOUR_BYTE_
1bb00 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1bb10 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28    return (i64)*(
1bb20 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20  int*)&y;.    }. 
1bb30 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20     case 5: {.   
1bb40 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1bb50 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1bb60 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42     return FOUR_B
1bb70 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29  YTE_UINT(aKey+2)
1bb80 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
1bb90 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  )*TWO_BYTE_INT(a
1bba0 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Key);.    }.    
1bbb0 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20  case 6: {.      
1bbc0 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54  u64 x = FOUR_BYT
1bbd0 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1bbe0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1bbf0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1bc00 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
1bc10 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  | FOUR_BYTE_UINT
1bc20 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20  (aKey+4);.      
1bc30 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36  return (i64)*(i6
1bc40 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  4*)&x;.    }.  }
1bc50 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72 69  ..  return (seri
1bc60 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a  al_type - 8);.}.
1bc70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1bc80 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68  tion compares th
1bc90 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73  e two table rows
1bca0 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64   or index record
1bcb0 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62  s.** specified b
1bcc0 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  y {nKey1, pKey1}
1bcd0 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74   and pPKey2.  It
1bce0 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74   returns a negat
1bcf0 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ive, zero.** or 
1bd00 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
1bd10 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73   if key1 is less
1bd20 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
1bd30 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74  or .** greater t
1bd40 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b  han key2.  The {
1bd50 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65  nKey1, pKey1} ke
1bd60 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62  y must be a blob
1bd70 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74  .** created by t
1bd80 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
1bd90 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56   opcode of the V
1bda0 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32  DBE.  The pPKey2
1bdb0 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20  .** key must be 
1bdc0 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63  a parsed key suc
1bdd0 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72  h as obtained fr
1bde0 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
1bdf0 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a  eParseRecord..**
1be00 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1be10 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  bSkip is non-zer
1be20 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  o, it is assumed
1be30 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
1be40 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
1be50 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
1be60 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  the first fields
1be70 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65   of the keys are
1be80 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65   equal..**.** Ke
1be90 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e  y1 and Key2 do n
1bea0 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61  ot have to conta
1beb0 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  in the same numb
1bec0 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66  er of fields. If
1bed0 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20   all .** fields 
1bee0 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62  that appear in b
1bef0 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75  oth keys are equ
1bf00 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d  al, then pPKey2-
1bf10 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a  >default_rc is .
1bf20 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  ** returned..**.
1bf30 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20 63  ** If database c
1bf40 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73  orruption is dis
1bf50 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b  covered, set pPK
1bf60 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20  ey2->errCode to 
1bf70 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
1bf80 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e  PT and return 0.
1bf90 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
1bfa0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1bfb0 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72   .** pPKey2->err
1bfc0 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 53  Code is set to S
1bfd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c  QLITE_NOMEM and,
1bfe0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55   if it is not NU
1bff0 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f  LL, the.** mallo
1c000 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65  c-failed flag se
1c010 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  t on database ha
1c020 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b  ndle (pPKey2->pK
1c030 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a  eyInfo->db)..*/.
1c040 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
1c050 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
1c060 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79  Skip(.  int nKey
1c070 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1c080 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20  Key1,   /* Left 
1c090 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
1c0a0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c  dRecord *pPKey2,
1c0b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
1c0c0 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  t key */.  int b
1c0d0 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20  Skip            
1c0e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1c0f0 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20   true, skip the 
1c100 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29  first field */.)
1c110 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20  {.  u32 d1;     
1c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c130 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1c140 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
1c150 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
1c160 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c180 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1c190 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f  next field to co
1c1a0 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73  mpare */.  u32 s
1c1b0 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  zHdr1;          
1c1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1c1d0 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61  ze of record hea
1c1e0 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  der in bytes */.
1c1f0 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c210 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66    /* Offset of f
1c220 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65 61  irst type in hea
1c230 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  der */.  int rc 
1c240 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1c250 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1c260 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65  rn value */.  Me
1c270 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32  m *pRhs = pPKey2
1c280 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a  ->aMem;       /*
1c290 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70   Next field of p
1c2a0 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65  PKey2 to compare
1c2b0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
1c2c0 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
1c2d0 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f  ->pKeyInfo;.  co
1c2e0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1c2f0 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
1c300 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1c310 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d  *)pKey1;.  Mem m
1c320 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53  em1;..  /* If bS
1c330 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68 65  kip is true, the
1c340 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  n the caller has
1c350 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69   already determi
1c360 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72  ned that the fir
1c370 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d  st.  ** two elem
1c380 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73  ents in the keys
1c390 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20   are equal. Fix 
1c3a0 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61 63  the various stac
1c3b0 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20  k variables so. 
1c3c0 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f   ** that this ro
1c3d0 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d  utine begins com
1c3e0 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73 65  paring at the se
1c3f0 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20  cond field. */. 
1c400 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20   if( bSkip ){.  
1c410 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64    u32 s1;.    id
1c420 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69  x1 = 1 + getVari
1c430 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20  nt32(&aKey1[1], 
1c440 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20  s1);.    szHdr1 
1c450 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20  = aKey1[0];.    
1c460 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71  d1 = szHdr1 + sq
1c470 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1c480 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20  ypeLen(s1);.    
1c490 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b  i = 1;.    pRhs+
1c4a0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1c4b0 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74  idx1 = getVarint
1c4c0 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  32(aKey1, szHdr1
1c4d0 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64  );.    d1 = szHd
1c4e0 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28  r1;.    if( d1>(
1c4f0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1c500 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d  { .      pPKey2-
1c510 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1c520 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1c530 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
1c540 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69   0;  /* Corrupti
1c550 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  on */.    }.    
1c560 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56  i = 0;.  }..  VV
1c570 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d  A_ONLY( mem1.szM
1c580 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20  alloc = 0; ) /* 
1c590 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61  Only needed by a
1c5a0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1c5b0 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ts */.  assert( 
1c5c0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1c5d0 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d  ->nField+pPKey2-
1c5e0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  >pKeyInfo->nXFie
1c5f0 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  ld>=pPKey2->nFie
1c600 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f  ld .       || CO
1c610 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
1c620 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
1c630 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1c640 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
1c650 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  t( pPKey2->pKeyI
1c660 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b  nfo->nField>0 );
1c670 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c  .  assert( idx1<
1c680 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55  =szHdr1 || CORRU
1c690 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20  PT_DB );.  do{. 
1c6a0 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
1c6b0 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20  pe;..    /* RHS 
1c6c0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f  is an integer */
1c6d0 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66  .    if( pRhs->f
1c6e0 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
1c6f0 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74  {.      serial_t
1c700 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31  ype = aKey1[idx1
1c710 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ];.      testcas
1c720 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
1c730 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
1c740 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20  serial_type>=10 
1c750 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c760 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
1c770 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1c780 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1c790 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1c7a0 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1c7b0 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20  pe==7 ){.       
1c7c0 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20 28 64   double rhs = (d
1c7d0 6f 75 62 6c 65 29 70 52 68 73 2d 3e 75 2e 69 3b  ouble)pRhs->u.i;
1c7e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c7f0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
1c800 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
1c810 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20  _type, &mem1);. 
1c820 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31 2e         if( mem1.
1c830 75 2e 72 3c 72 68 73 20 29 7b 0a 20 20 20 20 20  u.r<rhs ){.     
1c840 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1c850 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c860 6d 65 6d 31 2e 75 2e 72 3e 72 68 73 20 29 7b 0a  mem1.u.r>rhs ){.
1c870 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b            rc = +
1c880 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1c890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c8a0 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65    i64 lhs = vdbe
1c8b0 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28  RecordDecodeInt(
1c8c0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b  serial_type, &aK
1c8d0 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20  ey1[d1]);.      
1c8e0 20 20 69 36 34 20 72 68 73 20 3d 20 70 52 68 73    i64 rhs = pRhs
1c8f0 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69  ->u.i;.        i
1c900 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20  f( lhs<rhs ){.  
1c910 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1c920 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1c930 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20  f( lhs>rhs ){.  
1c940 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1c950 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c960 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1c970 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a   RHS is real */.
1c980 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
1c990 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  s->flags & MEM_R
1c9a0 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72  eal ){.      ser
1c9b0 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1c9c0 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66  [idx1];.      if
1c9d0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
1c9e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1c9f0 53 65 72 69 61 6c 20 74 79 70 65 73 20 31 32 20  Serial types 12 
1ca00 6f 72 20 67 72 65 61 74 65 72 20 61 72 65 20 73  or greater are s
1ca10 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73  trings and blobs
1ca20 20 28 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20   (greater than. 
1ca30 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
1ca40 73 29 2e 20 54 79 70 65 73 20 31 30 20 61 6e 64  s). Types 10 and
1ca50 20 31 31 20 61 72 65 20 63 75 72 72 65 6e 74 6c   11 are currentl
1ca60 79 20 22 72 65 73 65 72 76 65 64 20 66 6f 72 20  y "reserved for 
1ca70 66 75 74 75 72 65 20 0a 20 20 20 20 20 20 20 20  future .        
1ca80 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69 74 20 64  ** use", so it d
1ca90 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61  oesn't really ma
1caa0 74 74 65 72 20 77 68 61 74 20 74 68 65 20 72 65  tter what the re
1cab0 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69  sults of compari
1cac0 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ng.        ** th
1cad0 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63 20 76  em to numberic v
1cae0 61 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20  alues are.  */. 
1caf0 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1cb00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1cb10 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29  serial_type==0 )
1cb20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1cb30 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1cb40 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72          double r
1cb50 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 72 3b 0a  hs = pRhs->u.r;.
1cb60 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6c          double l
1cb70 68 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  hs;.        sqli
1cb80 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1cb90 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1cba0 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29  ial_type, &mem1)
1cbb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65  ;.        if( se
1cbc0 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
1cbd0 20 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d 20            lhs = 
1cbe0 6d 65 6d 31 2e 75 2e 72 3b 0a 20 20 20 20 20 20  mem1.u.r;.      
1cbf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cc00 20 20 20 6c 68 73 20 3d 20 28 64 6f 75 62 6c 65     lhs = (double
1cc10 29 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20  )mem1.u.i;.     
1cc20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1cc30 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20   lhs<rhs ){.    
1cc40 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1cc50 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1cc60 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20   lhs>rhs ){.    
1cc70 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1cc80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cc90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1cca0 48 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a  HS is a string *
1ccb0 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1ccc0 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1ccd0 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65  _Str ){.      ge
1cce0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1ccf0 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
1cd00 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
1cd10 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1cd20 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1cd30 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1cd40 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  2 ){.        rc 
1cd50 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1cd60 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
1cd70 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20  ype & 0x01) ){. 
1cd80 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1cd90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1cda0 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73       mem1.n = (s
1cdb0 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
1cdc0 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
1cdd0 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31  stcase( (d1+mem1
1cde0 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  .n)==(unsigned)n
1cdf0 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1ce00 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65  testcase( (d1+me
1ce10 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e  m1.n+1)==(unsign
1ce20 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1ce30 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31      if( (d1+mem1
1ce40 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  .n) > (unsigned)
1ce50 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
1ce60 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1ce70 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1ce80 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1ce90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1cea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ceb0 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1cec0 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  /.        }else 
1ced0 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  if( pKeyInfo->aC
1cee0 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  oll[i] ){.      
1cef0 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70      mem1.enc = p
1cf00 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1cf10 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20          mem1.db 
1cf20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1cf30 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66            mem1.f
1cf40 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a  lags = MEM_Str;.
1cf50 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a            mem1.z
1cf60 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31   = (char*)&aKey1
1cf70 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [d1];.          
1cf80 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65  rc = vdbeCompare
1cf90 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20  MemString(.     
1cfa0 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20           &mem1, 
1cfb0 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  pRhs, pKeyInfo->
1cfc0 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79  aColl[i], &pPKey
1cfd0 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  2->errCode.     
1cfe0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1cff0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1d000 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
1d010 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29  mem1.n, pRhs->n)
1d020 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1d030 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
1d040 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
1d050 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
1d060 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d  ( rc==0 ) rc = m
1d070 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b  em1.n - pRhs->n;
1d080 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
1d090 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1d0a0 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20  * RHS is a blob 
1d0b0 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
1d0c0 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1d0d0 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
1d0e0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1d0f0 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c  y1[idx1], serial
1d100 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65  _type);.      te
1d110 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1d120 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1d130 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1d140 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74  <12 || (serial_t
1d150 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20  ype & 0x01) ){. 
1d160 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1d170 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d180 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20       int nStr = 
1d190 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
1d1a0 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20  2) / 2;.        
1d1b0 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53  testcase( (d1+nS
1d1c0 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  tr)==(unsigned)n
1d1d0 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1d1e0 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53  testcase( (d1+nS
1d1f0 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64  tr+1)==(unsigned
1d200 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1d210 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20    if( (d1+nStr) 
1d220 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  > (unsigned)nKey
1d230 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  1 ){.          p
1d240 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1d250 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1d260 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1d270 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1d280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d290 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1d2a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d2b0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20         int nCmp 
1d2c0 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73  = MIN(nStr, pRhs
1d2d0 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
1d2e0 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  rc = memcmp(&aKe
1d2f0 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c  y1[d1], pRhs->z,
1d300 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   nCmp);.        
1d310 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
1d320 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e   = nStr - pRhs->
1d330 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
1d340 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1d350 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a  /* RHS is null *
1d360 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  /.    else{.    
1d370 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
1d380 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
1d390 20 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f     rc = (serial_
1d3a0 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  type!=0);.    }.
1d3b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
1d3c0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  {.      if( pKey
1d3d0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1d3e0 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [i] ){.        r
1d3f0 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d  c = -rc;.      }
1d400 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76  .      assert( v
1d410 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1d420 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1d430 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20  y1, pPKey2, rc) 
1d440 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d450 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1d460 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
1d470 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ment below */.  
1d480 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d490 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20     }..    i++;. 
1d4a0 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64     pRhs++;.    d
1d4b0 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
1d4c0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
1d4d0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1d4e0 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56  idx1 += sqlite3V
1d4f0 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f  arintLen(serial_
1d500 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28  type);.  }while(
1d510 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29   idx1<(unsigned)
1d520 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
1d530 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31  y2->nField && d1
1d540 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  <=(unsigned)nKey
1d550 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  1 );..  /* No me
1d560 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1d570 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
1d580 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
1d590 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
1d5a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1d5b0 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
1d5c0 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
1d5d0 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
1d5e0 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
1d5f0 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
1d600 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1d610 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a  lease(&mem1).  *
1d620 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31  /.  assert( mem1
1d630 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  .szMalloc==0 );.
1d640 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
1d650 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
1d660 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b  or both of the k
1d670 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
1d680 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
1d690 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
1d6a0 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
1d6b0 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72  ere equal. Retur
1d6c0 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63  n the default_rc
1d6d0 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f  .  ** value.  */
1d6e0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
1d6f0 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  PT_DB .       ||
1d700 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1d710 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1d720 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50  Key1, pPKey2, pP
1d730 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1d740 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65  ) .       || pKe
1d750 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
1d760 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72  cFailed.  );.  r
1d770 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65  eturn pPKey2->de
1d780 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20  fault_rc;.}.int 
1d790 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1d7a0 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20  dCompare(.  int 
1d7b0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1d7c0 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c  d *pKey1,   /* L
1d7d0 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1d7e0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1d7f0 65 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ey2          /* 
1d800 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
1d810 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1d820 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1d830 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
1d840 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1d850 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  0);.}.../*.** Th
1d860 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1d870 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73  n optimized vers
1d880 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
1d890 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1d8a0 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74  ) .** that (a) t
1d8b0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f  he first field o
1d8c0 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69  f pPKey2 is an i
1d8d0 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20  nteger, and (b) 
1d8e0 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d  the .** size-of-
1d8f0 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74  header varint at
1d900 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70   the start of (p
1d910 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73  Key1/nKey1) fits
1d920 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   in a single.** 
1d930 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65  byte (i.e. is le
1d940 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a  ss than 128)..**
1d950 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e  .** To avoid con
1d960 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66  cerns about buff
1d970 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68  er overreads, th
1d980 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
1d990 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63  ly used.** on sc
1d9a0 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20  hemas where the 
1d9b0 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65  maximum valid he
1d9c0 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20  ader size is 63 
1d9d0 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a  bytes or less..*
1d9e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1d9f0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1da00 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  t(.  int nKey1, 
1da10 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1da20 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
1da30 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1da40 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
1da50 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1da60 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
1da70 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74  *aKey = &((const
1da80 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f   u8*)pKey1)[*(co
1da90 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20  nst u8*)pKey1 & 
1daa0 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72  0x3F];.  int ser
1dab0 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e  ial_type = ((con
1dac0 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d  st u8*)pKey1)[1]
1dad0 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75  ;.  int res;.  u
1dae0 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20  32 y;.  u64 x;. 
1daf0 20 69 36 34 20 76 20 3d 20 70 50 4b 65 79 32 2d   i64 v = pPKey2-
1db00 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20  >aMem[0].u.i;.  
1db10 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65  i64 lhs;..  vdbe
1db20 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1db30 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65  WithinLimits(nKe
1db40 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1db50 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  2->pKeyInfo);.  
1db60 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70  assert( (*(u8*)p
1db70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43  Key1)<=0x3F || C
1db80 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73  ORRUPT_DB );.  s
1db90 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
1dba0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
1dbb0 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69  : { /* 1-byte si
1dbc0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1dbd0 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f        lhs = ONE_
1dbe0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1dbf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dc00 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1dc10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1dc20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
1dc30 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1dc40 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1dc50 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  = TWO_BYTE_INT(a
1dc60 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1dc70 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1dc80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1dc90 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
1dca0 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
1dcb0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1dcc0 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59    lhs = THREE_BY
1dcd0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1dce0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1dcf0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1dd00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1dd10 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
1dd20 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1dd30 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f   */.      y = FO
1dd40 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1dd50 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  y);.      lhs = 
1dd60 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a  (i64)*(int*)&y;.
1dd70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dd80 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1dd90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1dda0 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
1ddb0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1ddc0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1ddd0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1dde0 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36  (aKey+2) + (((i6
1ddf0 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
1de00 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1de10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1de20 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1de30 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1de40 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74  se 6: { /* 8-byt
1de50 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1de60 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f   */.      x = FO
1de70 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1de80 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  y);.      x = (x
1de90 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54  <<32) | FOUR_BYT
1dea0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a  E_UINT(aKey+4);.
1deb0 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36        lhs = *(i6
1dec0 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73  4*)&x;.      tes
1ded0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1dee0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1def0 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a   }.    case 8: .
1df00 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20        lhs = 0;. 
1df10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1df20 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68  case 9:.      lh
1df30 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  s = 1;.      bre
1df40 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  ak;..    /* This
1df50 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72   case could be r
1df60 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63  emoved without c
1df70 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75  hanging the resu
1df80 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20  lts of running. 
1df90 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e     ** this code.
1dfa0 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61   Including it ca
1dfb0 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65  uses gcc to gene
1dfc0 72 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77  rate a faster sw
1dfd0 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61  itch .    ** sta
1dfe0 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68  tement (since th
1dff0 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63  e range of switc
1e000 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74  h targets now st
1e010 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64  arts at zero and
1e020 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69  .    ** is conti
1e030 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20  guous) but does 
1e040 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75  not cause any du
1e050 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20  plicate code to 
1e060 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20  be generated.   
1e070 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63   ** (as gcc is c
1e080 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20  lever enough to 
1e090 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20  combine the two 
1e0a0 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68  like cases). Oth
1e0b0 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69  er .    ** compi
1e0c0 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69  lers might be si
1e0d0 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20  milar.  */ .    
1e0e0 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a  case 0: case 7:.
1e0f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1e100 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1e110 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65  mpare(nKey1, pKe
1e120 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20  y1, pPKey2);..  
1e130 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
1e140 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1e150 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1e160 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1e170 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69  PKey2);.  }..  i
1e180 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20  f( v>lhs ){.    
1e190 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
1e1a0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c  ;.  }else if( v<
1e1b0 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  lhs ){.    res =
1e1c0 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d   pPKey2->r2;.  }
1e1d0 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d  else if( pPKey2-
1e1e0 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20  >nField>1 ){.   
1e1f0 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69   /* The first fi
1e200 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20  elds of the two 
1e210 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20  keys are equal. 
1e220 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61 69  Compare the trai
1e230 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65  ling .    ** fie
1e240 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73  lds.  */.    res
1e250 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
1e260 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
1e270 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  kip(nKey1, pKey1
1e280 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20  , pPKey2, 1);.  
1e290 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
1e2a0 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
1e2b0 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61  f the two keys a
1e2c0 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68 65  re equal and the
1e2d0 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c 69  re are no traili
1e2e0 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73  ng.    ** fields
1e2f0 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32 2d  . Return pPKey2-
1e300 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 74  >default_rc in t
1e310 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  his case. */.   
1e320 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64   res = pPKey2->d
1e330 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 7d 0a 0a  efault_rc;.  }..
1e340 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
1e350 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1e360 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1e370 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20  PKey2, res) );. 
1e380 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
1e390 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1e3a0 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ion is an optimi
1e3b0 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  zed version of s
1e3c0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1e3d0 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68  Compare() .** th
1e3e0 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74  at (a) the first
1e3f0 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32   field of pPKey2
1e400 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68   is a string, th
1e410 61 74 20 28 62 29 20 74 68 65 20 66 69 72 73 74  at (b) the first
1e420 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74   field.** uses t
1e430 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1e440 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64  uence BINARY and
1e450 20 28 63 29 20 74 68 61 74 20 74 68 65 20 73 69   (c) that the si
1e460 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
1e470 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73  int .** at the s
1e480 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e  tart of (pKey1/n
1e490 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20  Key1) fits in a 
1e4a0 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a  single byte..*/.
1e4b0 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
1e4c0 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
1e4d0 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ng(.  int nKey1,
1e4e0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1e4f0 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
1e500 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1e510 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
1e520 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
1e530 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
1e540 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
1e550 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e   u8*)pKey1;.  in
1e560 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20  t serial_type;. 
1e570 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 76 64 62   int res;..  vdb
1e580 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
1e590 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b  tWithinLimits(nK
1e5a0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1e5b0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  y2->pKeyInfo);. 
1e5c0 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
1e5d0 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74  ey1[1], serial_t
1e5e0 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69  ype);.  if( seri
1e5f0 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20  al_type<12 ){.  
1e600 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1e610 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65  r1;      /* (pKe
1e620 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e  y1/nKey1) is a n
1e630 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20  umber or a null 
1e640 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  */.  }else if( !
1e650 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
1e660 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73  x01) ){ .    res
1e670 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20   = pPKey2->r2;  
1e680 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b      /* (pKey1/nK
1e690 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a  ey1) is a blob *
1e6a0 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  /.  }else{.    i
1e6b0 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74  nt nCmp;.    int
1e6c0 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73   nStr;.    int s
1e6d0 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b  zHdr = aKey1[0];
1e6e0 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65  ..    nStr = (se
1e6f0 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20  rial_type-12) / 
1e700 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64  2;.    if( (szHd
1e710 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79  r + nStr) > nKey
1e720 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79  1 ){.      pPKey
1e730 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1e740 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1e750 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
1e760 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72  rn 0;    /* Corr
1e770 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a  uption */.    }.
1e780 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20      nCmp = MIN( 
1e790 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
1e7a0 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72  n, nStr );.    r
1e7b0 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  es = memcmp(&aKe
1e7c0 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79  y1[szHdr], pPKey
1e7d0 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43  2->aMem[0].z, nC
1e7e0 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65  mp);..    if( re
1e7f0 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  s==0 ){.      re
1e800 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79  s = nStr - pPKey
1e810 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20  2->aMem[0].n;.  
1e820 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
1e830 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
1e840 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29  Key2->nField>1 )
1e850 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  {.          res 
1e860 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
1e870 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
1e880 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ip(nKey1, pKey1,
1e890 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20   pPKey2, 1);.   
1e8a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e8b0 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
1e8c0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1e8d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e8e0 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
1e8f0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  ){.        res =
1e900 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20   pPKey2->r2;.   
1e910 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e920 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1e930 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r1;.      }.    
1e940 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
1e950 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  ){.      res = p
1e960 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d  PKey2->r2;.    }
1e970 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20  else{.      res 
1e980 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
1e990 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
1e9a0 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
1e9b0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1e9c0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1e9d0 72 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43  res).       || C
1e9e0 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20  ORRUPT_DB.      
1e9f0 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79   || pPKey2->pKey
1ea00 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
1ea10 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65  Failed.  );.  re
1ea20 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
1ea30 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1ea40 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
1ea50 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1ea60 72 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20  re() compatible 
1ea70 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74  function.** suit
1ea80 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69  able for compari
1ea90 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65  ng serialized re
1eaa0 63 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70  cords to the unp
1eab0 61 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73  acked record pas
1eac0 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e  sed.** as the on
1ead0 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
1eae0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71  RecordCompare sq
1eaf0 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d  lite3VdbeFindCom
1eb00 70 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63  pare(UnpackedRec
1eb10 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61  ord *p){.  /* va
1eb20 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
1eb30 65 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e  eInt() and varin
1eb40 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  tRecordCompareSt
1eb50 72 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75  ring() both assu
1eb60 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  me.  ** that the
1eb70 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
1eb80 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75  varint that occu
1eb90 72 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  rs at the start 
1eba0 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20  of each record. 
1ebb0 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69   ** fits in a si
1ebc0 6e 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20  ngle byte (i.e. 
1ebd0 69 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e  is 127 or less).
1ebe0 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
1ebf0 70 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61  pareInt().  ** a
1ec00 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
1ec10 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f   it is safe to o
1ec20 76 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72  verread a buffer
1ec30 20 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65   by at least the
1ec40 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70   .  ** maximum p
1ec50 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65  ossible legal he
1ec60 61 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38  ader size plus 8
1ec70 20 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20   bytes. Because 
1ec80 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75  there is.  ** gu
1ec90 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1eca0 74 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20  t least 74 (but 
1ecb0 6e 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f  not 136) bytes o
1ecc0 66 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77  f padding follow
1ecd0 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75  ing each.  ** bu
1ece0 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76  ffer passed to v
1ecf0 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
1ed00 72 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b  reInt() this mak
1ed10 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74  es it convenient
1ed20 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74   to.  ** limit t
1ed30 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
1ed40 65 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65  eader to 64 byte
1ed50 73 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65  s in cases where
1ed60 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1ed70 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65  .  ** is an inte
1ed80 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ger..  **.  ** T
1ed90 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74  he easiest way t
1eda0 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c  o enforce this l
1edb0 69 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69  imit is to consi
1edc0 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73  der only records
1edd0 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69   with.  ** 13 fi
1ede0 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66  elds or less. If
1edf0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1ee00 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   is an integer, 
1ee10 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61  the maximum lega
1ee20 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69  l.  ** header si
1ee30 7a 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20  ze is (12*5 + 1 
1ee40 2b 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a  + 1) bytes.  */.
1ee50 20 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e    if( (p->pKeyIn
1ee60 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e  fo->nField + p->
1ee70 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1ee80 64 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e  d)<=13 ){.    in
1ee90 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65  t flags = p->aMe
1eea0 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20  m[0].flags;.    
1eeb0 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  if( p->pKeyInfo-
1eec0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29  >aSortOrder[0] )
1eed0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20  {.      p->r1 = 
1eee0 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d  1;.      p->r2 =
1eef0 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
1ef00 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31        p->r1 = -1
1ef10 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
1ef20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1ef30 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e   (flags & MEM_In
1ef40 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  t) ){.      retu
1ef50 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
1ef60 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20  pareInt;.    }. 
1ef70 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
1ef80 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b  gs & MEM_Real );
1ef90 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
1efa0 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
1efb0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1efc0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f   flags & MEM_Blo
1efd0 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c  b );.    if( (fl
1efe0 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c  ags & (MEM_Real|
1eff0 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f  MEM_Null|MEM_Blo
1f000 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65  b))==0 && p->pKe
1f010 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d  yInfo->aColl[0]=
1f020 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1f030 72 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  rt( flags & MEM_
1f040 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74  Str );.      ret
1f050 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
1f060 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20  mpareString;.   
1f070 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1f080 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1f090 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a  rdCompare;.}../*
1f0a0 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20  .** pCur points 
1f0b0 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  at an index entr
1f0c0 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  y created using 
1f0d0 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
1f0e0 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61  d opcode..** Rea
1f0f0 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65  d the rowid (the
1f100 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74   last field in t
1f110 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73  he record) and s
1f120 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69  tore it in *rowi
1f130 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  d..** Return SQL
1f140 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
1f150 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61  hing works, or a
1f160 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  n error code oth
1f170 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  erwise..**.** pC
1f180 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e  ur might be poin
1f190 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74  ting to text obt
1f1a0 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72  ained from a cor
1f1b0 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
1f1c0 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f  le..** So the co
1f1d0 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  ntent cannot be 
1f1e0 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70  trusted.  Do app
1f1f0 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20  ropriate checks 
1f200 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a  on the content..
1f210 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1f220 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74  beIdxRowid(sqlit
1f230 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72  e3 *db, BtCursor
1f240 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77   *pCur, i64 *row
1f250 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  id){.  i64 nCell
1f260 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
1f270 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
1f280 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1f290 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
1f2a0 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
1f2b0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
1f2c0 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
1f2d0 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
1f2e0 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
1f2f0 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
1f300 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a   Mem m, v;..  /*
1f310 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   Get the size of
1f320 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
1f330 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20  .  Only indices 
1f340 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a  entries of less.
1f350 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61    ** than 2GiB a
1f360 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79  re support - any
1f370 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74  thing large must
1f380 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72   be database cor
1f390 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e  ruption..  ** An
1f3a0 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  y corruption is 
1f3b0 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69  detected in sqli
1f3c0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
1f3d0 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20  lPtr(), though, 
1f3e0 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  so.  ** this cod
1f3f0 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73  e can safely ass
1f400 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65  ume that nCellKe
1f410 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20  y is 32-bits  . 
1f420 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
1f430 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1f440 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
1f450 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d  .  VVA_ONLY(rc =
1f460 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  ) sqlite3BtreeKe
1f470 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
1f480 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
1f490 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f4a0 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69  );     /* pCur i
1f4b0 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73  s always valid s
1f4c0 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74  o KeySize cannot
1f4d0 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72   fail */.  asser
1f4e0 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53  t( (nCellKey & S
1f4f0 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d  QLITE_MAX_U32)==
1f500 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b  (u64)nCellKey );
1f510 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
1f520 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
1f530 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ent of the index
1f540 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
1f550 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
1f560 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
1f570 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
1f580 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
1f590 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
1f5a0 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
1f5b0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
1f5c0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
1f5d0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d  he index entry m
1f5e0 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  ust begin with a
1f5f0 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a   header size */.
1f600 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
1f610 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
1f620 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Hdr);.  testcase
1f630 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20  ( szHdr==3 );.  
1f640 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
1f650 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e  =m.n );.  if( un
1f660 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c  likely(szHdr<3 |
1f670 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e  | (int)szHdr>m.n
1f680 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
1f690 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
1f6a0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  on;.  }..  /* Th
1f6b0 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20  e last field of 
1f6c0 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
1f6d0 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   be an integer -
1f6e0 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a   the ROWID..  **
1f6f0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1f700 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c   last entry real
1f710 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ly is an integer
1f720 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
1f730 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
1f740 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70  .z[szHdr-1], typ
1f750 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
1f760 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1f770 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
1f780 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b   typeRowid==2 );
1f790 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1f7a0 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74  eRowid==3 );.  t
1f7b0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1f7c0 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63  id==4 );.  testc
1f7d0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1f7e0 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  5 );.  testcase(
1f7f0 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b   typeRowid==6 );
1f800 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1f810 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74  eRowid==8 );.  t
1f820 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1f830 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75  id==9 );.  if( u
1f840 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69  nlikely(typeRowi
1f850 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d<1 || typeRowid
1f860 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d  >9 || typeRowid=
1f870 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =7) ){.    goto 
1f880 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
1f890 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  tion;.  }.  lenR
1f8a0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64  owid = sqlite3Vd
1f8b0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1f8c0 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65  typeRowid);.  te
1f8d0 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e  stcase( (u32)m.n
1f8e0 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  ==szHdr+lenRowid
1f8f0 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
1f900 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64  ly((u32)m.n<szHd
1f910 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20  r+lenRowid) ){. 
1f920 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
1f930 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
1f940 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68  }..  /* Fetch th
1f950 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68  e integer off th
1f960 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
1f970 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
1f980 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1f990 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e  Get((u8*)&m.z[m.
1f9a0 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70  n-lenRowid], typ
1f9b0 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a  eRowid, &v);.  *
1f9c0 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20  rowid = v.u.i;. 
1f9d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1f9e0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
1f9f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fa00 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
1fa10 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  if database corr
1fa20 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
1fa30 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62  ed after m has b
1fa40 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  een.  ** allocat
1fa50 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20  ed.  Free the m 
1fa60 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
1fa70 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1fa80 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63  . */.idx_rowid_c
1fa90 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73  orruption:.  tes
1faa0 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f  tcase( m.szMallo
1fab0 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c!=0 );.  sqlite
1fac0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1fad0 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
1fae0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1faf0 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  T;.}../*.** Comp
1fb00 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74  are the key of t
1fb10 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74  he index entry t
1fb20 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73  hat cursor pC is
1fb30 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61   pointing to aga
1fb40 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20  inst.** the key 
1fb50 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63  string in pUnpac
1fb60 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ked.  Write into
1fb70 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a   *pRes a number.
1fb80 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74  ** that is negat
1fb90 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
1fba0 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20  sitive if pC is 
1fbb0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1fbc0 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74   to,.** or great
1fbd0 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65  er than pUnpacke
1fbe0 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
1fbf0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
1fc00 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64  .**.** pUnpacked
1fc10 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74   is either creat
1fc20 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77  ed without a row
1fc30 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74  id or is truncat
1fc40 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  ed so that it.**
1fc50 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64   omits the rowid
1fc60 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
1fc70 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
1fc80 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
1fc90 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  entry.** is igno
1fca0 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65  red as well.  He
1fcb0 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  nce, this routin
1fcc0 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20  e only compares 
1fcd0 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a  the prefixes .**
1fce0 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69   of the keys pri
1fcf0 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20  or to the final 
1fd00 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65  rowid, not the e
1fd10 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  ntire key..*/.in
1fd20 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
1fd30 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71  KeyCompare(.  sq
1fd40 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1fd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fd60 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
1fd70 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43  ction */.  VdbeC
1fd80 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20  ursor *pC,      
1fd90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1fda0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d  he cursor to com
1fdb0 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a  pare against */.
1fdc0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1fdd0 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20   *pUnpacked,    
1fde0 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76     /* Unpacked v
1fdf0 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f  ersion of key */
1fe00 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
1fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1fe30 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75   comparison resu
1fe40 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  lt here */.){.  
1fe50 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
1fe60 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  ;.  int rc;.  Bt
1fe70 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70  Cursor *pCur = p
1fe80 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65  C->pCursor;.  Me
1fe90 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  m m;..  assert( 
1fea0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1feb0 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20  orIsValid(pCur) 
1fec0 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63  );.  VVA_ONLY(rc
1fed0 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65   =) sqlite3Btree
1fee0 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
1fef0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65  CellKey);.  asse
1ff00 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
1ff10 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20  K );    /* pCur 
1ff20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
1ff30 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f  so KeySize canno
1ff40 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e  t fail */.  /* n
1ff50 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77  CellKey will alw
1ff60 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30  ays be between 0
1ff70 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20   and 0xffffffff 
1ff80 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
1ff90 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72  ay.  ** that btr
1ffa0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
1ffb0 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56   and sqlite3GetV
1ffc0 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d  arint32() are im
1ffd0 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69  plemented */.  i
1ffe0 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c  f( nCellKey<=0 |
1fff0 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66  | nCellKey>0x7ff
20000 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65  fffff ){.    *re
20010 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
20020 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
20030 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
20040 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
20050 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63  &m, db, 0);.  rc
20060 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
20070 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70  mFromBtree(pC->p
20080 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 33 32 29  Cursor, 0, (u32)
20090 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
200a0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
200b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
200c0 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65  .  *res = sqlite
200d0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
200e0 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e  re(m.n, m.z, pUn
200f0 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74  packed);.  sqlit
20100 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
20110 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
20120 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20130 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20140 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74  sets the value t
20150 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
20160 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
20170 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  s to.** sqlite3_
20180 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65  changes() on the
20190 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
201a0 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20   'db'. .*/.void 
201b0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
201c0 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
201d0 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b  b, int nChange){
201e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
201f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
20200 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62  ->mutex) );.  db
20210 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61  ->nChange = nCha
20220 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61  nge;.  db->nTota
20230 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e  lChange += nChan
20240 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ge;.}../*.** Set
20250 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76   a flag in the v
20260 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  dbe to update th
20270 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
20280 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61   when it is fina
20290 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65  lised.** or rese
202a0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
202b0 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67  e3VdbeCountChang
202c0 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76  es(Vdbe *v){.  v
202d0 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20  ->changeCntOn = 
202e0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  1;.}../*.** Mark
202f0 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20   every prepared 
20300 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69  statement associ
20310 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
20320 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
20330 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a  ** as expired..*
20340 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20  *.** An expired 
20350 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20  statement means 
20360 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69  that recompilati
20370 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  on of the statem
20380 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d  ent is.** recomm
20390 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73  end.  Statements
203a0 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69   expire when thi
203b0 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20  ngs happen that 
203c0 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72  make their.** pr
203d0 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e  ograms obsolete.
203e0 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d    Removing user-
203f0 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
20400 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  s or collating.*
20410 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20  * sequences, or 
20420 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68  changing an auth
20430 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69  orization functi
20440 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73  on are the types
20450 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68   of.** things th
20460 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64  at make prepared
20470 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f   statements obso
20480 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lete..*/.void sq
20490 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
204a0 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71  redStatements(sq
204b0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
204c0 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d  be *p;.  for(p =
204d0 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70   db->pVdbe; p; p
204e0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
204f0 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a  p->expired = 1;.
20500 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
20510 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  urn the database
20520 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
20530 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71   the Vdbe..*/.sq
20540 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64  lite3 *sqlite3Vd
20550 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20  beDb(Vdbe *v){. 
20560 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d   return v->db;.}
20570 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
20580 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
20590 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
205a0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
205b0 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e  g the value boun
205c0 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
205d0 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63  Var of VM v. Exc
205e0 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75  ept, if the valu
205f0 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  e is an SQL NULL
20600 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69  , return .** 0 i
20610 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69  nstead. Unless i
20620 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79  t is NULL, apply
20630 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f   affinity aff (o
20640 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  ne of the SQLITE
20650 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61  _AFF_*.** consta
20660 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75  nts) to the valu
20670 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
20680 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ng it..**.** The
20690 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
206a0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
206b0 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
206c0 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  g sqlite3ValueFr
206d0 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ee()..*/.sqlite3
206e0 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56  _value *sqlite3V
206f0 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65  dbeGetBoundValue
20700 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
20710 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61  ar, u8 aff){.  a
20720 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
20730 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
20740 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e  Mem *pMem = &v->
20750 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20  aVar[iVar-1];.  
20760 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e    if( 0==(pMem->
20770 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
20780 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
20790 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d  e3_value *pRet =
207a0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
207b0 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69  (v->db);.      i
207c0 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20  f( pRet ){.     
207d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
207e0 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65  mCopy((Mem *)pRe
207f0 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20  t, pMem);.      
20800 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70    sqlite3ValueAp
20810 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74  plyAffinity(pRet
20820 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54  , aff, SQLITE_UT
20830 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  F8);.      }.   
20840 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a     return pRet;.
20850 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
20860 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
20870 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72  onfigure SQL var
20880 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68  iable iVar so th
20890 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77  at binding a new
208a0 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67   value to it sig
208b0 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  nals.** to sqlit
208c0 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20  e3_reoptimize() 
208d0 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e  that re-preparin
208e0 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  g the statement 
208f0 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  may result.** in
20900 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20   a better query 
20910 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  plan..*/.void sq
20920 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d  lite3VdbeSetVarm
20930 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ask(Vdbe *v, int
20940 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74   iVar){.  assert
20950 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66  ( iVar>0 );.  if
20960 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20  ( iVar>32 ){.   
20970 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78   v->expmask = 0x
20980 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73  ffffffff;.  }els
20990 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  e{.    v->expmas
209a0 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20  k |= ((u32)1 << 
209b0 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d  (iVar-1));.  }.}
209c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
209d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
209e0 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  LE./*.** Transfe
209f0 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  r error message 
20a00 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c  text from an sql
20a10 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73  ite3_vtab.zErrMs
20a20 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a  g (text stored.*
20a30 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  * in memory obta
20a40 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
20a50 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61  3_malloc) into a
20a60 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74   Vdbe.zErrMsg (t
20a70 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  ext stored.** in
20a80 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
20a90 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d   from sqlite3DbM
20aa0 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20  alloc)..*/.void 
20ab0 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72  sqlite3VtabImpor
20ac0 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c  tErrmsg(Vdbe *p,
20ad0 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
20ae0 56 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33  Vtab){.  sqlite3
20af0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
20b00 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
20b10 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
20b20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71   p->zErrMsg = sq
20b30 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
20b40 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
20b50 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
20b60 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
20b70 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  );.  pVtab->zErr
20b80 4d 73 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  Msg = 0;.}.#endi
20b90 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
20ba0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
20bb0 0a                                               .