/ Hex Artifact Content
Login

Artifact 38233cc7faa4ad1dfbc1a9bc5a54ecf996d6840b:


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 61 73 73 65 72 74 28 20 70 41 2d  p;.  assert( pA-
07f0: 3e 64 62 3d 3d 70 42 2d 3e 64 62 20 29 3b 0a 20  >db==pB->db );. 
0800: 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70   tmp = *pA;.  *p
0810: 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d  A = *pB;.  *pB =
0820: 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70   tmp;.  pTmp = p
0830: 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e  A->pNext;.  pA->
0840: 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78  pNext = pB->pNex
0850: 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d  t;.  pB->pNext =
0860: 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20   pTmp;.  pTmp = 
0870: 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d  pA->pPrev;.  pA-
0880: 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72  >pPrev = pB->pPr
0890: 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20  ev;.  pB->pPrev 
08a0: 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d  = pTmp;.  zTmp =
08b0: 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d   pA->zSql;.  pA-
08c0: 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c  >zSql = pB->zSql
08d0: 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a  ;.  pB->zSql = z
08e0: 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65  Tmp;.  pB->isPre
08f0: 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50  pareV2 = pA->isP
0900: 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a  repareV2;.}../*.
0910: 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64  ** Resize the Vd
0920: 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20  be.aOp array so 
0930: 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c 65  that it is at le
0940: 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73  ast nOp elements
0950: 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e   larger .** than
0960: 20 69 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a   its current siz
0970: 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e  e. nOp is guaran
0980: 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  teed to be less 
0990: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
09a0: 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28   to 1024/sizeof(
09b0: 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  Op)..**.** If an
09c0: 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65   out-of-memory e
09d0: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
09e0: 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61  e resizing the a
09f0: 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  rray, return.** 
0a00: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e  SQLITE_NOMEM. In
0a10: 20 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e   this case Vdbe.
0a20: 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f  aOp and Parse.nO
0a30: 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a  pAlloc remain .*
0a40: 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69  * unchanged (thi
0a50: 73 20 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79  s is so that any
0a60: 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79   opcodes already
0a70: 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62   allocated can b
0a80: 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20  e .** correctly 
0a90: 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  deallocated alon
0aa0: 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20  g with the rest 
0ab0: 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f  of the Vdbe)..*/
0ac0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77  .static int grow
0ad0: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c  OpArray(Vdbe *v,
0ae0: 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62   int nOp){.  Vdb
0af0: 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72  eOp *pNew;.  Par
0b00: 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73  se *p = v->pPars
0b10: 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c  e;..  /* The SQL
0b20: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43  ITE_TEST_REALLOC
0b30: 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d  _STRESS compile-
0b40: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64  time option is d
0b50: 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65  esigned to force
0b60: 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75  .  ** more frequ
0b70: 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64  ent reallocs and
0b80: 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d   hence provide m
0b90: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65  ore opportunitie
0ba0: 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75  s for .  ** simu
0bb0: 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73  lated OOM faults
0bc0: 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  .  SQLITE_TEST_R
0bd0: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73  EALLOC_STRESS is
0be0: 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a   generally used.
0bf0: 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74    ** during test
0c00: 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20  ing only.  With 
0c10: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0c20: 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20  LOC_STRESS grow 
0c30: 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a  the op array.  *
0c40: 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d  * by the minimum
0c50: 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65  * amount require
0c60: 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65  d until the size
0c70: 20 72 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e   reaches 512.  N
0c80: 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61  ormal.  ** opera
0c90: 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51  tion (without SQ
0ca0: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0cb0: 43 5f 53 54 52 45 53 53 29 20 69 73 20 74 6f 20  C_STRESS) is to 
0cc0: 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72 72 65  double the curre
0cd0: 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  nt.  ** size of 
0ce0: 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20  the op array or 
0cf0: 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65  add 1KB of space
0d00: 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
0d10: 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65  maller. */.#ifde
0d20: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  f SQLITE_TEST_RE
0d30: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69  ALLOC_STRESS.  i
0d40: 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f  nt nNew = (p->nO
0d50: 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d  pAlloc>=512 ? p-
0d60: 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d  >nOpAlloc*2 : p-
0d70: 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a  >nOpAlloc+nOp);.
0d80: 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77  #else.  int nNew
0d90: 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20   = (p->nOpAlloc 
0da0: 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20  ? p->nOpAlloc*2 
0db0: 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a  : (int)(1024/siz
0dc0: 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55  eof(Op)));.  UNU
0dd0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f  SED_PARAMETER(nO
0de0: 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  p);.#endif..  as
0df0: 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34  sert( nOp<=(1024
0e00: 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a  /sizeof(Op)) );.
0e10: 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d    assert( nNew>=
0e20: 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70  (p->nOpAlloc+nOp
0e30: 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  ) );.  pNew = sq
0e40: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0e50: 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e  ->db, v->aOp, nN
0e60: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0e70: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0e80: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0e90: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0ea0: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0eb0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0ec0: 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   v->aOp = pNew;.
0ed0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0ee0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0ef0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0f00: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
0f10: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72  _DEBUG./* This r
0f20: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61  outine is just a
0f30: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
0f40: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
0f50: 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a  point that will.
0f60: 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 61  ** fire after ea
0f70: 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73  ch opcode is ins
0f80: 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61  erted and displa
0f90: 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52  yed using.** "PR
0fa0: 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74  AGMA vdbe_addopt
0fb0: 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61  race=on"..*/.sta
0fc0: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64  tic void test_ad
0fd0: 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76  dop_breakpoint(v
0fe0: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69  oid){.  static i
0ff0: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b  nt n = 0;.  n++;
1000: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1010: 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72   Add a new instr
1020: 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69  uction to the li
1030: 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  st of instructio
1040: 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68  ns current in th
1050: 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75  e.** VDBE.  Retu
1060: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
1070: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75  f the new instru
1080: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  ction..**.** Par
1090: 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20  ameters:.**.**  
10a0: 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20    p             
10b0: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65    Pointer to the
10c0: 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f   VDBE.**.**    o
10d0: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  p              T
10e0: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68  he opcode for th
10f0: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a  is instruction.*
1100: 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20  *.**    p1, p2, 
1110: 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73  p3      Operands
1120: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
1130: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1140: 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f  eLabel() functio
1150: 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72  n to fix an addr
1160: 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73  ess and.** the s
1170: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1180: 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  P4() function to
1190: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
11a0: 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f  e of the P4.** o
11b0: 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73  perand..*/.int s
11c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11d0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
11e0: 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
11f0: 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74  , int p3){.  int
1200: 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f   i;.  VdbeOp *pO
1210: 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70  p;..  i = p->nOp
1220: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
1230: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
1240: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
1250: 74 28 20 6f 70 3e 30 20 26 26 20 6f 70 3c 30 78  t( op>0 && op<0x
1260: 66 66 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  ff );.  if( p->p
1270: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  Parse->nOpAlloc<
1280: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
1290: 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31 29 20  owOpArray(p, 1) 
12a0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
12b0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
12c0: 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d  ->nOp++;.  pOp =
12d0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70   &p->aOp[i];.  p
12e0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38  Op->opcode = (u8
12f0: 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d  )op;.  pOp->p5 =
1300: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20   0;.  pOp->p1 = 
1310: 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20  p1;.  pOp->p2 = 
1320: 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20  p2;.  pOp->p3 = 
1330: 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p3;.  pOp->p4.p 
1340: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  = 0;.  pOp->p4ty
1350: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
1360: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1370: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
1380: 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43  MMENTS.  pOp->zC
1390: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  omment = 0;.#end
13a0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
13b0: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e  _DEBUG.  if( p->
13c0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
13d0: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
13e0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 2c  e ){.    int jj,
13f0: 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65 20 2a   kk;.    Parse *
1400: 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72  pParse = p->pPar
1410: 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 6b  se;.    for(jj=k
1420: 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49 54 45 5f 4e  k=0; jj<SQLITE_N
1430: 5f 43 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b 2b 29  _COLCACHE; jj++)
1440: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 79  {.      struct y
1450: 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20 70 50  ColCache *x = pP
1460: 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20  arse->aColCache 
1470: 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  + jj;.      if( 
1480: 78 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  x->iLevel>pParse
1490: 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 7c 7c  ->iCacheLevel ||
14a0: 20 78 2d 3e 69 52 65 67 3d 3d 30 20 29 20 63 6f   x->iReg==0 ) co
14b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 72  ntinue;.      pr
14c0: 69 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b 25 64  intf(" r[%d]={%d
14d0: 3a 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67 2c 20  :%d}", x->iReg, 
14e0: 78 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e 69 43  x->iTable, x->iC
14f0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 6b 6b  olumn);.      kk
1500: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
1510: 28 20 6b 6b 20 29 20 70 72 69 6e 74 66 28 22 5c  ( kk ) printf("\
1520: 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
1530: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
1540: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
1550: 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72     test_addop_br
1560: 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a  eakpoint();.  }.
1570: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44  #endif.#ifdef VD
1580: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70  BE_PROFILE.  pOp
1590: 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ->cycles = 0;.  
15a0: 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65  pOp->cnt = 0;.#e
15b0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
15c0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
15d0: 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65  .  pOp->iSrcLine
15e0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
15f0: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
1600: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1610: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1620: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1630: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1640: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
1650: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1660: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
1670: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
1680: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1690: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
16a0: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
16b0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
16c0: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
16d0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
16e0: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
16f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1700: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1710: 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  , 0);.}.../*.** 
1720: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1730: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1740: 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f  p4 value as a po
1750: 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
1760: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1770: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1780: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1790: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
17a0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17c0: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
17d0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
17e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
17f0: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1800: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1810: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1820: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
1830: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1840: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1850: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1860: 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20  *zP4,    /* The 
1870: 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P4 operand */.  
1880: 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20  int p4type      
1890: 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e      /* P4 operan
18a0: 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69  d type */.){.  i
18b0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
18c0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
18d0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
18e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
18f0: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a  ngeP4(p, addr, z
1900: 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72  P4, p4type);.  r
1910: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
1920: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50  *.** Add an OP_P
1930: 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64  arseSchema opcod
1940: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
1950: 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66   is broken out f
1960: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
1970: 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65  beAddOp4() since
1980: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73   it needs to als
1990: 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20  o needs to mark 
19a0: 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73  all btrees.** as
19b0: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65   having been use
19c0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68  d..**.** The zWh
19d0: 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20  ere string must 
19e0: 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e  have been obtain
19f0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
1a00: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69  malloc()..** Thi
1a10: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74  s routine will t
1a20: 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  ake ownership of
1a30: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d   the allocated m
1a40: 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  emory..*/.void s
1a50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72  qlite3VdbeAddPar
1a60: 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20  seSchemaOp(Vdbe 
1a70: 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61  *p, int iDb, cha
1a80: 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e  r *zWhere){.  in
1a90: 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64 72 20  t j;.  int addr 
1aa0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1ab0: 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73 65 53  Op3(p, OP_ParseS
1ac0: 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30  chema, iDb, 0, 0
1ad0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1ae0: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
1af0: 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e  , zWhere, P4_DYN
1b00: 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  AMIC);.  for(j=0
1b10: 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20  ; j<p->db->nDb; 
1b20: 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65  j++) sqlite3Vdbe
1b30: 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b  UsesBtree(p, j);
1b40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1b50: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1b60: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1b70: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  ue as an integer
1b80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b90: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20  VdbeAddOp4Int(. 
1ba0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
1bb0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
1bc0: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
1bd0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
1be0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1bf0: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
1c00: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
1c10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
1c20: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1c30: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
1c40: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
1c50: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c70: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
1c80: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20  .  int p4       
1c90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34         /* The P4
1ca0: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69   operand as an i
1cb0: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  nteger */.){.  i
1cc0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
1cd0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1ce0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
1cf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1d00: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53  ngeP4(p, addr, S
1d10: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
1d20: 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  (p4), P4_INT32);
1d30: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1d40: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1d50: 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c  a new symbolic l
1d60: 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74  abel for an inst
1d70: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  ruction that has
1d80: 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f   yet to be.** co
1d90: 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c  ded.  The symbol
1da0: 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c  ic label is real
1db0: 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69  ly just a negati
1dc0: 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a  ve number.  The.
1dd0: 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20  ** label can be 
1de0: 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76  used as the P2 v
1df0: 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61  alue of an opera
1e00: 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68  tion.  Later, wh
1e10: 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  en.** the label 
1e20: 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61  is resolved to a
1e30: 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73   specific addres
1e40: 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c  s, the VDBE will
1e50: 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68   scan.** through
1e60: 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c   its operation l
1e70: 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61  ist and change a
1e80: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20  ll values of P2 
1e90: 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74  which match.** t
1ea0: 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68  he label into th
1eb0: 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65  e resolved addre
1ec0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  ss..**.** The VD
1ed0: 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20  BE knows that a 
1ee0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
1ef0: 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65  bel because labe
1f00: 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73  ls are.** always
1f10: 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32   negative and P2
1f20: 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70   values are supp
1f30: 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65  ose to be non-ne
1f40: 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65  gative..** Hence
1f50: 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  , a negative P2 
1f60: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
1f70: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
1f80: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a   be resolved..**
1f90: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
1fa0: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
1fb0: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74  () fails..*/.int
1fc0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1fd0: 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29 7b 0a  Label(Vdbe *v){.
1fe0: 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e    Parse *p = v->
1ff0: 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 20  pParse;.  int i 
2000: 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20  = p->nLabel++;. 
2010: 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69   assert( v->magi
2020: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2030: 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69 20 26  IT );.  if( (i &
2040: 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20   (i-1))==0 ){.  
2050: 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71    p->aLabel = sq
2060: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72  lite3DbReallocOr
2070: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Free(p->db, p->a
2080: 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20  Label, .        
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
20b0: 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d  i*2+1)*sizeof(p-
20c0: 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20  >aLabel[0]));.  
20d0: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  }.  if( p->aLabe
20e0: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
20f0: 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a  el[i] = -1;.  }.
2100: 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d    return -1-i;.}
2110: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
2120: 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20  label "x" to be 
2130: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
2140: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
2150: 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73  ion to.** be ins
2160: 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61  erted.  The para
2170: 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68  meter "x" must h
2180: 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ave been obtaine
2190: 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f  d from.** a prio
21a0: 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
21b0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29  3VdbeMakeLabel()
21c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21d0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
21e0: 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 78  l(Vdbe *v, int x
21f0: 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20  ){.  Parse *p = 
2200: 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  v->pParse;.  int
2210: 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73   j = -1-x;.  ass
2220: 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56  ert( v->magic==V
2230: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2240: 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 70 2d  ;.  assert( j<p-
2250: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28  >nLabel );.  if(
2260: 20 41 4c 57 41 59 53 28 6a 3e 3d 30 29 20 26 26   ALWAYS(j>=0) &&
2270: 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20   p->aLabel ){.  
2280: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d    p->aLabel[j] =
2290: 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70   v->nOp;.  }.  p
22a0: 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 76 2d 3e  ->iFixedOp = v->
22b0: 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  nOp - 1;.}../*.*
22c0: 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20  * Mark the VDBE 
22d0: 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20  as one that can 
22e0: 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20  only be run one 
22f0: 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
2300: 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79  lite3VdbeRunOnly
2310: 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  Once(Vdbe *p){. 
2320: 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
2330: 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = 1;.}..#ifdef S
2340: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73  QLITE_DEBUG /* s
2350: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
2360: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a  bort() logic */.
2370: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2380: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75  wing type and fu
2390: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20  nction are used 
23a0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
23b0: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  gh all opcodes.*
23c0: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e  * in a Vdbe main
23d0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63   program and eac
23e0: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f  h of the sub-pro
23f0: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29  grams (triggers)
2400: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f   it may .** invo
2410: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69  ke directly or i
2420: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68  ndirectly. It sh
2430: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
2440: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
2450: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56   Op *pOp;.**   V
2460: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
2470: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28  .**.**   memset(
2480: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
2490: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20  f(sIter));.**   
24a0: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20  sIter.v = v;    
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20          // v is 
24d0: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a  of type Vdbe* .*
24e0: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  *   while( (pOp 
24f0: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
2500: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20  ter)) ){.**     
2510: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20  // Do something 
2520: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a  with pOp.**   }.
2530: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  **   sqlite3DbFr
2540: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
2550: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74  apSub);.** .*/.t
2560: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64  ypedef struct Vd
2570: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49  beOpIter VdbeOpI
2580: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65  ter;.struct Vdbe
2590: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20  OpIter {.  Vdbe 
25a0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
25b0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
25c0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
25d0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20   the opcodes of 
25e0: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
25f0: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20  **apSub;        
2600: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70  /* Array of subp
2610: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
2620: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   nSub;          
2630: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2640: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
2650: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  apSub */.  int i
2660: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  Addr;           
2670: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
2680: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63   of next instruc
2690: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  tion to return *
26a0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20  /.  int iSub;   
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26c0: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72  * 0 = main progr
26d0: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75  am, 1 = first su
26e0: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a  b-program etc. *
26f0: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a  /.};.static Op *
2700: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f  opIterNext(VdbeO
2710: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62  pIter *p){.  Vdb
2720: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f  e *v = p->v;.  O
2730: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f  p *pRet = 0;.  O
2740: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f  p *aOp;.  int nO
2750: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75  p;..  if( p->iSu
2760: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20  b<=p->nSub ){.. 
2770: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d     if( p->iSub==
2780: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  0 ){.      aOp =
2790: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e   v->aOp;.      n
27a0: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = v->nOp;.   
27b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f   }else{.      aO
27c0: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
27d0: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20  iSub-1]->aOp;.  
27e0: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53      nOp = p->apS
27f0: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e  ub[p->iSub-1]->n
2800: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  Op;.    }.    as
2810: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e  sert( p->iAddr<n
2820: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20  Op );..    pRet 
2830: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d  = &aOp[p->iAddr]
2840: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b  ;.    p->iAddr++
2850: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64  ;.    if( p->iAd
2860: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20  dr==nOp ){.     
2870: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20   p->iSub++;.    
2880: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a    p->iAddr = 0;.
2890: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
28a0: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50   pRet->p4type==P
28b0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
28c0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
28d0: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69  = (p->nSub+1)*si
28e0: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
28f0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
2900: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2910: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  <p->nSub; j++){.
2920: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
2930: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70  pSub[j]==pRet->p
2940: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
2950: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2960: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62    if( j==p->nSub
2970: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
2980: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pSub = sqlite3Db
2990: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d  ReallocOrFree(v-
29a0: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e  >db, p->apSub, n
29b0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
29c0: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a  f( !p->apSub ){.
29d0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
29e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
29f0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
2a00: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d  apSub[p->nSub++]
2a10: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f   = pRet->p4.pPro
2a20: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gram;.        }.
2a30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2a40: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
2a50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
2a60: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
2a70: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d  stored in the VM
2a80: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2a90: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74   pParse may.** t
2aa0: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
2ab0: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67  ception (causing
2ac0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
2ad0: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74  but not entire t
2ae0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f  ransaction.** to
2af0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29   be rolled back)
2b00: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  . This condition
2b10: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
2b20: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20  main program or 
2b30: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72  any.** sub-progr
2b40: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ams contains any
2b50: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2b60: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  g:.**.**   *  OP
2b70: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
2b80: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
2b90: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
2ba0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
2bb0: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53  IfNull with P1=S
2bc0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
2bd0: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
2be0: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73  ..**   *  OP_Des
2bf0: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  troy.**   *  OP_
2c00: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20  VUpdate.**   *  
2c10: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20  OP_VRename.**   
2c20: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  *  OP_FkCounter 
2c30: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65  with P2==0 (imme
2c40: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
2c50: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a  y constraint).**
2c60: 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74  .** Then check t
2c70: 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hat the value of
2c80: 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20   Parse.mayAbort 
2c90: 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a  is true if an.**
2ca0: 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68   ABORT may be th
2cb0: 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f  rown, or false o
2cc0: 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e  therwise. Return
2cd0: 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
2ce0: 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61  .** match, or fa
2cf0: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54  lse otherwise. T
2d00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2d10: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
2d20: 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  sed as.** part o
2d30: 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74  f an assert stat
2d40: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d  ement in the com
2d50: 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74  piler. Similar t
2d60: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  o:.**.**   asser
2d70: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  t( sqlite3VdbeAs
2d80: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61  sertMayAbort(pPa
2d90: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
2da0: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b  se->mayAbort) );
2db0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
2dc0: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
2dd0: 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d  t(Vdbe *v, int m
2de0: 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20  ayAbort){.  int 
2df0: 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20  hasAbort = 0;.  
2e00: 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 65 72  int hasFkCounter
2e10: 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b   = 0;.  Op *pOp;
2e20: 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49  .  VdbeOpIter sI
2e30: 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  ter;.  memset(&s
2e40: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
2e50: 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72  sIter));.  sIter
2e60: 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65  .v = v;..  while
2e70: 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e  ( (pOp = opIterN
2e80: 65 78 74 28 26 73 49 74 65 72 29 29 21 3d 30 20  ext(&sIter))!=0 
2e90: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64  ){.    int opcod
2ea0: 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = pOp->opcode;
2eb0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
2ec0: 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f  =OP_Destroy || o
2ed0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74  pcode==OP_VUpdat
2ee0: 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  e || opcode==OP_
2ef0: 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c  VRename .     ||
2f00: 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61   ((opcode==OP_Ha
2f10: 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  lt || opcode==OP
2f20: 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20  _HaltIfNull) .  
2f30: 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31      && ((pOp->p1
2f40: 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
2f50: 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70  ONSTRAINT && pOp
2f60: 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29  ->p2==OE_Abort))
2f70: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61  .    ){.      ha
2f80: 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  sAbort = 1;.    
2f90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
2fa0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2fb0: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
2fc0: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
2fd0: 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70  P_FkCounter && p
2fe0: 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70  Op->p1==0 && pOp
2ff0: 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ->p2==1 ){.     
3000: 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20   hasFkCounter = 
3010: 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
3020: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
3030: 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72  ree(v->db, sIter
3040: 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52  .apSub);..  /* R
3050: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 68 61  eturn true if ha
3060: 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74  sAbort==mayAbort
3070: 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63  . Or if a malloc
3080: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
3090: 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f  d..  ** If mallo
30a0: 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74  c failed, then t
30b0: 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20  he while() loop 
30c0: 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61  above may not ha
30d0: 76 65 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a  ve iterated.  **
30e0: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63   through all opc
30f0: 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72  odes and hasAbor
3100: 74 20 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63  t may be set inc
3110: 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e  orrectly. Return
3120: 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74  .  ** true for t
3130: 68 69 73 20 63 61 73 65 20 74 6f 20 70 72 65 76  his case to prev
3140: 65 6e 74 20 74 68 65 20 61 73 73 65 72 74 28 29  ent the assert()
3150: 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20   in the callers 
3160: 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20  frame.  ** from 
3170: 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72  failing.  */.  r
3180: 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d  eturn ( v->db->m
3190: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68  allocFailed || h
31a0: 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72  asAbort==mayAbor
31b0: 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65  t || hasFkCounte
31c0: 72 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  r );.}.#endif /*
31d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2d 20   SQLITE_DEBUG - 
31e0: 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 65 72  the sqlite3Asser
31f0: 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 6e 63  tMayAbort() func
3200: 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c  tion */../*.** L
3210: 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20  oop through the 
3220: 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20  program looking 
3230: 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74 68  for P2 values th
3240: 61 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 0a  at are negative.
3250: 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72  ** on jump instr
3260: 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 73  uctions.  Each s
3270: 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c  uch value is a l
3280: 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74  abel.  Resolve t
3290: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73  he.** label by s
32a0: 65 74 74 69 6e 67 20 74 68 65 20 50 32 20 76 61  etting the P2 va
32b0: 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65  lue to its corre
32c0: 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ct non-zero valu
32d0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
32e0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
32f0: 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f  once after all o
3300: 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e  pcodes have been
3310: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
3320: 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46   Variable *pMaxF
3330: 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 20 74  uncArgs is set t
3340: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  o the maximum va
3350: 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72  lue of any P2 ar
3360: 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e  gument .** to an
3370: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50   OP_Function, OP
3380: 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56  _AggStep or OP_V
3390: 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54  Filter opcode. T
33a0: 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 0a  his is used by .
33b0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  ** sqlite3VdbeMa
33c0: 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a  keReady() to siz
33d0: 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  e the Vdbe.apArg
33e0: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  [] array..**.** 
33f0: 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73 20 66  The Op.opflags f
3400: 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e 20 61  ield is set on a
3410: 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73  ll opcodes..*/.s
3420: 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c  tatic void resol
3430: 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20  veP2Values(Vdbe 
3440: 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e  *p, int *pMaxFun
3450: 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b  cArgs){.  int i;
3460: 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20  .  int nMaxArgs 
3470: 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b  = *pMaxFuncArgs;
3480: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61  .  Op *pOp;.  Pa
3490: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
34a0: 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a  >pParse;.  int *
34b0: 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73 65 2d  aLabel = pParse-
34c0: 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65  >aLabel;.  p->re
34d0: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d  adOnly = 1;.  p-
34e0: 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30 3b 0a  >bIsReader = 0;.
34f0: 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70    for(pOp=p->aOp
3500: 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e  , i=p->nOp-1; i>
3510: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b  =0; i--, pOp++){
3520: 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d  .    u8 opcode =
3530: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20   pOp->opcode;.. 
3540: 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73     /* NOTE: Be s
3550: 75 72 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b  ure to update mk
3560: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 77 68 65 6e  opcodeh.awk when
3570: 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76   adding or remov
3580: 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 73 65 73  ing.    ** cases
3590: 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69 74 63   from this switc
35a0: 68 21 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68  h! */.    switch
35b0: 28 20 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20  ( opcode ){.    
35c0: 20 20 63 61 73 65 20 4f 50 5f 46 75 6e 63 74 69    case OP_Functi
35d0: 6f 6e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  on:.      case O
35e0: 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20 20 20  P_AggStep: {.   
35f0: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35       if( pOp->p5
3600: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
3610: 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a  Args = pOp->p5;.
3620: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3630: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
3640: 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  e OP_Transaction
3650: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
3660: 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e  pOp->p2!=0 ) p->
3670: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
3680: 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68        /* fall th
3690: 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ru */.      }.  
36a0: 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74 6f      case OP_Auto
36b0: 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 63 61  Commit:.      ca
36c0: 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a  se OP_Savepoint:
36d0: 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49   {.        p->bI
36e0: 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  sReader = 1;.   
36f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3700: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
3710: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
3720: 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70    case OP_Checkp
3730: 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20  oint:.#endif.   
3740: 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75     case OP_Vacuu
3750: 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  m:.      case OP
3760: 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a  _JournalMode: {.
3770: 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f          p->readO
3780: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nly = 0;.       
3790: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20   p->bIsReader = 
37a0: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
37b0: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
37c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
37d0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
37e0: 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65   case OP_VUpdate
37f0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
3800: 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73  pOp->p2>nMaxArgs
3810: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
3820: 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 62  p->p2;.        b
3830: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
3840: 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c      case OP_VFil
3850: 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ter: {.        i
3860: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  nt n;.        as
3870: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69  sert( p->nOp - i
3880: 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20   >= 3 );.       
3890: 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
38a0: 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65  .opcode==OP_Inte
38b0: 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 6e  ger );.        n
38c0: 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20   = pOp[-1].p1;. 
38d0: 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61         if( n>nMa
38e0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
38f0: 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 62 72   = n;.        br
3900: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  eak;.      }.#en
3910: 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20 4f  dif.      case O
3920: 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 63 61  P_Next:.      ca
3930: 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e  se OP_NextIfOpen
3940: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  :.      case OP_
3950: 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20  SorterNext: {.  
3960: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41        pOp->p4.xA
3970: 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  dvance = sqlite3
3980: 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20  BtreeNext;.     
3990: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
39a0: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20   P4_ADVANCE;.   
39b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
39c0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f    }.      case O
39d0: 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20 63 61  P_Prev:.      ca
39e0: 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e  se OP_PrevIfOpen
39f0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  : {.        pOp-
3a00: 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73  >p4.xAdvance = s
3a10: 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
3a20: 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ous;.        pOp
3a30: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
3a40: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62  VANCE;.        b
3a50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
3a60: 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70    }..    pOp->op
3a70: 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 4f  flags = sqlite3O
3a80: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f 70  pcodeProperty[op
3a90: 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20 28  code];.    if( (
3aa0: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f  pOp->opflags & O
3ab0: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26  PFLG_JUMP)!=0 &&
3ac0: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20   pOp->p2<0 ){.  
3ad0: 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70      assert( -1-p
3ae0: 4f 70 2d 3e 70 32 3c 70 50 61 72 73 65 2d 3e 6e  Op->p2<pParse->n
3af0: 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70  Label );.      p
3b00: 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b  Op->p2 = aLabel[
3b10: 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20  -1-pOp->p2];.   
3b20: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
3b30: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 50  DbFree(p->db, pP
3b40: 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  arse->aLabel);. 
3b50: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20   pParse->aLabel 
3b60: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
3b70: 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d  Label = 0;.  *pM
3b80: 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61  axFuncArgs = nMa
3b90: 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72 74 28  xArgs;.  assert(
3ba0: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21 3d 30   p->bIsReader!=0
3bb0: 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72   || DbMaskAllZer
3bc0: 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20  o(p->btreeMask) 
3bd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
3be0: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
3bf0: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
3c00: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73  uction to be ins
3c10: 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erted..*/.int sq
3c20: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
3c30: 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  Addr(Vdbe *p){. 
3c40: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
3c50: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
3c60: 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  IT );.  return p
3c70: 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ->nOp;.}../*.** 
3c80: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
3c90: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
3ca0: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
3cb0: 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74  opcodes associat
3cc0: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56  ed with.** the V
3cd0: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dbe passed as th
3ce0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
3cf0: 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  . It is the call
3d00: 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
3d10: 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65  ty.** to arrange
3d20: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65   for the returne
3d30: 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76  d array to be ev
3d40: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75  entually freed u
3d50: 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62  sing the .** vdb
3d60: 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66  eFreeOpArray() f
3d70: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42  unction..**.** B
3d80: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
3d90: 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f   *pnOp is set to
3da0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
3db0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65  ntries in the re
3dc0: 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e  turned.** array.
3dd0: 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67   Also, *pnMaxArg
3de0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c   is set to the l
3df0: 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72  arger of its cur
3e00: 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a  rent value and .
3e10: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
3e20: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
3e30: 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72  Vdbe.apArg[] arr
3e40: 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  ay required to e
3e50: 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72  xecute the .** r
3e60: 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e  eturned program.
3e70: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
3e80: 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72  te3VdbeTakeOpArr
3e90: 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ay(Vdbe *p, int 
3ea0: 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61  *pnOp, int *pnMa
3eb0: 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20  xArg){.  VdbeOp 
3ec0: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20  *aOp = p->aOp;. 
3ed0: 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20   assert( aOp && 
3ee0: 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  !p->db->mallocFa
3ef0: 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  iled );..  /* Ch
3f00: 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33  eck that sqlite3
3f10: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20  VdbeUsesBtree() 
3f20: 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f  was not called o
3f30: 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61  n this VM */.  a
3f40: 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c  ssert( DbMaskAll
3f50: 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73  Zero(p->btreeMas
3f60: 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65  k) );..  resolve
3f70: 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61  P2Values(p, pnMa
3f80: 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d  xArg);.  *pnOp =
3f90: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f   p->nOp;.  p->aO
3fa0: 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  p = 0;.  return 
3fb0: 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  aOp;.}../*.** Ad
3fc0: 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f  d a whole list o
3fd0: 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20  f operations to 
3fe0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74  the operation st
3ff0: 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ack.  Return the
4000: 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74  .** address of t
4010: 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69  he first operati
4020: 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74  on added..*/.int
4030: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4040: 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69  pList(Vdbe *p, i
4050: 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69  nt nOp, VdbeOpLi
4060: 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 69  st const *aOp, i
4070: 6e 74 20 69 4c 69 6e 65 6e 6f 29 7b 0a 20 20 69  nt iLineno){.  i
4080: 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72  nt addr;.  asser
4090: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
40a0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
40b0: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e    if( p->nOp + n
40c0: 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e  Op > p->pParse->
40d0: 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77  nOpAlloc && grow
40e0: 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f 70 29 20  OpArray(p, nOp) 
40f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
4100: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d  .  }.  addr = p-
4110: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41  >nOp;.  if( ALWA
4120: 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20  YS(nOp>0) ){.   
4130: 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65   int i;.    Vdbe
4140: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49  OpList const *pI
4150: 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72  n = aOp;.    for
4160: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
4170: 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  , pIn++){.      
4180: 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32  int p2 = pIn->p2
4190: 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
41a0: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69  pOut = &p->aOp[i
41b0: 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f  +addr];.      pO
41c0: 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e  ut->opcode = pIn
41d0: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20  ->opcode;.      
41e0: 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e  pOut->p1 = pIn->
41f0: 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32  p1;.      if( p2
4200: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  <0 ){.        as
4210: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f 70 63  sert( sqlite3Opc
4220: 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 75 74  odeProperty[pOut
4230: 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c  ->opcode] & OPFL
4240: 47 5f 4a 55 4d 50 20 29 3b 0a 20 20 20 20 20 20  G_JUMP );.      
4250: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64    pOut->p2 = add
4260: 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20  r + ADDR(p2);.  
4270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4280: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32     pOut->p2 = p2
4290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
42a0: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e  pOut->p3 = pIn->
42b0: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p3;.      pOut->
42c0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
42d0: 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  SED;.      pOut-
42e0: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20  >p4.p = 0;.     
42f0: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
4300: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4310: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
4320: 45 4e 54 53 0a 20 20 20 20 20 20 70 4f 75 74 2d  ENTS.      pOut-
4330: 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23  >zComment = 0;.#
4340: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
4350: 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  ITE_VDBE_COVERAG
4360: 45 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 69 53  E.      pOut->iS
4370: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f  rcLine = iLineno
4380: 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  +i;.#else.      
4390: 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23  (void)iLineno;.#
43a0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
43b0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
43c0: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
43d0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
43e0: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
43f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
4400: 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72  rintOp(0, i+addr
4410: 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  , &p->aOp[i+addr
4420: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ]);.      }.#end
4430: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
4440: 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a  nOp += nOp;.  }.
4450: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
4460: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
4470: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
4480: 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a  _SCANSTATUS)./*.
4490: 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  ** Add an entry 
44a0: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
44b0: 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67 65 64  counters managed
44c0: 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   by sqlite3_stmt
44d0: 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a  _scanstatus()..*
44e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
44f0: 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20  beScanStatus(.  
4500: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4520: 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73 63 61  /* VM to add sca
4530: 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a  nstatus() to */.
4540: 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69    int addrExplai
4550: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
4560: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
4570: 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30  OP_Explain (or 0
4580: 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c  ) */.  int addrL
4590: 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
45a0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
45b0: 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  s of loop counte
45c0: 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64 64 72  r */ .  int addr
45d0: 56 69 73 69 74 2c 20 20 20 20 20 20 20 20 20 20  Visit,          
45e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
45f0: 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  ss of rows visit
4600: 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  ed counter */.  
4610: 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20 20 20  LogEst nEst,    
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d  /* Estimated num
4640: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
4650: 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ws */.  const ch
4660: 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20  ar *zName       
4670: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
4680: 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  of table or inde
4690: 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20  x being scanned 
46a0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  */.){.  int nByt
46b0: 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29  e = (p->nScan+1)
46c0: 20 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e 53 74   * sizeof(ScanSt
46d0: 61 74 75 73 29 3b 0a 20 20 53 63 61 6e 53 74 61  atus);.  ScanSta
46e0: 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65  tus *aNew;.  aNe
46f0: 77 20 3d 20 28 53 63 61 6e 53 74 61 74 75 73 2a  w = (ScanStatus*
4700: 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f  )sqlite3DbReallo
4710: 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61  c(p->db, p->aSca
4720: 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  n, nByte);.  if(
4730: 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 53 63 61   aNew ){.    Sca
4740: 6e 53 74 61 74 75 73 20 2a 70 4e 65 77 20 3d 20  nStatus *pNew = 
4750: 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b  &aNew[p->nScan++
4760: 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64  ];.    pNew->add
4770: 72 45 78 70 6c 61 69 6e 20 3d 20 61 64 64 72 45  rExplain = addrE
4780: 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77  xplain;.    pNew
4790: 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64  ->addrLoop = add
47a0: 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  rLoop;.    pNew-
47b0: 3e 61 64 64 72 56 69 73 69 74 20 3d 20 61 64 64  >addrVisit = add
47c0: 72 56 69 73 69 74 3b 0a 20 20 20 20 70 4e 65 77  rVisit;.    pNew
47d0: 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20  ->nEst = nEst;. 
47e0: 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d     pNew->zName =
47f0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
4800: 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  (p->db, zName);.
4810: 20 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61      p->aScan = a
4820: 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  New;.  }.}.#endi
4830: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  f.../*.** Change
4840: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
4850: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P1 operand for
4860: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
4870: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
4880: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
4890: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
48a0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
48b0: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
48c0: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
48d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
48e0: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
48f0: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
4900: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
4910: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
4920: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
4930: 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20  beChangeP1(Vdbe 
4940: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e  *p, u32 addr, in
4950: 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  t val){.  assert
4960: 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( p!=0 );.  if( 
4970: 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64  ((u32)p->nOp)>ad
4980: 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  dr ){.    p->aOp
4990: 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b  [addr].p1 = val;
49a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
49b0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
49c0: 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  f the P2 operand
49d0: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
49e0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
49f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4a00: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69  useful for setti
4a10: 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e  ng a jump destin
4a20: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
4a30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4a40: 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P2(Vdbe *p, u32 
4a50: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
4a60: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
4a70: 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d  ;.  if( ((u32)p-
4a80: 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20  >nOp)>addr ){.  
4a90: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
4aa0: 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  2 = val;.  }.}..
4ab0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4ac0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33   value of the P3
4ad0: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
4ae0: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
4af0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
4b00: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
4b10: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
4b20: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
4b30: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
4b40: 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e    if( ((u32)p->n
4b50: 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  Op)>addr ){.    
4b60: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20  p->aOp[addr].p3 
4b70: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
4b80: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
4b90: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35 20 6f  alue of the P5 o
4ba0: 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65 20 6d  perand for the m
4bb0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  ost recently.** 
4bc0: 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e  added operation.
4bd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4be0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62  VdbeChangeP5(Vdb
4bf0: 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20  e *p, u8 val){. 
4c00: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
4c10: 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b  .  if( p->aOp ){
4c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
4c30: 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  nOp>0 );.    p->
4c40: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35  aOp[p->nOp-1].p5
4c50: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
4c60: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
4c70: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  P2 operand of in
4c80: 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73  struction addr s
4c90: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
4ca0: 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65   to.** the addre
4cb0: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
4cc0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
4cd0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20   coded..*/.void 
4ce0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
4cf0: 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ere(Vdbe *p, int
4d00: 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65   addr){.  sqlite
4d10: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c  3VdbeChangeP2(p,
4d20: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a   addr, p->nOp);.
4d30: 20 20 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69    p->pParse->iFi
4d40: 78 65 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70 20 2d  xedOp = p->nOp -
4d50: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66   1;.}.../*.** If
4d60: 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44   the input FuncD
4d70: 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ef structure is 
4d80: 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20  ephemeral, then 
4d90: 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20  free it.  If.** 
4da0: 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e  the FuncDef is n
4db0: 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65  ot ephermal, the
4dc0: 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f  n do nothing..*/
4dd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
4de0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
4df0: 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  on(sqlite3 *db, 
4e00: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a  FuncDef *pDef){.
4e10: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 44 65    if( ALWAYS(pDe
4e20: 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66 75 6e  f) && (pDef->fun
4e30: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
4e40: 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29  FUNC_EPHEM)!=0 )
4e50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
4e60: 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a 20  ree(db, pDef);. 
4e70: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
4e80: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
4e90: 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20  y(sqlite3 *, Op 
4ea0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
4eb0: 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75  Delete a P4 valu
4ec0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
4ed0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
4ee0: 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64  reeP4(sqlite3 *d
4ef0: 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76  b, int p4type, v
4f00: 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66 28 20  oid *p4){.  if( 
4f10: 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  p4 ){.    assert
4f20: 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77 69 74  ( db );.    swit
4f30: 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20  ch( p4type ){.  
4f40: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
4f50: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
4f60: 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73  INT64:.      cas
4f70: 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20  e P4_DYNAMIC:.  
4f80: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
4f90: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 20 20  RRAY: {.        
4fa0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4fb0: 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  , p4);.        b
4fc0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4fd0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
4fe0: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  NFO: {.        i
4ff0: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
5000: 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  eed==0 ) sqlite3
5010: 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65  KeyInfoUnref((Ke
5020: 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20  yInfo*)p4);.    
5030: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5040: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
5050: 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20  _MPRINTF: {.    
5060: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79      if( db->pnBy
5070: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
5080: 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29 3b 0a  lite3_free(p4);.
5090: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
50a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
50b0: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
50c0: 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65          freeEphe
50d0: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62  meralFunction(db
50e0: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b  , (FuncDef*)p4);
50f0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5100: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
5110: 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20  se P4_MEM: {.   
5120: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
5130: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a  ytesFreed==0 ){.
5140: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5150: 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69  3ValueFree((sqli
5160: 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a  te3_value*)p4);.
5170: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5180: 20 20 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20           Mem *p 
5190: 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20  = (Mem*)p4;.    
51a0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d        if( p->szM
51b0: 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44  alloc ) sqlite3D
51c0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
51d0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20  lloc);.         
51e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
51f0: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
5200: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
5220: 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20  se P4_VTAB : {. 
5230: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
5240: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
5250: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
5260: 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29  ck((VTable *)p4)
5270: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
5280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5290: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
52a0: 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
52b0: 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64  ated for aOp and
52c0: 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61   any p4 values a
52d0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
52e0: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74  .** opcodes cont
52f0: 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66  ained within. If
5300: 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   aOp is not NULL
5310: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
5320: 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f  o contain .** nO
5330: 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73  p entries. .*/.s
5340: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
5350: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
5360: 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c  e3 *db, Op *aOp,
5370: 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28   int nOp){.  if(
5380: 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a   aOp ){.    Op *
5390: 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70  pOp;.    for(pOp
53a0: 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e  =aOp; pOp<&aOp[n
53b0: 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  Op]; pOp++){.   
53c0: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
53d0: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
53e0: 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51  p4.p);.#ifdef SQ
53f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
5400: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
5410: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5420: 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  (db, pOp->zComme
5430: 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20  nt);.#endif     
5440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
5450: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
5460: 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69  Op);.}../*.** Li
5470: 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72 61  nk the SubProgra
5480: 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  m object passed 
5490: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
54a0: 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20  gument into the 
54b0: 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61  linked.** list a
54c0: 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72  t Vdbe.pSubProgr
54d0: 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73  am. This list is
54e0: 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20   used to delete 
54f0: 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a  all sub-program.
5500: 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20  ** objects when 
5510: 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e  the VM is no lon
5520: 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f  ger required..*/
5530: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5540: 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28  eLinkSubProgram(
5550: 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62  Vdbe *pVdbe, Sub
5560: 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70  Program *p){.  p
5570: 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d  ->pNext = pVdbe-
5580: 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64  >pProgram;.  pVd
5590: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70  be->pProgram = p
55a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
55b0: 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20  e the opcode at 
55c0: 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f  addr into OP_Noo
55d0: 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  p.*/.void sqlite
55e0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
55f0: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
5600: 64 64 72 29 7b 0a 20 20 69 66 28 20 61 64 64 72  ddr){.  if( addr
5610: 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 56  <p->nOp ){.    V
5620: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
5630: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20  >aOp[addr];.    
5640: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
5650: 3e 64 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28  >db;.    freeP4(
5660: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
5670: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20   pOp->p4.p);.   
5680: 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20   memset(pOp, 0, 
5690: 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b  sizeof(pOp[0]));
56a0: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  .    pOp->opcode
56b0: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
56c0: 69 66 28 20 61 64 64 72 3d 3d 70 2d 3e 6e 4f 70  if( addr==p->nOp
56d0: 2d 31 20 29 20 70 2d 3e 6e 4f 70 2d 2d 3b 0a 20  -1 ) p->nOp--;. 
56e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
56f0: 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69  he last opcode i
5700: 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73  s "op" and it is
5710: 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74   not a jump dest
5720: 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e  ination,.** then
5730: 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74   remove it.  Ret
5740: 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20  urn true if and 
5750: 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64  only if an opcod
5760: 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a  e was removed..*
5770: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
5780: 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f  eDeletePriorOpco
5790: 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f  de(Vdbe *p, u8 o
57a0: 70 29 7b 0a 20 20 69 66 28 20 28 70 2d 3e 6e 4f  p){.  if( (p->nO
57b0: 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72 73 65 2d  p-1)>(p->pParse-
57c0: 3e 69 46 69 78 65 64 4f 70 29 20 26 26 20 70 2d  >iFixedOp) && p-
57d0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f  >aOp[p->nOp-1].o
57e0: 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20  pcode==op ){.   
57f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5800: 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e  geToNoop(p, p->n
5810: 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  Op-1);.    retur
5820: 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 1;.  }else{.  
5830: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
5840: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
5850: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
5860: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
5870: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
5880: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
5890: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
58a0: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
58b0: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
58c0: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
58d0: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
58e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
58f0: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
5900: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
5910: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
5920: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
5930: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
5940: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
5950: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
5960: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
5970: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
5980: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
5990: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
59a0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
59b0: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
59c0: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
59d0: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
59e0: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
59f0: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
5a00: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
5a10: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
5a20: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
5a30: 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c  ** .** Other val
5a40: 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41  ues of n (P4_STA
5a50: 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20  TIC, P4_COLLSEQ 
5a60: 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74  etc.) indicate t
5a70: 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a  hat zP4 points.*
5a80: 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72  * to a string or
5a90: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
5aa0: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
5ab0: 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c   exist for the l
5ac0: 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68  ifetime of.** th
5ad0: 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65  e Vdbe. In these
5ae0: 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75   cases we can ju
5af0: 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e  st copy the poin
5b00: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64  ter..**.** If ad
5b10: 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65  dr<0 then change
5b20: 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20   P4 on the most 
5b30: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
5b40: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
5b50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5b60: 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65 20  beChangeP4(Vdbe 
5b70: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f  *p, int addr, co
5b80: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69  nst char *zP4, i
5b90: 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70  nt n){.  Op *pOp
5ba0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
5bb0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
5bc0: 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
5bd0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
5be0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
5bf0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
5c00: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  >aOp==0 || db->m
5c10: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
5c20: 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56 54 41     if( n!=P4_VTA
5c30: 42 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  B ){.      freeP
5c40: 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29  4(db, n, (void*)
5c50: 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a  *(char**)&zP4);.
5c60: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
5c70: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5c80: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
5c90: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
5ca0: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
5cb0: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
5cc0: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
5cd0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
5ce0: 61 64 64 72 5d 3b 0a 20 20 61 73 73 65 72 74 28  addr];.  assert(
5cf0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
5d00: 5f 4e 4f 54 55 53 45 44 0a 20 20 20 20 20 20 20  _NOTUSED.       
5d10: 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  || pOp->p4type==
5d20: 50 34 5f 49 4e 54 33 32 0a 20 20 20 20 20 20 20  P4_INT32.       
5d30: 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  || pOp->p4type==
5d40: 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20  P4_KEYINFO );.  
5d50: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
5d60: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
5d70: 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p);.  pOp->p4.p 
5d80: 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34  = 0;.  if( n==P4
5d90: 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a  _INT32 ){.    /*
5da0: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74   Note: this cast
5db0: 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73   is safe, becaus
5dc0: 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74  e the origin dat
5dd0: 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69  a point was an i
5de0: 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  nt.    ** that w
5df0: 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f  as cast to a (co
5e00: 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a  nst char *). */.
5e10: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20      pOp->p4.i = 
5e20: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
5e30: 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  T(zP4);.    pOp-
5e40: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54  >p4type = P4_INT
5e50: 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  32;.  }else if( 
5e60: 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f  zP4==0 ){.    pO
5e70: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  p->p4.p = 0;.   
5e80: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5e90: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c  4_NOTUSED;.  }el
5ea0: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59  se if( n==P4_KEY
5eb0: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4f 70 2d  INFO ){.    pOp-
5ec0: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
5ed0: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
5ee0: 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  ype = P4_KEYINFO
5ef0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  ;.  }else if( n=
5f00: 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  =P4_VTAB ){.    
5f10: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
5f20: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
5f30: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56 54 41  >p4type = P4_VTA
5f40: 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  B;.    sqlite3Vt
5f50: 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a  abLock((VTable *
5f60: 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 65 72  )zP4);.    asser
5f70: 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29 7a 50  t( ((VTable *)zP
5f80: 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b  4)->db==p->db );
5f90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30  .  }else if( n<0
5fa0: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
5fb0: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
5fc0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5fd0: 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e  = (signed char)n
5fe0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
5ff0: 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71  f( n==0 ) n = sq
6000: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
6010: 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e  4);.    pOp->p4.
6020: 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  z = sqlite3DbStr
6030: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c  NDup(p->db, zP4,
6040: 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34   n);.    pOp->p4
6050: 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49  type = P4_DYNAMI
6060: 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  C;.  }.}../*.** 
6070: 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68  Set the P4 on th
6080: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
6090: 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20  added opcode to 
60a0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20  the KeyInfo for 
60b0: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76  the.** index giv
60c0: 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  en..*/.void sqli
60d0: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
60e0: 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
60f0: 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
6100: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
6110: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
6120: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
6130: 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20  assert( pIdx!=0 
6140: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6150: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
6160: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
6170: 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61  yInfoOfIndex(pPa
6180: 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20 20 20  rse, pIdx),.    
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61a0: 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d    P4_KEYINFO);.}
61b0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
61c0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
61d0: 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68  OMMENTS./*.** Ch
61e0: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
61f0: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
6200: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
6210: 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20  ruction.  Or.** 
6220: 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61  insert a No-op a
6230: 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65  nd add the comme
6240: 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69  nt to that new i
6250: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69  nstruction.  Thi
6260: 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63  s.** makes the c
6270: 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65  ode easier to re
6280: 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67  ad during debugg
6290: 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ing.  None of th
62a0: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e  is happens.** in
62b0: 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75   a production bu
62c0: 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ild..*/.static v
62d0: 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74  oid vdbeVComment
62e0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
62f0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76  char *zFormat, v
6300: 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73  a_list ap){.  as
6310: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
6320: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20  | p->aOp==0 );. 
6330: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d   assert( p->aOp=
6340: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  =0 || p->aOp[p->
6350: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d  nOp-1].zComment=
6360: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
6370: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
6380: 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  f( p->nOp ){.   
6390: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20   assert( p->aOp 
63a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
63b0: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Free(p->db, p->a
63c0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
63d0: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61  mment);.    p->a
63e0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
63f0: 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  mment = sqlite3V
6400: 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a  MPrintf(p->db, z
6410: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d  Format, ap);.  }
6420: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
6430: 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  dbeComment(Vdbe 
6440: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
6450: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
6460: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
6470: 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73  f( p ){.    va_s
6480: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
6490: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d  );.    vdbeVComm
64a0: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20  ent(p, zFormat, 
64b0: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
64c0: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  ap);.  }.}.void 
64d0: 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43  sqlite3VdbeNoopC
64e0: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
64f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
6500: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
6510: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
6520: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
6530: 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f  dbeAddOp0(p, OP_
6540: 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74  Noop);.    va_st
6550: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
6560: 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65  ;.    vdbeVComme
6570: 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  nt(p, zFormat, a
6580: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
6590: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  p);.  }.}.#endif
65a0: 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a    /* NDEBUG */..
65b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44  #ifdef SQLITE_VD
65c0: 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a  BE_COVERAGE./*.*
65d0: 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
65e0: 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65 20  if the iSrcLine 
65f0: 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70 72  field for the pr
6600: 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20 69  eviously coded i
6610: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
6620: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
6630: 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64 62  etLineNumber(Vdb
6640: 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29  e *v, int iLine)
6650: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  {.  sqlite3VdbeG
6660: 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63  etOp(v,-1)->iSrc
6670: 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a  Line = iLine;.}.
6680: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
6690: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20 2a  _VDBE_COVERAGE *
66a0: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
66b0: 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  the opcode for a
66c0: 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20   given address. 
66d0: 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20   If the address 
66e0: 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72  is -1, then.** r
66f0: 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72  eturn the most r
6700: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
6710: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49   opcode..**.** I
6720: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
6730: 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20  ation error has 
6740: 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74  occurred prior t
6750: 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66  o the calling of
6760: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
6770: 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
6780: 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65   to a dummy Vdbe
6790: 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  Op will be retur
67a0: 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64  ned.  That opcod
67b0: 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65  e.** is readable
67c0: 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c   but not writabl
67d0: 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  e, though it is 
67e0: 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61 62  cast to a writab
67f0: 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65  le value..** The
6800: 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d   return of a dum
6810: 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73  my opcode allows
6820: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e   the call to con
6830: 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e  tinue functionin
6840: 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f  g.** after an OO
6850: 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20  M fault without 
6860: 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20  having to check 
6870: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65  to see if the re
6880: 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68  turn from .** th
6890: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
68a0: 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20  valid pointer.  
68b0: 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20  But because the 
68c0: 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20  dummy.opcode is 
68d0: 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c  0,.** dummy will
68e0: 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 65   never be writte
68f0: 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76  n to.  This is v
6900: 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 20  erified by code 
6910: 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a  inspection and.*
6920: 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74  * by running wit
6930: 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56  h Valgrind..*/.V
6940: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
6950: 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c  beGetOp(Vdbe *p,
6960: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a   int addr){.  /*
6970: 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74   C89 specifies t
6980: 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  hat the constant
6990: 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65   "dummy" will be
69a0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
69b0: 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20  all.  ** zeros, 
69c0: 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74  which is correct
69d0: 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65  .  MSVC generate
69e0: 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76  s a warning, nev
69f0: 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20  ertheless. */.  
6a00: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75  static VdbeOp du
6a10: 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  mmy;  /* Ignore 
6a20: 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67  the MSVC warning
6a30: 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61   about no initia
6a40: 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  lizer */.  asser
6a50: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
6a60: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
6a70: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
6a80: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
6a90: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  p - 1;.  }.  ass
6aa0: 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26  ert( (addr>=0 &&
6ab0: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c   addr<p->nOp) ||
6ac0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
6ad0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
6ae0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
6af0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
6b00: 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b  (VdbeOp*)&dummy;
6b10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
6b20: 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64  turn &p->aOp[add
6b30: 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64  r];.  }.}..#if d
6b40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
6b50: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
6b60: 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74  MENTS)./*.** Ret
6b70: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76  urn an integer v
6b80: 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20  alue for one of 
6b90: 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74  the parameters t
6ba0: 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f 70  o the opcode pOp
6bb0: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
6bc0: 79 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a 2a  y character c..*
6bd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61  /.static int tra
6be0: 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c 20  nslateP(char c, 
6bf0: 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a  const Op *pOp){.
6c00: 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20 72    if( c=='1' ) r
6c10: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20  eturn pOp->p1;. 
6c20: 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72 65   if( c=='2' ) re
6c30: 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  turn pOp->p2;.  
6c40: 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65 74  if( c=='3' ) ret
6c50: 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69  urn pOp->p3;.  i
6c60: 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74 75  f( c=='4' ) retu
6c70: 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20  rn pOp->p4.i;.  
6c80: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a  return pOp->p5;.
6c90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
6ca0: 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68   a string for th
6cb0: 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c  e "comment" fiel
6cc0: 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f  d of a VDBE opco
6cd0: 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a  de listing..**.*
6ce0: 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a 20  * The Synopsis: 
6cf0: 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74  field in comment
6d00: 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20  s in the vdbe.c 
6d10: 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74 73  source file gets
6d20: 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f   converted.** to
6d30: 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e 67   an extra string
6d40: 20 74 68 61 74 20 69 73 20 61 70 70 65 6e 64 65   that is appende
6d50: 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  d to the sqlite3
6d60: 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49  OpcodeName().  I
6d70: 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65  n the.** absence
6d80: 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e   of other commen
6d90: 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 69  ts, this synopsi
6da0: 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f  s becomes the co
6db0: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63  mment on the opc
6dc0: 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61  ode..** Some tra
6dd0: 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a  nslation occurs:
6de0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  .**.**       "PX
6df0: 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d  "      ->  "r[X]
6e00: 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50  ".**       "PX@P
6e10: 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58  Y"   ->  "r[X..X
6e20: 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d  +Y-1]"  or "r[x]
6e30: 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 20 31  " if y is 0 or 1
6e40: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59  .**       "PX@PY
6e50: 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b  +1" ->  "r[X..X+
6e60: 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d 22  Y]"    or "r[x]"
6e70: 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 20   if y is 0.**   
6e80: 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e      "PY..PY"  ->
6e90: 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20    "r[X..Y]"     
6ea0: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 3c   or "r[x]" if y<
6eb0: 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  =x.*/.static int
6ec0: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28   displayComment(
6ed0: 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70  .  const Op *pOp
6ee0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63  ,     /* The opc
6ef0: 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e  ode to be commen
6f00: 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ted */.  const c
6f10: 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50  har *zP4,   /* P
6f20: 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e  reviously obtain
6f30: 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34 20  ed value for P4 
6f40: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  */.  char *zTemp
6f50: 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ,       /* Write
6f60: 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
6f70: 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 20    int nTemp     
6f80: 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76       /* Space av
6f90: 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70  ailable in zTemp
6fa0: 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  [] */.){.  const
6fb0: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a   char *zOpName;.
6fc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
6fd0: 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e  ynopsis;.  int n
6fe0: 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69  OpName;.  int ii
6ff0: 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20  , jj;.  zOpName 
7000: 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  = sqlite3OpcodeN
7010: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
7020: 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71  ;.  nOpName = sq
7030: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f  lite3Strlen30(zO
7040: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f  pName);.  if( zO
7050: 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d  pName[nOpName+1]
7060: 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   ){.    int seen
7070: 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  Com = 0;.    cha
7080: 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73  r c;.    zSynops
7090: 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20  is = zOpName += 
70a0: 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20  nOpName + 1;.   
70b0: 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a   for(ii=jj=0; jj
70c0: 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d  <nTemp-1 && (c =
70d0: 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21   zSynopsis[ii])!
70e0: 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  =0; ii++){.     
70f0: 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20   if( c=='P' ){. 
7100: 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f         c = zSyno
7110: 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20  psis[++ii];.    
7120: 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29      if( c=='4' )
7130: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
7140: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7150: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
7160: 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20   "%s", zP4);.   
7170: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
7180: 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20  =='X' ){.       
7190: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
71a0: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
71b0: 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f  emp+jj, "%s", pO
71c0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  p->zComment);.  
71d0: 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20          seenCom 
71e0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
71f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
7200: 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65  t v1 = translate
7210: 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  P(c, pOp);.     
7220: 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20       int v2;.   
7230: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
7240: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
7250: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22  , zTemp+jj, "%d"
7260: 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , v1);.         
7270: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
7280: 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50  nopsis+ii+1, "@P
7290: 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 2)==0 ){.    
72a0: 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b          ii += 3;
72b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
72c0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
72d0: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20  30(zTemp+jj);.  
72e0: 20 20 20 20 20 20 20 20 20 20 76 32 20 3d 20 74            v2 = t
72f0: 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70  ranslateP(zSynop
7300: 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20  sis[ii], pOp);. 
7310: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
7320: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
7330: 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30  +ii+1,"+1",2)==0
7340: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7350: 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20    ii += 2;.     
7360: 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20           v2++;. 
7370: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
7380: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 32 3e           if( v2>
7390: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
73a0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
73b0: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
73c0: 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20  emp+jj, "..%d", 
73d0: 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20  v1+v2-1);.      
73e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
73f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
7400: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69  cmp(zSynopsis+ii
7410: 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d  +1, "..P3", 4)==
7420: 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20  0 && pOp->p3==0 
7430: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
7440: 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
7450: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
7460: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
7470: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
7480: 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  p+jj);.      }el
7490: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  se{.        zTem
74a0: 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  p[jj++] = c;.   
74b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
74c0: 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a  f( !seenCom && j
74d0: 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70  j<nTemp-5 && pOp
74e0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
74f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7500: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
7510: 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c  Temp+jj, "; %s",
7520: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
7530: 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c  .      jj += sql
7540: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
7550: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20  mp+jj);.    }.  
7560: 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29    if( jj<nTemp )
7570: 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a   zTemp[jj] = 0;.
7580: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
7590: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
75a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
75b0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
75c0: 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  "%s", pOp->zComm
75d0: 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73  ent);.    jj = s
75e0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
75f0: 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Temp);.  }else{.
7600: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
7610: 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20  ;.    jj = 0;.  
7620: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d  }.  return jj;.}
7630: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7640: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a 23 69 66  E_DEBUG */...#if
7650: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7660: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c  _OMIT_EXPLAIN) |
7670: 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  | !defined(NDEBU
7680: 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66  G) \.     || def
7690: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
76a0: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
76b0: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
76c0: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
76d0: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
76e0: 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74  s the P4 paramet
76f0: 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65  er for an opcode
7700: 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66  ..** Use zTemp f
7710: 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  or any required 
7720: 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
7730: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
7740: 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50  c char *displayP
7750: 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20  4(Op *pOp, char 
7760: 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d  *zTemp, int nTem
7770: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20  p){.  char *zP4 
7780: 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72  = zTemp;.  asser
7790: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
77a0: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
77b0: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  4type ){.    cas
77c0: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
77d0: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
77e0: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
77f0: 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
7800: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
7810: 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
7820: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
7830: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
7840: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7850: 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28 25 64 22  p, zTemp, "k(%d"
7860: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
7870: 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73  ld);.      i = s
7880: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7890: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Temp);.      for
78a0: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
78b0: 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a  ->nField; j++){.
78c0: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
78d0: 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66  *pColl = pKeyInf
78e0: 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  o->aColl[j];.   
78f0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
7900: 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f  *zColl = pColl ?
7910: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
7920: 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20 20 69  "nil";.        i
7930: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
7940: 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20  rlen30(zColl);. 
7950: 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 36 20         if( n==6 
7960: 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c 6c 2c  && memcmp(zColl,
7970: 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d 30 20 29  "BINARY",6)==0 )
7980: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c  {.          zCol
7990: 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20  l = "B";.       
79a0: 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20     n = 1;.      
79b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
79c0: 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20  i+n>nTemp-6 ){. 
79d0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
79e0: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22  &zTemp[i],",..."
79f0: 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ,4);.          b
7a00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
7a10: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
7a20: 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  +] = ',';.      
7a30: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
7a40: 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b  aSortOrder[j] ){
7a50: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70  .          zTemp
7a60: 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20  [i++] = '-';.   
7a70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
7a80: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
7a90: 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a 20 20   zColl, n+1);.  
7aa0: 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20        i += n;.  
7ab0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d      }.      zTem
7ac0: 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  p[i++] = ')';.  
7ad0: 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30      zTemp[i] = 0
7ae0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
7af0: 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20  i<nTemp );.     
7b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7b10: 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45    case P4_COLLSE
7b20: 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  Q: {.      CollS
7b30: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d  eq *pColl = pOp-
7b40: 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  >p4.pColl;.     
7b50: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7b60: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7b70: 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c  "(%.20s)", pColl
7b80: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
7b90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7ba0: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
7bb0: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
7bc0: 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70  f *pDef = pOp->p
7bd0: 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  4.pFunc;.      s
7be0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7bf0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
7c00: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
7c10: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
7c20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7c30: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
7c40: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
7c50: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7c60: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
7c70: 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  %lld", *pOp->p4.
7c80: 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65  pI64);.      bre
7c90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7ca0: 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20  se P4_INT32: {. 
7cb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7cc0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7cd0: 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70  mp, "%d", pOp->p
7ce0: 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61  4.i);.      brea
7cf0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7d00: 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P4_REAL: {.   
7d10: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7d20: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7d30: 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d  , "%.16g", *pOp-
7d40: 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20  >p4.pReal);.    
7d50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7d60: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
7d70: 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
7d80: 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d  m = pOp->p4.pMem
7d90: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
7da0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
7db0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
7dc0: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
7dd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
7de0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
7df0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
7e00: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7e10: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
7e20: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
7e30: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7e40: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
7e50: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
7e60: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7e70: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7e80: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
7e90: 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
7ea0: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
7eb0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
7ec0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7ed0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
7ee0: 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a  zTemp, "NULL");.
7ef0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7f00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
7f10: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  m->flags & MEM_B
7f20: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  lob );.        z
7f30: 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20  P4 = "(blob)";. 
7f40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7f50: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
7f60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
7f70: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
7f80: 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20  ase P4_VTAB: {. 
7f90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
7fa0: 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  b *pVtab = pOp->
7fb0: 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
7fc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7fd0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7fe0: 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 22 2c  Temp, "vtab:%p",
7ff0: 20 70 56 74 61 62 29 3b 0a 20 20 20 20 20 20 62   pVtab);.      b
8000: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
8010: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  if.    case P4_I
8020: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
8030: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8040: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
8050: 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20  "intarray");.   
8060: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8070: 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50      case P4_SUBP
8080: 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20  ROGRAM: {.      
8090: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
80a0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
80b0: 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
80c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
80d0: 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43    case P4_ADVANC
80e0: 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70  E: {.      zTemp
80f0: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  [0] = 0;.      b
8100: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8110: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
8120: 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a   zP4 = pOp->p4.z
8130: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d  ;.      if( zP4=
8140: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  =0 ){.        zP
8150: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20  4 = zTemp;.     
8160: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b     zTemp[0] = 0;
8170: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8180: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34   }.  assert( zP4
8190: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
81a0: 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  zP4;.}.#endif../
81b0: 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20  *.** Declare to 
81c0: 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74 68  the Vdbe that th
81d0: 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61  e BTree object a
81e0: 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20  t db->aDb[i] is 
81f0: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  used..**.** The 
8200: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
8210: 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77  nts need to know
8220: 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20   in advance the 
8230: 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a  complete set of.
8240: 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ** attached data
8250: 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20  bases that will 
8260: 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20  be use.  A mask 
8270: 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61 73  of these databas
8280: 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69  es.** is maintai
8290: 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d  ned in p->btreeM
82a0: 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63  ask.  The p->loc
82b0: 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74  kMask value is t
82c0: 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20  he subset of.** 
82d0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20  p->btreeMask of 
82e0: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77  databases that w
82f0: 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f  ill require a lo
8300: 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ck..*/.void sqli
8310: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
8320: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29  (Vdbe *p, int i)
8330: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  {.  assert( i>=0
8340: 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62   && i<p->db->nDb
8350: 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f   && i<(int)sizeo
8360: 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a  f(yDbMask)*8 );.
8370: 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74    assert( i<(int
8380: 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65  )sizeof(p->btree
8390: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d  Mask)*8 );.  DbM
83a0: 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65 4d  askSet(p->btreeM
83b0: 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20 69  ask, i);.  if( i
83c0: 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42 74  !=1 && sqlite3Bt
83d0: 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64  reeSharable(p->d
83e0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29  b->aDb[i].pBt) )
83f0: 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28  {.    DbMaskSet(
8400: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b  p->lockMask, i);
8410: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66  .  }.}..#if !def
8420: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8430: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
8440: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
8450: 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53  AFE>0./*.** If S
8460: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
8470: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61  d to support sha
8480: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61  red-cache mode a
8490: 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73  nd to be threads
84a0: 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  afe,.** this rou
84b0: 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65  tine obtains the
84c0: 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65   mutex associate
84d0: 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53 68  d with each BtSh
84e0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a  ared structure.*
84f0: 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 63  * that may be ac
8500: 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d  cessed by the VM
8510: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
8520: 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67  gument. In doing
8530: 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73   so it also.** s
8540: 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64  ets the BtShared
8550: 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61  .db member of ea
8560: 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  ch of the BtShar
8570: 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65  ed structures, e
8580: 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20  nsuring.** that 
8590: 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79  the correct busy
85a0: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
85b0: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20  k is invoked if 
85c0: 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
85d0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
85e0: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20   threadsafe but 
85f0: 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61  does support sha
8600: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
8610: 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42  then.** sqlite3B
8620: 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20 69  treeEnter() is i
8630: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68  nvoked to set th
8640: 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76 61  e BtShared.db va
8650: 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c  riables.** of al
8660: 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73 74  l of BtShared st
8670: 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73 69  ructures accessi
8680: 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74 61  ble via the data
8690: 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20  base handle .** 
86a0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
86b0: 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66  the VM..**.** If
86c0: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
86d0: 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f  hreadsafe and do
86e0: 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73  es not support s
86f0: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
8700: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
8710: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
8720: 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65  *.** The p->btre
8730: 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61  eMask field is a
8740: 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20   bitmask of all 
8750: 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65 20  btrees that the 
8760: 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61  prepared .** sta
8770: 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76  tement p will ev
8780: 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62  er use.  Let N b
8790: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
87a0: 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65  bits in p->btree
87b0: 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  Mask.** correspo
87c0: 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20  nding to btrees 
87d0: 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20  that use shared 
87e0: 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65  cache.  Then the
87f0: 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74   runtime of.** t
8800: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e  his routine is N
8810: 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73  *N.  But as N is
8820: 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61   rarely more tha
8830: 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64  n 1, this should
8840: 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f   not.** be a pro
8850: 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  blem..*/.void sq
8860: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 56  lite3VdbeEnter(V
8870: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
8880: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
8890: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e  .  Db *aDb;.  in
88a0: 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d  t nDb;.  if( DbM
88b0: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f  askAllZero(p->lo
88c0: 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e  ckMask) ) return
88d0: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
88e0: 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20   case */.  db = 
88f0: 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64  p->db;.  aDb = d
8900: 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20  b->aDb;.  nDb = 
8910: 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69  db->nDb;.  for(i
8920: 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b  =0; i<nDb; i++){
8930: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
8940: 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c   DbMaskTest(p->l
8950: 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c  ockMask,i) && AL
8960: 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21  WAYS(aDb[i].pBt!
8970: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =0) ){.      sql
8980: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 61  ite3BtreeEnter(a
8990: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
89a0: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
89b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
89c0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
89d0: 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45  CACHE) && SQLITE
89e0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a  _THREADSAFE>0./*
89f0: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f  .** Unlock all o
8a00: 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72 65  f the btrees pre
8a10: 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62  viously locked b
8a20: 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  y a call to sqli
8a30: 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a  te3VdbeEnter()..
8a40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
8a50: 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70  dbeLeave(Vdbe *p
8a60: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
8a70: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20  lite3 *db;.  Db 
8a80: 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b  *aDb;.  int nDb;
8a90: 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c  .  if( DbMaskAll
8aa0: 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Zero(p->lockMask
8ab0: 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
8ac0: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
8ad0: 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  */.  db = p->db;
8ae0: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
8af0: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
8b00: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  b;.  for(i=0; i<
8b10: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
8b20: 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73  f( i!=1 && DbMas
8b30: 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73  kTest(p->lockMas
8b40: 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61  k,i) && ALWAYS(a
8b50: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
8b60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
8b70: 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e  reeLeave(aDb[i].
8b80: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
8b90: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
8ba0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
8bb0: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
8bc0: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
8bd0: 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c  ** Print a singl
8be0: 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  e opcode.  This 
8bf0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
8c00: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  for debugging on
8c10: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
8c20: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46  te3VdbePrintOp(F
8c30: 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70  ILE *pOut, int p
8c40: 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63  c, Op *pOp){.  c
8c50: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72  har *zP4;.  char
8c60: 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61   zPtr[50];.  cha
8c70: 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73  r zCom[100];.  s
8c80: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
8c90: 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34   *zFormat1 = "%4
8ca0: 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20  d %-13s %4d %4d 
8cb0: 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25  %4d %-13s %.2X %
8cc0: 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74  s\n";.  if( pOut
8cd0: 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64  ==0 ) pOut = std
8ce0: 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73  out;.  zP4 = dis
8cf0: 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72  playP4(pOp, zPtr
8d00: 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b  , sizeof(zPtr));
8d10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8d20: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
8d30: 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79  MMENTS.  display
8d40: 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34  Comment(pOp, zP4
8d50: 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a  , zCom, sizeof(z
8d60: 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a  Com));.#else.  z
8d70: 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64  Com[0] = 0;.#end
8d80: 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65  if.  /* NB:  The
8d90: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
8da0: 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  me() function is
8db0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
8dc0: 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20 20 2a  code created.  *
8dd0: 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64  * by the mkopcod
8de0: 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63  eh.awk and mkopc
8df0: 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70 74 73  odec.awk scripts
8e00: 20 77 68 69 63 68 20 65 78 74 72 61 63 74 20 74   which extract t
8e10: 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  he.  ** informat
8e20: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 64 62  ion from the vdb
8e30: 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78 74 20  e.c source text 
8e40: 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75  */.  fprintf(pOu
8e50: 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c  t, zFormat1, pc,
8e60: 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f   .      sqlite3O
8e70: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
8e80: 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c  pcode), pOp->p1,
8e90: 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70   pOp->p2, pOp->p
8ea0: 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c  3, zP4, pOp->p5,
8eb0: 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b  .      zCom.  );
8ec0: 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b  .  fflush(pOut);
8ed0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
8ee0: 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61   Release an arra
8ef0: 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65  y of N Mem eleme
8f00: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts.*/.static vo
8f10: 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  id releaseMemArr
8f20: 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e  ay(Mem *p, int N
8f30: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20  ){.  if( p && N 
8f40: 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64  ){.    Mem *pEnd
8f50: 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71   = &p[N];.    sq
8f60: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
8f70: 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63  b;.    u8 malloc
8f80: 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61  _failed = db->ma
8f90: 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
8fa0: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
8fb0: 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64 6f  reed ){.      do
8fc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
8fd0: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  >szMalloc ) sqli
8fe0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
8ff0: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
9000: 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70   }while( (++p)<p
9010: 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  End );.      ret
9020: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  urn;.    }.    d
9030: 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o{.      assert(
9040: 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c   (&p[1])==pEnd |
9050: 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e  | p[0].db==p[1].
9060: 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  db );.      asse
9070: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt( sqlite3VdbeC
9080: 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74  heckMemInvariant
9090: 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  s(p) );..      /
90a0: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  * This block is 
90b0: 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65  really an inline
90c0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
90d0: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
90e0: 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68  se().      ** th
90f0: 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61  at takes advanta
9100: 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  ge of the fact t
9110: 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  hat the memory c
9120: 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20  ell value is .  
9130: 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74      ** being set
9140: 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72   to NULL after r
9150: 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e  eleasing any dyn
9160: 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a  amic resources..
9170: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
9180: 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74  * The justificat
9190: 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
91a0: 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74  ing code is that
91b0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20   according to . 
91c0: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e       ** callgrin
91d0: 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61  d, this causes a
91e0: 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61   certain test ca
91f0: 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50  se to hit the CP
9200: 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20  U 4.7 .      ** 
9210: 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38  percent less (x8
9220: 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72  6 linux, gcc ver
9230: 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29  sion 4.1.2, -O6)
9240: 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20   than if .      
9250: 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c  ** sqlite3MemRel
9260: 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c  ease() were call
9270: 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69  ed from here. Wi
9280: 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d  th -O2, this jum
9290: 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36  ps.      ** to 6
92a0: 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20  .6 percent. The 
92b0: 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73  test case is ins
92c0: 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73  erting 1000 rows
92d0: 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20   into a table . 
92e0: 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20       ** with no 
92f0: 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20  indexes using a 
9300: 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20  single prepared 
9310: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
9320: 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20  , bind() .      
9330: 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20  ** and reset(). 
9340: 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75  Inserts are grou
9350: 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73  ped into a trans
9360: 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
9370: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9380: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
9390: 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Agg );.      tes
93a0: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
93b0: 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20  & MEM_Dyn );.   
93c0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
93d0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d  flags & MEM_Fram
93e0: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
93f0: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ase( p->flags & 
9400: 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20  MEM_RowSet );.  
9410: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
9420: 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79  &(MEM_Agg|MEM_Dy
9430: 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f  n|MEM_Frame|MEM_
9440: 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20  RowSet) ){.     
9450: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
9460: 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20  mRelease(p);.   
9470: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
9480: 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  szMalloc ){.    
9490: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
94a0: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
94b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 7a  );.        p->sz
94c0: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
94d0: 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c    }..      p->fl
94e0: 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69  ags = MEM_Undefi
94f0: 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ned;.    }while(
9500: 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20   (++p)<pEnd );. 
9510: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
9520: 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69  led = malloc_fai
9530: 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  led;.  }.}../*.*
9540: 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46  * Delete a VdbeF
9550: 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  rame object and 
9560: 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64  its contents. Vd
9570: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20  beFrame objects 
9580: 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
9590: 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72   by the OP_Progr
95a0: 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c  am opcode in sql
95b0: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a  ite3VdbeExec()..
95c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
95d0: 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56  dbeFrameDelete(V
95e0: 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20  dbeFrame *p){.  
95f0: 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d  int i;.  Mem *aM
9600: 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65  em = VdbeFrameMe
9610: 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73  m(p);.  VdbeCurs
9620: 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64  or **apCsr = (Vd
9630: 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65  beCursor **)&aMe
9640: 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b  m[p->nChildMem];
9650: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
9660: 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29  >nChildCsr; i++)
9670: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
9680: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76  eFreeCursor(p->v
9690: 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d  , apCsr[i]);.  }
96a0: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
96b0: 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69  ay(aMem, p->nChi
96c0: 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65  ldMem);.  sqlite
96d0: 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62  3DbFree(p->v->db
96e0: 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  , p);.}..#ifndef
96f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
9700: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20  LAIN./*.** Give 
9710: 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  a listing of the
9720: 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20   program in the 
9730: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
9740: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
9750: 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65  face is the same
9760: 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45   as sqlite3VdbeE
9770: 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74  xec().  But inst
9780: 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e  ead of.** runnin
9790: 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69  g the code, it i
97a0: 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62  nvokes the callb
97b0: 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ack once for eac
97c0: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  h instruction..*
97d0: 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69  * This feature i
97e0: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
97f0: 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a  ent "EXPLAIN"..*
9800: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
9810: 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e  lain==1, each in
9820: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73  struction is lis
9830: 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d  ted.  When.** p-
9840: 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c  >explain==2, onl
9850: 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  y OP_Explain ins
9860: 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69  tructions are li
9870: 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a  sted and these.*
9880: 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61  * are shown in a
9890: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61   different forma
98a0: 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  t.  p->explain==
98b0: 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  2 is used to imp
98c0: 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49  lement.** EXPLAI
98d0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a  N QUERY PLAN..**
98e0: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
98f0: 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68  ain==1, first th
9900: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69  e main program i
9910: 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65  s listed, then e
9920: 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  ach of.** the tr
9930: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
9940: 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65  s are listed one
9950: 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20   by one..*/.int 
9960: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28  sqlite3VdbeList(
9970: 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20  .  Vdbe *p      
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9990: 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20  The VDBE */.){. 
99a0: 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20   int nRow;      
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68        /* Stop wh
99d0: 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61  en row count rea
99e0: 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69  ches this */.  i
99f0: 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20  nt nSub = 0;    
9a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9a20: 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20   sub-vdbes seen 
9a30: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50  so far */.  SubP
9a40: 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d  rogram **apSub =
9a50: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
9a60: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62   /* Array of sub
9a70: 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20  -vdbes */.  Mem 
9a80: 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  *pSub = 0;      
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
9ab0: 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75  hold array of su
9ac0: 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69  bprogs */.  sqli
9ad0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9af0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
9b00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
9b10: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
9b40: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
9b50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b70: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
9b80: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
9b90: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20  &p->aMem[1];    
9ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
9bb0: 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20  t Mem of result 
9bc0: 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
9bd0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a  ( p->explain );.
9be0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
9bf0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
9c00: 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  UN );.  assert( 
9c10: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
9c20: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
9c30: 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d  E_BUSY || p->rc=
9c40: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
9c50: 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75  ..  /* Even thou
9c60: 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64  gh this opcode d
9c70: 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61  oes not use dyna
9c80: 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a  mic strings for.
9c90: 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c    ** the result,
9ca0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
9cb0: 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d  may become dynam
9cc0: 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63  ic if the user c
9cd0: 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  alls.  ** sqlite
9ce0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
9cf0: 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61  ), causing a tra
9d00: 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d  nslation to UTF-
9d10: 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a  16 encoding..  *
9d20: 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  /.  releaseMemAr
9d30: 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20  ray(pMem, 8);.  
9d40: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
9d50: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0;..  if( p->rc=
9d60: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
9d70: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
9d80: 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63  pens if a malloc
9d90: 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c  () inside a call
9da0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   to sqlite3_colu
9db0: 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20  mn_text() or.   
9dc0: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
9dd0: 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c  mn_text16() fail
9de0: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e  ed.  */.    db->
9df0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
9e00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
9e10: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
9e20: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
9e30: 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72  mber of output r
9e40: 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77  ows reaches nRow
9e50: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
9e60: 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61  .  ** listing ha
9e70: 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73  s finished and s
9e80: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68  qlite3_step() sh
9e90: 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49  ould return SQLI
9ea0: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52  TE_DONE..  ** nR
9eb0: 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  ow is the sum of
9ec0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
9ed0: 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ows in the main 
9ee0: 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20  program, plus.  
9ef0: 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ** the sum of th
9f00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
9f10: 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20   in all trigger 
9f20: 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f  subprograms enco
9f30: 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20  untered.  ** so 
9f40: 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76  far.  The nRow v
9f50: 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61  alue will increa
9f60: 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65  se as new trigge
9f70: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72  r subprograms ar
9f80: 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72  e.  ** encounter
9f90: 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69  ed, but p->pc wi
9fa0: 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  ll eventually ca
9fb0: 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a  tch up to nRow..
9fc0: 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d    */.  nRow = p-
9fd0: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65  >nOp;.  if( p->e
9fe0: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
9ff0: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20   /* The first 8 
a000: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65  memory cells are
a010: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65   used for the re
a020: 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65  sult set.  So we
a030: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d   will.    ** com
a040: 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20  mandeer the 9th 
a050: 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73  cell to use as s
a060: 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72  torage for an ar
a070: 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a  ray of pointers.
a080: 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65      ** to trigge
a090: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  r subprograms.  
a0a0: 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72  The VDBE is guar
a0b0: 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61  anteed to have a
a0c0: 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a  t least 9.    **
a0d0: 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20   cells.  */.    
a0e0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e  assert( p->nMem>
a0f0: 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20  9 );.    pSub = 
a100: 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20  &p->aMem[9];.   
a110: 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73   if( pSub->flags
a120: 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20  &MEM_Blob ){.   
a130: 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72     /* On the fir
a140: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
a150: 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20  e3_step(), pSub 
a160: 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c  will hold a NULL
a170: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a  .  It is.      *
a180: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  * initialized to
a190: 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50   a BLOB by the P
a1a0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f  4_SUBPROGRAM pro
a1b0: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65  cessing logic be
a1c0: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75  low */.      nSu
a1d0: 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65  b = pSub->n/size
a1e0: 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20  of(Vdbe*);.     
a1f0: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
a200: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
a210: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
a220: 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29  =0; i<nSub; i++)
a230: 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20  {.      nRow += 
a240: 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20  apSub[i]->nOp;. 
a250: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a     }.  }..  do{.
a260: 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b      i = p->pc++;
a270: 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f  .  }while( i<nRo
a280: 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  w && p->explain=
a290: 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e  =2 && p->aOp[i].
a2a0: 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61  opcode!=OP_Expla
a2b0: 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e  in );.  if( i>=n
a2c0: 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  Row ){.    p->rc
a2d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a2e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
a2f0: 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  NE;.  }else if( 
a300: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
a310: 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  pted ){.    p->r
a320: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
a330: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
a340: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
a350: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
a360: 72 28 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53  r(p, sqlite3ErrS
a370: 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65  tr(p->rc));.  }e
a380: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
a390: 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b  P4;.    Op *pOp;
a3a0: 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f  .    if( i<p->nO
a3b0: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
a3c0: 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75  e output line nu
a3d0: 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e  mber is small en
a3e0: 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65  ough that we are
a3f0: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20   still in the.  
a400: 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67      ** main prog
a410: 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f  ram. */.      pO
a420: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
a430: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a440: 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65   /* We are curre
a450: 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62  ntly listing sub
a460: 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72  programs.  Figur
a470: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
a480: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63  and.      ** pic
a490: 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72  k up the appropr
a4a0: 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a  iate opcode. */.
a4b0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
a4c0: 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a     i -= p->nOp;.
a4d0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69        for(j=0; i
a4e0: 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  >=apSub[j]->nOp;
a4f0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
a500: 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   -= apSub[j]->nO
a510: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
a520: 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d   pOp = &apSub[j]
a530: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aOp[i];.    }.
a540: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
a550: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
a560: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a570: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
a580: 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20  ->u.i = i;      
a590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
a5b0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
a5c0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
a5d0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
a5e0: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
a5f0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
a600: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
a610: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
a620: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
a630: 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f  opcode); /* Opco
a640: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
a650: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
a660: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
a670: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
a680: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
a690: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
a6a0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
a6b0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20   pMem++;..      
a6c0: 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72  /* When an OP_Pr
a6d0: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20  ogram opcode is 
a6e0: 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f  encounter (the o
a6f0: 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20  nly opcode that 
a700: 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50  has.      ** a P
a710: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67  4_SUBPROGRAM arg
a720: 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74  ument), expand t
a730: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
a740: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72  rray of subprogr
a750: 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70  ams.      ** kep
a760: 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e  t in p->aMem[9].
a770: 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65  z to hold the ne
a780: 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75  w program - assu
a790: 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f  ming this subpro
a7a0: 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61  gram.      ** ha
a7b0: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
a7c0: 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a  en seen..      *
a7d0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  /.      if( pOp-
a7e0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
a7f0: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
a800: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e    int nByte = (n
a810: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75  Sub+1)*sizeof(Su
a820: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
a830: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
a840: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53     for(j=0; j<nS
a850: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
a860: 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d      if( apSub[j]
a870: 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72  ==pOp->p4.pProgr
a880: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  am ) break;.    
a890: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
a8a0: 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c  ( j==nSub && SQL
a8b0: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56  ITE_OK==sqlite3V
a8c0: 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c  dbeMemGrow(pSub,
a8d0: 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29   nByte, nSub!=0)
a8e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70   ){.          ap
a8f0: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
a900: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
a910: 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53          apSub[nS
a920: 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e  ub++] = pOp->p4.
a930: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
a940: 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20      pSub->flags 
a950: 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20  |= MEM_Blob;.   
a960: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d         pSub->n =
a970: 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62   nSub*sizeof(Sub
a980: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
a990: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a9a0: 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   }..    pMem->fl
a9b0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
a9c0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
a9d0: 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20  Op->p1;         
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d   /* P1 */.    pM
aa00: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
aa10: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
aa20: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
aa30: 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20  = pOp->p2;      
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa50: 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20      /* P2 */.   
aa60: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
aa70: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
aa80: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
aa90: 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20  .i = pOp->p3;   
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aab0: 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a         /* P3 */.
aac0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
aad0: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
aae0: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
aaf0: 65 28 70 4d 65 6d 2c 20 33 32 29 20 29 7b 20 2f  e(pMem, 32) ){ /
ab00: 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73  * P4 */.      as
ab10: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
ab20: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
ab30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ab40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
ab50: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
ab60: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
ab70: 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70  ;.    zP4 = disp
ab80: 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d  layP4(pOp, pMem-
ab90: 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28  >z, 32);.    if(
aba0: 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b   zP4!=pMem->z ){
abb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
abc0: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d  beMemSetStr(pMem
abd0: 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54  , zP4, -1, SQLIT
abe0: 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20  E_UTF8, 0);.    
abf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
ac00: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
ac10: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
ac20: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
ac30: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
ac40: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
ac50: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
ac60: 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  }.    pMem++;.. 
ac70: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
ac80: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66  n==1 ){.      if
ac90: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
aca0: 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70  ClearAndResize(p
acb0: 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20  Mem, 4) ){.     
acc0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
acd0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ace0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
acf0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
ad00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
ad10: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
ad20: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
ad30: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a     pMem->n = 2;.
ad40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
ad50: 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e  printf(3, pMem->
ad60: 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e  z, "%.2x", pOp->
ad70: 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a  p5);   /* P5 */.
ad80: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
ad90: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
ada0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
adb0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
adc0: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
add0: 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20  MENTS.      if( 
ade0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
adf0: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
ae00: 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20  m, 500) ){.     
ae10: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
ae20: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ae30: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
ae40: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
ae50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
ae60: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
ae70: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
ae80: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73     pMem->n = dis
ae90: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c  playComment(pOp,
aea0: 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35   zP4, pMem->z, 5
aeb0: 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  00);.      pMem-
aec0: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
aed0: 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  F8;.#else.      
aee0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
aef0: 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  M_Null;         
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af10: 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64   Comment */.#end
af20: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d  if.    }..    p-
af30: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20  >nResColumn = 8 
af40: 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d  - 4*(p->explain-
af50: 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75  1);.    p->pResu
af60: 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d  ltSet = &p->aMem
af70: 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  [1];.    p->rc =
af80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
af90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
afa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
afb0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
afc0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
afd0: 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
afe0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
aff0: 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68  Print the SQL th
b000: 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67  at was used to g
b010: 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70  enerate a VDBE p
b020: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
b030: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
b040: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
b050: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
b060: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c  0;.  if( p->zSql
b070: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a   ){.    z = p->z
b080: 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Sql;.  }else if(
b090: 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20   p->nOp>=1 ){.  
b0a0: 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a    const VdbeOp *
b0b0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
b0c0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  ;.    if( pOp->o
b0d0: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26  pcode==OP_Init &
b0e0: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
b0f0: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d  {.      z = pOp-
b100: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69  >p4.z;.      whi
b110: 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  le( sqlite3Isspa
b120: 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20  ce(*z) ) z++;.  
b130: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20    }.  }.  if( z 
b140: 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b  ) printf("SQL: [
b150: 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65  %s]\n", z);.}.#e
b160: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
b170: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
b180: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
b190: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
b1a0: 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72  OTRACE)./*.** Pr
b1b0: 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d  int an IOTRACE m
b1c0: 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53  essage showing S
b1d0: 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76  QL content..*/.v
b1e0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49  oid sqlite3VdbeI
b1f0: 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a  OTraceSql(Vdbe *
b200: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
b210: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
b220: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c   *pOp;.  if( sql
b230: 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29  ite3IoTrace==0 )
b240: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e   return;.  if( n
b250: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
b260: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30   pOp = &p->aOp[0
b270: 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ];.  if( pOp->op
b280: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
b290: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
b2a0: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
b2b0: 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b     char z[1000];
b2c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
b2d0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
b2e0: 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70   z, "%s", pOp->p
b2f0: 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  4.z);.    for(i=
b300: 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  0; sqlite3Isspac
b310: 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  e(z[i]); i++){}.
b320: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69      for(j=0; z[i
b330: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
b340: 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  f( sqlite3Isspac
b350: 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  e(z[i]) ){.     
b360: 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27     if( z[i-1]!='
b370: 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   ' ){.          
b380: 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  z[j++] = ' ';.  
b390: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
b3a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a  lse{.        z[j
b3b0: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  ++] = z[i];.    
b3c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
b3d0: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  j] = 0;.    sqli
b3e0: 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20  te3IoTrace("SQL 
b3f0: 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d  %s\n", z);.  }.}
b400: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
b410: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26  TE_OMIT_TRACE &&
b420: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
b430: 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  OTRACE */../*.**
b440: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
b450: 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a  from a fixed siz
b460: 65 20 62 75 66 66 65 72 20 61 6e 64 20 72 65 74  e buffer and ret
b470: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
b480: 0a 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20  .** that space. 
b490: 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74   If insufficient
b4a0: 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
b4b0: 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ble, return NULL
b4c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66  ..**.** The pBuf
b4d0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
b4e0: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
b4f0: 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69  of a pointer whi
b500: 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69  ch will.** recei
b510: 76 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72  ve the new memor
b520: 79 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d  y.  pBuf is norm
b530: 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70  ally NULL.  If p
b540: 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55  Buf is not.** NU
b550: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
b560: 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68  t memory space h
b570: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
b580: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
b590: 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  at.** this routi
b5a0: 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c  ne should not al
b5b0: 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d  locate any new m
b5c0: 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75  emory.  When pBu
b5d0: 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c  f is not.** NULL
b5e0: 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70   simply return p
b5f0: 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63  Buf.  Only alloc
b600: 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73  ate new memory s
b610: 70 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a  pace when pBuf.*
b620: 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  * is NULL..**.**
b630: 20 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75   nByte is the nu
b640: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
b650: 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a   space needed..*
b660: 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69  *.** *ppFrom poi
b670: 6e 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65  nts to available
b680: 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20   space and pEnd 
b690: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e  points to the en
b6a0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69  d of the.** avai
b6b0: 6c 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68  lable space.  Wh
b6c0: 65 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f  en space is allo
b6d0: 63 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69  cated, *ppFrom i
b6e0: 73 20 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a  s advanced past.
b6f0: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
b700: 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  e allocated spac
b710: 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65  e..**.** *pnByte
b720: 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66   is a counter of
b730: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
b740: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 68  ytes of space th
b750: 61 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a  at have failed.*
b760: 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20  * to allocate.  
b770: 49 66 20 74 68 65 72 65 20 69 73 20 69 6e 73 75  If there is insu
b780: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69  fficient space i
b790: 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74  n *ppFrom to sat
b7a0: 69 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75  isfy the.** requ
b7b0: 65 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  est, then increm
b7c0: 65 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74  ent *pnByte by t
b7d0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
b7e0: 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61   request..*/.sta
b7f0: 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53  tic void *allocS
b800: 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42  pace(.  void *pB
b810: 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  uf,          /* 
b820: 57 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69  Where return poi
b830: 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f  nter will be sto
b840: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  red */.  int nBy
b850: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te,           /*
b860: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
b870: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
b880: 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20    u8 **ppFrom,  
b890: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
b8a0: 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20  : Allocate from 
b8b0: 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20  *ppFrom */.  u8 
b8c0: 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20  *pEnd,          
b8d0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
b8e0: 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  1 byte past the 
b8f0: 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62  end of *ppFrom b
b900: 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  uffer */.  int *
b910: 70 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20  pnByte          
b920: 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e  /* If allocation
b930: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c   cannot be made,
b940: 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79   increment *pnBy
b950: 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  te */.){.  asser
b960: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
b970: 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29  IGNMENT(*ppFrom)
b980: 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29   );.  if( pBuf )
b990: 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20   return pBuf;.  
b9a0: 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e  nByte = ROUND8(n
b9b0: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a  Byte);.  if( &(*
b9c0: 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c  ppFrom)[nByte] <
b9d0: 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42  = pEnd ){.    pB
b9e0: 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46  uf = (void*)*ppF
b9f0: 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d  rom;.    *ppFrom
ba00: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c   += nByte;.  }el
ba10: 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20  se{.    *pnByte 
ba20: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20  += nByte;.  }.  
ba30: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
ba40: 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65  /*.** Rewind the
ba50: 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68   VDBE back to th
ba60: 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70  e beginning in p
ba70: 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a  reparation for.*
ba80: 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f  * running it..*/
ba90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
baa0: 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29  eRewind(Vdbe *p)
bab0: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
bac0: 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
bad0: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
bae0: 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65  ILE).  int i;.#e
baf0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
bb00: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
bb10: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
bb20: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20  MAGIC_INIT );.. 
bb30: 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64   /* There should
bb40: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
bb50: 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20   opcode..  */.  
bb60: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
bb70: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
bb80: 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f  e magic to VDBE_
bb90: 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72  MAGIC_RUN sooner
bba0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74   rather than lat
bbb0: 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69  er. */.  p->magi
bbc0: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
bbd0: 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  UN;..#ifdef SQLI
bbe0: 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69  TE_DEBUG.  for(i
bbf0: 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69  =1; i<p->nMem; i
bc00: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
bc10: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d   p->aMem[i].db==
bc20: 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e  p->db );.  }.#en
bc30: 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31  dif.  p->pc = -1
bc40: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
bc50: 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f  TE_OK;.  p->erro
bc60: 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
bc70: 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  rt;.  p->magic =
bc80: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
bc90: 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  p->nChange = 
bca0: 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72  0;.  p->cacheCtr
bcb0: 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72   = 1;.  p->minWr
bcc0: 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20  iteFileFormat = 
bcd0: 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65  255;.  p->iState
bce0: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  ment = 0;.  p->n
bcf0: 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30  FkConstraint = 0
bd00: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  ;.#ifdef VDBE_PR
bd10: 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b  OFILE.  for(i=0;
bd20: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
bd30: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
bd40: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  nt = 0;.    p->a
bd50: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30  Op[i].cycles = 0
bd60: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
bd70: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20  /*.** Prepare a 
bd80: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
bd90: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f  for execution fo
bda0: 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  r the first time
bdb0: 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69   after.** creati
bdc0: 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  ng the virtual m
bdd0: 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e  achine.  This in
bde0: 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75  volves things su
bdf0: 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74  ch.** as allocat
be00: 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 61 6e  ing registers an
be10: 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  d initializing t
be20: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
be30: 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  er..** After the
be40: 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65   VDBE has be pre
be50: 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  pped, it can be 
be60: 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20  executed by one 
be70: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73  or more.** calls
be80: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
be90: 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  xec().  .**.** T
bea0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
beb0: 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74   be called exact
bec0: 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20  ly once on each 
bed0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
bee0: 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
bef0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
bf00: 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
bf10: 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20   "packaged" and 
bf20: 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72  is ready.** to r
bf30: 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  un.  After this 
bf40: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
bf50: 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73  d, further calls
bf60: 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56   to .** sqlite3V
bf70: 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74  dbeAddOp() funct
bf80: 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69  ions are prohibi
bf90: 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ted.  This routi
bfa0: 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a  ne disconnects.*
bfb0: 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  * the Vdbe from 
bfc0: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
bfd0: 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e   that helped gen
bfe0: 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74  erate it so that
bff0: 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65   the.** the Vdbe
c000: 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65   becomes an inde
c010: 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61  pendent entity a
c020: 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  nd the Parse obj
c030: 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65  ect can be.** de
c040: 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55  stroyed..**.** U
c050: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
c060: 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65  beRewind() proce
c070: 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20  dure to restore 
c080: 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  a virtual machin
c090: 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73  e back.** to its
c0a0: 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61   initial state a
c0b0: 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  fter it has been
c0c0: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   run..*/.void sq
c0d0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
c0e0: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c100: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
c110: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
c120: 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  rse             
c130: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
c140: 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
c150: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c170: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
c180: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
c190: 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20  nt nVar;        
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c1b0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d   Number of param
c1c0: 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  eters */.  int n
c1d0: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
c1e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c1f0: 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79  ber of VM memory
c200: 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
c210: 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20  int nCursor;    
c220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c230: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
c240: 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ors required */.
c250: 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20    int nArg;     
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
c280: 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72  guments in subpr
c290: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
c2a0: 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20  nOnce;          
c2b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c2c0: 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20  mber of OP_Once 
c2d0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  instructions */.
c2e0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c300: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
c310: 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20   */.  u8 *zCsr; 
c320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c330: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
c340: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
c350: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  ocation */.  u8 
c360: 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *zEnd;          
c370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
c380: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 61  irst byte past a
c390: 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20  llocated memory 
c3a0: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3c0: 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20      /* How much 
c3d0: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20  extra memory is 
c3e0: 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73  needed */..  ass
c3f0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
c400: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
c410: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c420: 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
c430: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
c440: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
c450: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
c460: 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a  e==p->pParse );.
c470: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
c480: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
c490: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
c4a0: 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e   nVar = pParse->
c4b0: 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70  nVar;.  nMem = p
c4c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e  Parse->nMem;.  n
c4d0: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
c4e0: 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20  >nTab;.  nArg = 
c4f0: 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b  pParse->nMaxArg;
c500: 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73  .  nOnce = pPars
c510: 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20  e->nOnce;.  if( 
c520: 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65  nOnce==0 ) nOnce
c530: 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20   = 1; /* Ensure 
c540: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74  at least one byt
c550: 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  e in p->aOnceFla
c560: 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46  g[] */.  .  /* F
c570: 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72  or each cursor r
c580: 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c  equired, also al
c590: 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20  locate a memory 
c5a0: 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a  cell. Memory.  *
c5b0: 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d  * cells (nMem+1-
c5c0: 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20  nCursor)..nMem, 
c5d0: 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20  inclusive, will 
c5e0: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79  never be used by
c5f0: 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70  .  ** the vdbe p
c600: 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20  rogram. Instead 
c610: 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f  they are used to
c620: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
c630: 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72  for.  ** VdbeCur
c640: 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72  sor/BtCursor str
c650: 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f  uctures. The blo
c660: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
c670: 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a  ciated with .  *
c680: 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74  * cursor 0 is st
c690: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ored in memory c
c6a0: 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79  ell nMem. Memory
c6b0: 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20   cell (nMem-1). 
c6c0: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62   ** stores the b
c6d0: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
c6e0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
c6f0: 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a  rsor 1, etc..  *
c700: 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  *.  ** See also:
c710: 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
c720: 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
c730: 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  = nCursor;..  /*
c740: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
c750: 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  for memory regis
c760: 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62  ters, SQL variab
c770: 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72  les, VDBE cursor
c780: 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61  s and .  ** an a
c790: 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20  rray to marshal 
c7a0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67  SQL function arg
c7b0: 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a  uments in..  */.
c7c0: 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70    zCsr = (u8*)&p
c7d0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20  ->aOp[p->nOp];  
c7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
c7f0: 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f  ory avaliable fo
c800: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
c810: 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26 70    zEnd = (u8*)&p
c820: 2d 3e 61 4f 70 5b 70 50 61 72 73 65 2d 3e 6e 4f  ->aOp[pParse->nO
c830: 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72  pAlloc];  /* Fir
c840: 73 74 20 62 79 74 65 20 70 61 73 74 20 65 6e 64  st byte past end
c850: 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20   of zCsr[] */.. 
c860: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
c870: 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d  (p, &nArg);.  p-
c880: 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
c890: 20 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e   = (u8)(pParse->
c8a0: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20  isMultiWrite && 
c8b0: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
c8c0: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
c8d0: 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  >explain && nMem
c8e0: 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20  <10 ){.    nMem 
c8f0: 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  = 10;.  }.  mems
c900: 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64  et(zCsr, 0, zEnd
c910: 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b  -zCsr);.  zCsr +
c920: 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30  = (zCsr - (u8*)0
c930: 29 26 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45  )&7;.  assert( E
c940: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
c950: 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70  ENT(zCsr) );.  p
c960: 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a  ->expired = 0;..
c970: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20    /* Memory for 
c980: 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d  registers, param
c990: 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65  eters, cursor, e
c9a0: 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  tc, is allocated
c9b0: 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73   in two.  ** pas
c9c0: 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72  ses.  On the fir
c9d0: 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20  st pass, we try 
c9e0: 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20  to reuse unused 
c9f0: 73 70 61 63 65 20 61 74 20 74 68 65 20 0a 20 20  space at the .  
ca00: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  ** end of the op
ca10: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20  code array.  If 
ca20: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
ca30: 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d   satisfy all mem
ca40: 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ory.  ** require
ca50: 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
ca60: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
ca70: 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
ca80: 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73   second.  ** pas
ca90: 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74  s will fill in t
caa0: 68 65 20 72 65 73 74 20 75 73 69 6e 67 20 61 20  he rest using a 
cab0: 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e  fresh allocation
cac0: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
cad0: 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72  is two-pass appr
cae0: 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65 73  oach that reuses
caf0: 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
cb00: 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d  as possible from
cb10: 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76  .  ** the leftov
cb20: 65 72 20 73 70 61 63 65 20 61 74 20 74 68 65 20  er space at the 
cb30: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
cb40: 65 20 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e  e array can sign
cb50: 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72  ificantly.  ** r
cb60: 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74  educe the amount
cb70: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20   of memory held 
cb80: 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74  by a prepared st
cb90: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
cba0: 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  do {.    nByte =
cbb0: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20   0;.    p->aMem 
cbc0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
cbd0: 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f  aMem, nMem*sizeo
cbe0: 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a  f(Mem), &zCsr, z
cbf0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
cc00: 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f    p->aVar = allo
cc10: 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20  cSpace(p->aVar, 
cc20: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
cc30: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
cc40: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
cc50: 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pArg = allocSpac
cc60: 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67  e(p->apArg, nArg
cc70: 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26  *sizeof(Mem*), &
cc80: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
cc90: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61  te);.    p->azVa
cca0: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
ccb0: 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69  ->azVar, nVar*si
ccc0: 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43  zeof(char*), &zC
ccd0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
cce0: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20  );.    p->apCsr 
ccf0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
cd00: 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73  apCsr, nCursor*s
cd10: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
cd20: 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  *),.            
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a                &z
cd40: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
cd50: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65  e);.    p->aOnce
cd60: 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  Flag = allocSpac
cd70: 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  e(p->aOnceFlag, 
cd80: 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45  nOnce, &zCsr, zE
cd90: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 23 69 66  nd, &nByte);.#if
cda0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
cdb0: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
cdc0: 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20  S.    p->anExec 
cdd0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
cde0: 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73  anExec, p->nOp*s
cdf0: 69 7a 65 6f 66 28 69 36 34 29 2c 20 26 7a 43 73  izeof(i64), &zCs
ce00: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
ce10: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
ce20: 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
ce30: 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74  p->pFree = sqlit
ce40: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
ce50: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  b, nByte);.    }
ce60: 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70  .    zCsr = p->p
ce70: 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  Free;.    zEnd =
ce80: 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20   &zCsr[nByte];. 
ce90: 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26   }while( nByte &
cea0: 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
ceb0: 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75  led );..  p->nCu
cec0: 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a  rsor = nCursor;.
ced0: 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d    p->nOnceFlag =
cee0: 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d   nOnce;.  if( p-
cef0: 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >aVar ){.    p->
cf00: 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56  nVar = (ynVar)nV
cf10: 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b  ar;.    for(n=0;
cf20: 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20   n<nVar; n++){. 
cf30: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
cf40: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
cf50: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b  ;.      p->aVar[
cf60: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
cf70: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  }.  }.  if( p->a
cf80: 7a 56 61 72 20 26 26 20 70 50 61 72 73 65 2d 3e  zVar && pParse->
cf90: 6e 7a 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 70  nzVar>0 ){.    p
cfa0: 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65  ->nzVar = pParse
cfb0: 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d  ->nzVar;.    mem
cfc0: 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50  cpy(p->azVar, pP
cfd0: 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e  arse->azVar, p->
cfe0: 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e  nzVar*sizeof(p->
cff0: 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20  azVar[0]));.    
d000: 6d 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61  memset(pParse->a
d010: 7a 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d  zVar, 0, pParse-
d020: 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50  >nzVar*sizeof(pP
d030: 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29  arse->azVar[0]))
d040: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
d050: 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d  Mem ){.    p->aM
d060: 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20  em--;           
d070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d             /* aM
d080: 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31  em[] goes from 1
d090: 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d  ..nMem */.    p-
d0a0: 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20  >nMem = nMem;   
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d0c0: 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20         not from 
d0d0: 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20  0..nMem-1 */.   
d0e0: 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65   for(n=1; n<=nMe
d0f0: 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70  m; n++){.      p
d100: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20  ->aMem[n].flags 
d110: 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b  = MEM_Undefined;
d120: 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e  .      p->aMem[n
d130: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d  ].db = db;.    }
d140: 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69  .  }.  p->explai
d150: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  n = pParse->expl
d160: 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ain;.  sqlite3Vd
d170: 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a  beRewind(p);.}..
d180: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44  /*.** Close a VD
d190: 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65  BE cursor and re
d1a0: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65  lease all the re
d1b0: 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72  sources that cur
d1c0: 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20  sor .** happens 
d1d0: 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  to hold..*/.void
d1e0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
d1f0: 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20  Cursor(Vdbe *p, 
d200: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29  VdbeCursor *pCx)
d210: 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29  {.  if( pCx==0 )
d220: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
d230: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  }.  sqlite3VdbeS
d240: 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62  orterClose(p->db
d250: 2c 20 70 43 78 29 3b 0a 20 20 69 66 28 20 70 43  , pCx);.  if( pC
d260: 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71  x->pBt ){.    sq
d270: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
d280: 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f  pCx->pBt);.    /
d290: 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73  * The pCx->pCurs
d2a0: 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65  or will be close
d2b0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20   automatically, 
d2c0: 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79  if it exists, by
d2d0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c  .    ** the call
d2e0: 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c   above. */.  }el
d2f0: 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72  se if( pCx->pCur
d300: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
d310: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
d320: 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29  or(pCx->pCursor)
d330: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
d340: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
d350: 4c 54 41 42 4c 45 0a 20 20 65 6c 73 65 20 69 66  LTABLE.  else if
d360: 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  ( pCx->pVtabCurs
d370: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
d380: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
d390: 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78  VtabCursor = pCx
d3a0: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  ->pVtabCursor;. 
d3b0: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
d3c0: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
d3d0: 20 3d 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e   = pVtabCursor->
d3e0: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
d3f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 56 74 61      assert( pVta
d400: 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e  bCursor->pVtab->
d410: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 56  nRef>0 );.    pV
d420: 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
d430: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 70 4d  ->nRef--;.    pM
d440: 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56  odule->xClose(pV
d450: 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  tabCursor);.  }.
d460: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
d470: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
d480: 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
d490: 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   frame..*/.stati
d4a0: 63 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73  c void closeCurs
d4b0: 6f 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20  orsInFrame(Vdbe 
d4c0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70  *p){.  if( p->ap
d4d0: 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Csr ){.    int i
d4e0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
d4f0: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
d500: 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72  ){.      VdbeCur
d510: 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43  sor *pC = p->apC
d520: 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  sr[i];.      if(
d530: 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73   pC ){.        s
d540: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
d550: 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20  rsor(p, pC);.   
d560: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d       p->apCsr[i]
d570: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
d580: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
d590: 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73   Copy the values
d5a0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
d5b0: 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75  dbeFrame structu
d5c0: 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20  re to its Vdbe. 
d5d0: 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c  This.** is used,
d5e0: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
d5f0: 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62  en a trigger sub
d600: 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74  -program is halt
d610: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a  ed to restore.**
d620: 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20   control to the 
d630: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  main program..*/
d640: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
d650: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62  FrameRestore(Vdb
d660: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
d670: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72  .  Vdbe *v = pFr
d680: 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43  ame->v;.  closeC
d690: 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29  ursorsInFrame(v)
d6a0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
d6b0: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
d6c0: 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78  STATUS.  v->anEx
d6d0: 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45  ec = pFrame->anE
d6e0: 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d  xec;.#endif.  v-
d6f0: 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72  >aOnceFlag = pFr
d700: 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a  ame->aOnceFlag;.
d710: 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d    v->nOnceFlag =
d720: 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c   pFrame->nOnceFl
d730: 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70  ag;.  v->aOp = p
d740: 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d  Frame->aOp;.  v-
d750: 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  >nOp = pFrame->n
d760: 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20  Op;.  v->aMem = 
d770: 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20  pFrame->aMem;.  
d780: 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->nMem = pFrame
d790: 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43  ->nMem;.  v->apC
d7a0: 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43  sr = pFrame->apC
d7b0: 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72  sr;.  v->nCursor
d7c0: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73   = pFrame->nCurs
d7d0: 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73  or;.  v->db->las
d7e0: 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d  tRowid = pFrame-
d7f0: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d  >lastRowid;.  v-
d800: 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d  >nChange = pFram
d810: 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d  e->nChange;.  v-
d820: 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70  >db->nChange = p
d830: 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65  Frame->nDbChange
d840: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
d850: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
d860: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
d870: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
d880: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
d890: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
d8a0: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
d8b0: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
d8c0: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
d8d0: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
d8e0: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
d8f0: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
d900: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
d910: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
d920: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
d930: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
d940: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
d950: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
d960: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
d970: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
d980: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
d990: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
d9a0: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
d9b0: 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  e;.    for(pFram
d9c0: 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
d9d0: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46  ame->pParent; pF
d9e0: 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
d9f0: 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rent);.    sqlit
da00: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
da10: 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20  re(pFrame);.    
da20: 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20  p->pFrame = 0;. 
da30: 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30     p->nFrame = 0
da40: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
da50: 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a  p->nFrame==0 );.
da60: 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e    closeCursorsIn
da70: 46 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20  Frame(p);.  if( 
da80: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72  p->aMem ){.    r
da90: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26  eleaseMemArray(&
daa0: 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e  p->aMem[1], p->n
dab0: 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  Mem);.  }.  whil
dac0: 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20  e( p->pDelFrame 
dad0: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
dae0: 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c   *pDel = p->pDel
daf0: 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44  Frame;.    p->pD
db00: 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e  elFrame = pDel->
db10: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c  pParent;.    sql
db20: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
db30: 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a  ete(pDel);.  }..
db40: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
db50: 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69  auxdata allocati
db60: 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  ons made by the 
db70: 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  VM */.  if( p->p
db80: 41 75 78 44 61 74 61 20 29 20 73 71 6c 69 74 65  AuxData ) sqlite
db90: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
dba0: 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  ta(p, -1, 0);.  
dbb0: 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44  assert( p->pAuxD
dbc0: 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ata==0 );.}../*.
dbd0: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20  ** Clean up the 
dbe0: 56 4d 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c  VM after a singl
dbf0: 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  e run..*/.static
dc00: 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64   void Cleanup(Vd
dc10: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
dc20: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
dc30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
dc40: 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65  BUG.  /* Execute
dc50: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
dc60: 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
dc70: 68 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43  hat the Vdbe.apC
dc80: 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56  sr[] and .  ** V
dc90: 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79  dbe.aMem[] array
dca0: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
dcb0: 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20  een cleaned up. 
dcc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   */.  int i;.  i
dcd0: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f  f( p->apCsr ) fo
dce0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
dcf0: 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  sor; i++) assert
dd00: 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30  ( p->apCsr[i]==0
dd10: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65   );.  if( p->aMe
dd20: 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  m ){.    for(i=1
dd30: 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  ; i<=p->nMem; i+
dd40: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d  +) assert( p->aM
dd50: 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d  em[i].flags==MEM
dd60: 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20  _Undefined );.  
dd70: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  }.#endif..  sqli
dd80: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
dd90: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
dda0: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70  zErrMsg = 0;.  p
ddb0: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
ddc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
ddd0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
dde0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  ult columns that
ddf0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
de00: 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a  d by this SQL.**
de10: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
de20: 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63   is now set at c
de30: 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74  ompile time, rat
de40: 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a  her than during.
de50: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
de60: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
de70: 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33   so that sqlite3
de80: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20  _column_count() 
de90: 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64  can.** be called
dea0: 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65   on an SQL state
deb0: 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69  ment before sqli
dec0: 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76  te3_step()..*/.v
ded0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
dee0: 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a  etNumCols(Vdbe *
def0: 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d  p, int nResColum
df00: 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  n){.  Mem *pColN
df10: 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ame;.  int n;.  
df20: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
df30: 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d  >db;..  releaseM
df40: 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
df50: 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
df60: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
df70: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
df80: 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
df90: 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d  .  n = nResColum
dfa0: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70  n*COLNAME_N;.  p
dfb0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28  ->nResColumn = (
dfc0: 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a  u16)nResColumn;.
dfd0: 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20    p->aColName = 
dfe0: 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a  pColName = (Mem*
dff0: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
e000: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
e010: 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20  Mem)*n );.  if( 
e020: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29  p->aColName==0 )
e030: 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65   return;.  while
e040: 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
e050: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73   pColName->flags
e060: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
e070: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20   pColName->db = 
e080: 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e  p->db;.    pColN
e090: 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ame++;.  }.}../*
e0a0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  .** Set the name
e0b0: 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63   of the idx'th c
e0c0: 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75  olumn to be retu
e0d0: 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20  rned by the SQL 
e0e0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e  statement..** zN
e0f0: 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ame must be a po
e100: 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74  inter to a nul t
e110: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
e120: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
e130: 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61  l must be made a
e140: 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
e150: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
e160: 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cols()..**.** Th
e170: 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
e180: 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65  r, xDel, must be
e190: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44   one of SQLITE_D
e1a0: 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53  YNAMIC, SQLITE_S
e1b0: 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49  TATIC.** or SQLI
e1c0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66  TE_TRANSIENT. If
e1d0: 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59   it is SQLITE_DY
e1e0: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20  NAMIC, then the 
e1f0: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a  buffer pointed.*
e200: 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69  * to by zName wi
e210: 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73  ll be freed by s
e220: 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77  qlite3DbFree() w
e230: 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20  hen the vdbe is 
e240: 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e  destroyed..*/.in
e250: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  t sqlite3VdbeSet
e260: 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20  ColName(.  Vdbe 
e270: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
e280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
e290: 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67  dbe being config
e2a0: 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ured */.  int id
e2b0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
e2c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
e2d0: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e  dex of column zN
e2e0: 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a  ame applies to *
e2f0: 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20  /.  int var,    
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
e320: 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e  he COLNAME_* con
e330: 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  stants */.  cons
e340: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e360: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
e370: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d  r containing nam
e380: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  e */.  void (*xD
e390: 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20  el)(void*)      
e3a0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
e3b0: 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72  y management str
e3c0: 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20  ategy for zName 
e3d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
e3e0: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
e3f0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70  .  assert( idx<p
e400: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a  ->nResColumn );.
e410: 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f    assert( var<CO
e420: 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28  LNAME_N );.  if(
e430: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
e440: 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  iled ){.    asse
e450: 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44  rt( !zName || xD
e460: 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d  el!=SQLITE_DYNAM
e470: 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  IC );.    return
e480: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e490: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
e4a0: 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  aColName!=0 );. 
e4b0: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d   pColName = &(p-
e4c0: 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61  >aColName[idx+va
e4d0: 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d  r*p->nResColumn]
e4e0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
e4f0: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
e500: 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ColName, zName, 
e510: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
e520: 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74   xDel);.  assert
e530: 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d  ( rc!=0 || !zNam
e540: 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e  e || (pColName->
e550: 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21  flags&MEM_Term)!
e560: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
e570: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65  c;.}../*.** A re
e580: 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
e590: 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d  saction may or m
e5a0: 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65  ay not be active
e5b0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
e5c0: 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20  dle.** db. If a 
e5d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
e5e0: 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74  ctive, commit it
e5f0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a  . If there is a.
e600: 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
e610: 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f  tion spanning mo
e620: 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
e630: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
e640: 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73  routine.** takes
e650: 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73   care of the mas
e660: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63  ter journal tric
e670: 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  kery..*/.static 
e680: 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73  int vdbeCommit(s
e690: 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
e6a0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
e6b0: 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b   int nTrans = 0;
e6c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64    /* Number of d
e6d0: 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e  atabases with an
e6e0: 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72   active write-tr
e6f0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  ansaction */.  i
e700: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e710: 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f  K;.  int needXco
e720: 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65  mmit = 0;..#ifde
e730: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
e740: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
e750: 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e  With this option
e760: 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  , sqlite3VtabSyn
e770: 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74  c() is defined t
e780: 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a  o be simply .  *
e790: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70  * SQLITE_OK so p
e7a0: 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20   is not used. . 
e7b0: 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
e7c0: 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69  AMETER(p);.#endi
e7d0: 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  f..  /* Before d
e7e0: 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
e7f0: 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79  se, call the xSy
e800: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f  nc() callback fo
e810: 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75  r any.  ** virtu
e820: 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73  al module tables
e830: 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73   written in this
e840: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
e850: 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62  is has to.  ** b
e860: 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65  e done before de
e870: 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65  termining whethe
e880: 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  r a master journ
e890: 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  al file is .  **
e8a0: 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e   required, as an
e8b0: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
e8c0: 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74  k may add an att
e8d0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20  ached database. 
e8e0: 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73   ** to the trans
e8f0: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
e900: 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
e910: 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f  ync(db, p);..  /
e920: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65  * This loop dete
e930: 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68  rmines (a) if th
e940: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68  e commit hook sh
e950: 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
e960: 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77  and.  ** (b) how
e970: 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66   many database f
e980: 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77  iles have open w
e990: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
e9a0: 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63  s, not .  ** inc
e9b0: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20  luding the temp 
e9c0: 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73  database. (b) is
e9d0: 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75   important becau
e9e0: 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20  se if more than 
e9f0: 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61  .  ** one databa
ea00: 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f  se file has an o
ea10: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
ea20: 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20  ction, a master 
ea30: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
ea40: 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
ea50: 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d  r an atomic comm
ea60: 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  it..  */ .  for(
ea70: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
ea80: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
ea90: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65   i++){ .    Btre
eaa0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
eab0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
eac0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
ead0: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
eae0: 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
eaf0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
eb00: 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b  i!=1 ) nTrans++;
eb10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
eb20: 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20  reeEnter(pBt);. 
eb30: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
eb40: 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
eb50: 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65  ock(sqlite3Btree
eb60: 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20  Pager(pBt));.   
eb70: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
eb80: 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d  eave(pBt);.    }
eb90: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
eba0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ebb0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
ebc0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
ebd0: 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e  e any write-tran
ebe0: 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c  sactions at all,
ebf0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d   invoke the comm
ec00: 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28  it hook */.  if(
ec10: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20   needXcommit && 
ec20: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
ec30: 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ack ){.    rc = 
ec40: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
ec50: 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ack(db->pCommitA
ec60: 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rg);.    if( rc 
ec70: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
ec80: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
ec90: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20  T_COMMITHOOK;.  
eca0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
ecb0: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
ecc0: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
ecd0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
ece0: 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
ecf0: 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
ed00: 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
ed10: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
ed20: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
ed30: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
ed40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
ed50: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
ed60: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
ed70: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
ed80: 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
ed90: 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
eda0: 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
edb0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
edc0: 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f  se is :memory: o
edd0: 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  r a temp file.  
ede0: 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61  In .  ** that ca
edf0: 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  se we do not sup
ee00: 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
ee10: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
ee20: 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  so use the .  **
ee30: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
ee40: 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  n too..  */.  if
ee50: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  ( 0==sqlite3Strl
ee60: 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65  en30(sqlite3Btre
ee70: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
ee80: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20  >aDb[0].pBt)).  
ee90: 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20   || nTrans<=1.  
eea0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
eeb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
eec0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
eed0: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
eee0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
eef0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
ef00: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
ef10: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
ef20: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
ef30: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
ef40: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
ef50: 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
ef60: 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
ef70: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
ef80: 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20  mplete phase 1. 
ef90: 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f  .    ** If one o
efa0: 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69  f the BtreeCommi
efb0: 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
efc0: 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e  s fails, this in
efd0: 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a  dicates an.    *
efe0: 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65  * IO error while
eff0: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
f000: 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  ncating a journa
f010: 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e  l file. It is un
f020: 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62  likely,.    ** b
f030: 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e  ut could happen.
f040: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62   In this case ab
f050: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
f060: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
f070: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
f080: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
f090: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
f0a0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
f0b0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
f0c0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
f0d0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
f0e0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
f0f0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
f100: 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29  PhaseTwo(pBt, 0)
f110: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f120: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f130: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
f140: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
f150: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
f160: 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
f170: 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
f180: 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
f190: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
f1a0: 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
f1b0: 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
f1c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f1d0: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
f1e0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
f1f0: 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
f200: 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23  omically..  */.#
f210: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f220: 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65  IT_DISKIO.  else
f230: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
f240: 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56  s *pVfs = db->pV
f250: 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64  fs;.    int need
f260: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68  Sync = 0;.    ch
f270: 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
f280: 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20     /* File-name 
f290: 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a  for the master j
f2a0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68  ournal */.    ch
f2b0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46  ar const *zMainF
f2c0: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
f2d0: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
f2e0: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
f2f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
f300: 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  *pMaster = 0;.  
f310: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
f320: 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  ;.    int res;. 
f330: 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e     int retryCoun
f340: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  t = 0;.    int n
f350: 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f  MainFile;..    /
f360: 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65  * Select a maste
f370: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
f380: 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e  ame */.    nMain
f390: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74  File = sqlite3St
f3a0: 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65  rlen30(zMainFile
f3b0: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
f3c0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
f3d0: 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58  db, "%s-mjXXXXXX
f3e0: 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65  9XXz", zMainFile
f3f0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74  );.    if( zMast
f400: 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  er==0 ) return S
f410: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
f420: 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20   do {.      u32 
f430: 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69  iRandom;.      i
f440: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b  f( retryCount ){
f450: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74  .        if( ret
f460: 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20  ryCount>100 ){. 
f470: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f480: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c  _log(SQLITE_FULL
f490: 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73  , "MJ delete: %s
f4a0: 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ", zMaster);.   
f4b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
f4c0: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
f4d0: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
f4e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f4f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74     }else if( ret
f500: 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20  ryCount==1 ){.  
f510: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f520: 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  log(SQLITE_FULL,
f530: 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73   "MJ collide: %s
f540: 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ", zMaster);.   
f550: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f560: 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b       retryCount+
f570: 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
f580: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
f590: 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52  of(iRandom), &iR
f5a0: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71  andom);.      sq
f5b0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
f5c0: 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69  3, &zMaster[nMai
f5d0: 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58  nFile], "-mj%06X
f5e0: 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20  9%02X",.        
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f600: 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e         (iRandom>
f610: 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20 69 52  >8)&0xffffff, iR
f620: 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20  andom&0xff);.   
f630: 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65     /* The antipe
f640: 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63  nultimate charac
f650: 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65  ter of the maste
f660: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
f670: 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  ust.      ** be 
f680: 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d  "9" to avoid nam
f690: 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65  e collisions whe
f6a0: 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65  n using 8+3 file
f6b0: 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  names. */.      
f6c0: 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b  assert( zMaster[
f6d0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
f6e0: 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27  zMaster)-3]=='9'
f6f0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
f700: 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61  3FileSuffix3(zMa
f710: 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29  inFile, zMaster)
f720: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
f730: 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
f740: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
f750: 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
f760: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68  , &res);.    }wh
f770: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
f780: 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20  OK && res );.   
f790: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f7a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  OK ){.      /* O
f7b0: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
f7c0: 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20  ournal. */.     
f7d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
f7e0: 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20  penMalloc(pVfs, 
f7f0: 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65  zMaster, &pMaste
f800: 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51  r, .          SQ
f810: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
f820: 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
f830: 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
f840: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
f850: 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f  CLUSIVE|SQLITE_O
f860: 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
f870: 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  AL, 0.      );. 
f880: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
f890: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f8a0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f8b0: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
f8c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f8d0: 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
f8e0: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
f8f0: 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  f each database 
f900: 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e  file in the tran
f910: 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  saction into the
f920: 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74   new.    ** mast
f930: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
f940: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
f950: 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
f960: 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61  t close.    ** a
f970: 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  nd delete the ma
f980: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f990: 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76  e. All the indiv
f9a0: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
f9b0: 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c  les.    ** still
f9c0: 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20   have 'null' as 
f9d0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f9e0: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74  al pointer, so t
f9f0: 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20  hey will roll.  
fa00: 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65    ** back indepe
fa10: 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69  ndently if a fai
fa20: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20  lure occurs..   
fa30: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
fa40: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
fa50: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
fa60: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
fa70: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  pBt;.      if( s
fa80: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
fa90: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
faa0: 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
fab0: 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  *zFile = sqlite3
fac0: 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
fad0: 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ame(pBt);.      
fae0: 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29    if( zFile==0 )
faf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
fb00: 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
fb10: 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72   TEMP and :memor
fb20: 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  y: databases */.
fb30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fb40: 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b    assert( zFile[
fb50: 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  0]!=0 );.       
fb60: 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26   if( !needSync &
fb70: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  & !sqlite3BtreeS
fb80: 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29  yncDisabled(pBt)
fb90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
fba0: 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
fbb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
fbc0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
fbd0: 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
fbe0: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
fbf0: 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73  0(zFile)+1, offs
fc00: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  et);.        off
fc10: 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  set += sqlite3St
fc20: 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b  rlen30(zFile)+1;
fc30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
fc40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
fc50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
fc60: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
fc70: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
fc80: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
fc90: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
fca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
fcb0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
fcc0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
fcd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
fce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
fcf0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
fd00: 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  c the master jou
fd10: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
fd20: 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  e IOCAP_SEQUENTI
fd30: 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a  AL device.    **
fd40: 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69   flag is set thi
fd50: 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
fd60: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
fd70: 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  ( needSync .    
fd80: 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f   && 0==(sqlite3O
fd90: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
fda0: 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26  istics(pMaster)&
fdb0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
fdc0: 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26  UENTIAL).     &&
fdd0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
fde0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
fdf0: 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  pMaster, SQLITE_
fe00: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20  SYNC_NORMAL)).  
fe10: 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
fe20: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
fe30: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
fe40: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
fe50: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
fe60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
fe70: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
fe80: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
fe90: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
fea0: 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64  * Sync all the d
feb0: 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64  b files involved
fec0: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
fed0: 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61  ion. The same ca
fee0: 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74  ll.    ** sets t
fef0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ff00: 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63  l pointer in eac
ff10: 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  h individual jou
ff20: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20  rnal. If.    ** 
ff30: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
ff40: 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c  here, do not del
ff50: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
ff60: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
ff70: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
ff80: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  e error occurs d
ff90: 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  uring the first 
ffa0: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
ffb0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
ffc0: 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65  tPhaseOne(), the
ffd0: 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61  n there is a cha
ffe0: 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  nce that the.   
fff0: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
10000 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
10010 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65  orphaned. But we
10020 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69   cannot delete i
10030 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73  t,.    ** in cas
10040 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
10050 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77  rnal file name w
10060 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
10070 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
10080 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
10090 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  he failure occur
100a0 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
100b0 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
100c0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
100d0 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
100e0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
100f0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
10100 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
10110 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
10120 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
10130 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61  haseOne(pBt, zMa
10140 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ster);.      }. 
10150 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
10160 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
10170 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
10180 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
10190 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Y );.    if( rc!
101a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
101b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
101c0 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
101d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
101e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
101f0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
10200 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
10210 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20  his commits the 
10220 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74  transaction. Aft
10230 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  er.    ** doing 
10240 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f  this the directo
10250 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61  ry is synced aga
10260 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  in before any in
10270 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20  dividual.    ** 
10280 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65  transaction file
10290 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20  s are deleted.. 
102a0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
102b0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
102c0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 65  Vfs, zMaster, ne
102d0 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 73 71 6c  edSync);.    sql
102e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
102f0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61  Master);.    zMa
10300 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  ster = 0;.    if
10310 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
10320 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
10330 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73      /* All files
10340 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73   and directories
10350 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
10360 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68  en synced, so th
10370 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
10380 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
10390 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
103a0 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c  aseTwo() are onl
103b0 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20  y closing files 
103c0 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74  and.    ** delet
103d0 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
103e0 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73  g journals. If s
103f0 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
10400 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a  ong while.    **
10410 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
10420 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c  ng we don't real
10430 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74  ly care. The int
10440 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20  egrity of the.  
10450 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
10460 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72   is already guar
10470 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65  anteed, but some
10480 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f   stray 'cold' jo
10490 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61  urnals.    ** ma
104a0 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e  y be lying aroun
104b0 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20  d. Returning an 
104c0 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74  error code won't
104d0 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20   help matters.. 
104e0 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c     */.    disabl
104f0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
10500 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c  rrors();.    sql
10510 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
10520 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72  alloc();.    for
10530 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
10540 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
10550 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
10560 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
10570 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
10580 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10590 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
105a0 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 1);.      }.
105b0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
105c0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
105d0 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73  ();.    enable_s
105e0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
105f0 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  rs();..    sqlit
10600 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
10610 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
10620 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10630 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
10640 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  e checks that th
10650 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41  e sqlite3.nVdbeA
10660 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69  ctive count vari
10670 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
10680 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
10690 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
106a0 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
106b0 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
106c0 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
106d0 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
106e0 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
106f0 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
10700 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
10710 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
10720 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
10730 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
10740 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
10750 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
10760 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
10770 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
10780 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
10790 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
107a0 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
107b0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
107c0 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
107d0 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  cnt = 0;.  int n
107e0 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74  Write = 0;.  int
107f0 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20   nRead = 0;.  p 
10800 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77  = db->pVdbe;.  w
10810 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
10820 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  f( sqlite3_stmt_
10830 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74  busy((sqlite3_st
10840 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20  mt*)p) ){.      
10850 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
10860 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20   p->readOnly==0 
10870 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20  ) nWrite++;.    
10880 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64    if( p->bIsRead
10890 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20  er ) nRead++;.  
108a0 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
108b0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Next;.  }.  asse
108c0 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64  rt( cnt==db->nVd
108d0 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73  beActive );.  as
108e0 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62  sert( nWrite==db
108f0 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a  ->nVdbeWrite );.
10900 20 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d    assert( nRead=
10910 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29  =db->nVdbeRead )
10920 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
10930 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  e checkActiveVdb
10940 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a  eCnt(x).#endif..
10950 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62  /*.** If the Vdb
10960 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
10970 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f  first argument o
10980 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e  pened a statemen
10990 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  t-transaction,.*
109a0 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20  * close it now. 
109b0 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73  Argument eOp mus
109c0 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45  t be either SAVE
109d0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f  POINT_ROLLBACK o
109e0 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  r.** SAVEPOINT_R
109f0 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73  ELEASE. If it is
10a00 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
10a10 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74  ACK, then the st
10a20 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
10a30 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
10a40 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73   back. If eOp is
10a50 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
10a60 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  SE, then the .**
10a70 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
10a80 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
10a90 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
10aa0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
10ab0 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
10ac0 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
10ad0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
10ae0 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49  * Otherwise SQLI
10af0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
10b00 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74  lite3VdbeCloseSt
10b10 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  atement(Vdbe *p,
10b20 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c   int eOp){.  sql
10b30 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d  ite3 *const db =
10b40 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
10b50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
10b60 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65   /* If p->iState
10b70 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  ment is greater 
10b80 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
10b90 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64  this Vdbe opened
10ba0 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65   a .  ** stateme
10bb0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  nt transaction t
10bc0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  hat should be cl
10bd0 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f  osed here. The o
10be0 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  nly exception.  
10bf0 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f  ** is that an IO
10c00 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20   error may have 
10c10 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e  occurred, causin
10c20 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  g an emergency r
10c30 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e  ollback..  ** In
10c40 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e   this case (db->
10c50 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20  nStatement==0), 
10c60 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74  and there is not
10c70 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f  hing to do..  */
10c80 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74  .  if( db->nStat
10c90 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61  ement && p->iSta
10ca0 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e  tement ){.    in
10cb0 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69  t i;.    const i
10cc0 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20  nt iSavepoint = 
10cd0 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b  p->iStatement-1;
10ce0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f  ..    assert( eO
10cf0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
10d00 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41  LBACK || eOp==SA
10d10 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29  VEPOINT_RELEASE)
10d20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
10d30 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ->nStatement>0 )
10d40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
10d50 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62  >iStatement==(db
10d60 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d  ->nStatement+db-
10d70 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a  >nSavepoint) );.
10d80 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10d90 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
10da0 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20        int rc2 = 
10db0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
10dc0 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
10dd0 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
10de0 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
10df0 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
10e00 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10e10 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
10e20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
10e30 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
10e40 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
10e50 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
10e60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10e70 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c      if( rc2==SQL
10e80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10e90 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
10ea0 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
10eb0 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
10ec0 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
10ed0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nt);.        }. 
10ee0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
10ef0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10f00 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
10f10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10f20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  }.    }.    db->
10f30 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20  nStatement--;.  
10f40 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
10f50 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  = 0;..    if( rc
10f60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10f70 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
10f80 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10f90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
10fa0 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65   sqlite3VtabSave
10fb0 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f  point(db, SAVEPO
10fc0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
10fd0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
10fe0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
10ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11000 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11010 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
11020 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  db, SAVEPOINT_RE
11030 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e  LEASE, iSavepoin
11040 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
11050 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
11060 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
11070 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  action is being 
11080 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73  rolled back, als
11090 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20  o restore the . 
110a0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68     ** database h
110b0 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20  andles deferred 
110c0 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74  constraint count
110d0 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  er to the value 
110e0 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20  it had when .   
110f0 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
11100 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
11110 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20  s opened.  */.  
11120 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
11130 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
11140 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  .      db->nDefe
11150 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53  rredCons = p->nS
11160 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20  tmtDefCons;.    
11170 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
11180 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  mmCons = p->nStm
11190 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20  tDefImmCons;.   
111a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
111b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
111c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
111d0 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  lled when a tran
111e0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62  saction opened b
111f0 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  y the database .
11200 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69  ** handle associ
11210 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
11220 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
11230 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20  gument is about 
11240 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74  to be .** commit
11250 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72  ted. If there ar
11260 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65  e outstanding de
11270 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
11280 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  ey constraint.**
11290 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74   violations, ret
112a0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
112b0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
112c0 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
112d0 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
112e0 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74  anding FK violat
112f0 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75  ions and this fu
11300 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
11310 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  ** SQLITE_ERROR,
11320 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
11330 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c  of the VM to SQL
11340 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
11350 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64  OREIGNKEY.** and
11360 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20   write an error 
11370 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54  message to it. T
11380 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
11390 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e  E_ERROR..*/.#ifn
113a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
113b0 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20  FOREIGN_KEY.int 
113c0 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
113d0 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Fk(Vdbe *p, int 
113e0 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c  deferred){.  sql
113f0 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
11400 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65  ;.  if( (deferre
11410 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72  d && (db->nDefer
11420 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66  redCons+db->nDef
11430 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29  erredImmCons)>0)
11440 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72   .   || (!deferr
11450 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73  ed && p->nFkCons
11460 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a  traint>0) .  ){.
11470 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
11480 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
11490 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d  REIGNKEY;.    p-
114a0 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
114b0 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c  E_Abort;.    sql
114c0 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c  ite3VdbeError(p,
114d0 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f   "FOREIGN KEY co
114e0 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
114f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
11500 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
11510 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11520 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
11530 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11540 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77   is called the w
11550 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73  hen a VDBE tries
11560 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68   to halt.  If th
11570 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61  e VDBE.** has ma
11580 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69  de changes and i
11590 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20  s in autocommit 
115a0 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69  mode, then commi
115b0 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67  t those.** chang
115c0 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61  es.  If a rollba
115d0 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68  ck is needed, th
115e0 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en do the rollba
115f0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
11600 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e  outine is the on
11610 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74  ly way to move t
11620 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d  he state of a VM
11630 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f   from.** SQLITE_
11640 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c  MAGIC_RUN to SQL
11650 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20  ITE_MAGIC_HALT. 
11660 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20   It is harmless 
11670 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20  to.** call this 
11680 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20  on a VM that is 
11690 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
116a0 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a  GIC_HALT state..
116b0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
116c0 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20  error code.  If 
116d0 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64  the commit could
116e0 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65   not complete be
116f0 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b  cause of.** lock
11700 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74   contention, ret
11710 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
11720 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59    If SQLITE_BUSY
11730 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
11740 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c  .** means the cl
11750 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70  ose did not happ
11760 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  en and needs to 
11770 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a  be repeated..*/.
11780 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48  int sqlite3VdbeH
11790 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  alt(Vdbe *p){.  
117a0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
117b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117c0 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65  /* Used to store
117d0 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72   transient retur
117e0 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c  n codes */.  sql
117f0 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
11800 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
11810 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ction contains t
11820 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65  he logic that de
11830 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74  termines if a st
11840 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20  atement or.  ** 
11850 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
11860 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72   be committed or
11870 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
11880 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  a result of the.
11890 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f    ** execution o
118a0 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  f this virtual m
118b0 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  achine. .  **.  
118c0 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  ** If any of the
118d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72   following error
118e0 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20  s occur:.  **.  
118f0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f  **     SQLITE_NO
11900 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  MEM.  **     SQL
11910 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20  ITE_IOERR.  **  
11920 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20     SQLITE_FULL. 
11930 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
11940 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20  NTERRUPT.  **.  
11950 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65  ** Then the inte
11960 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74  rnal cache might
11970 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20   have been left 
11980 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
11990 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20  nt.  ** state.  
119a0 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  We need to rollb
119b0 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
119c0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  t transaction, i
119d0 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  f there is.  ** 
119e0 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70  one, or the comp
119f0 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  lete transaction
11a00 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
11a10 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
11a20 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69  ction..  */..  i
11a30 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
11a40 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
11a50 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
11a60 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  EM;.  }.  if( p-
11a70 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d  >aOnceFlag ) mem
11a80 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  set(p->aOnceFlag
11a90 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61  , 0, p->nOnceFla
11aa0 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75  g);.  closeAllCu
11ab0 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20  rsors(p);.  if( 
11ac0 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
11ad0 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20  AGIC_RUN ){.    
11ae0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11af0 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74  ;.  }.  checkAct
11b00 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
11b10 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20  .  /* No commit 
11b20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64  or rollback need
11b30 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ed if the progra
11b40 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20  m never started 
11b50 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53  or if the.  ** S
11b60 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65  QL statement doe
11b70 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72  s not read or wr
11b80 69 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ite a database f
11b90 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ile.  */.  if( p
11ba0 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49  ->pc>=0 && p->bI
11bb0 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69  sReader ){.    i
11bc0 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69  nt mrc;   /* Pri
11bd0 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20  mary error code 
11be0 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20  from p->rc */.  
11bf0 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74    int eStatement
11c00 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  Op = 0;.    int 
11c10 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20  isSpecialError; 
11c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
11c30 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27  t to true if a '
11c40 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a  special' error *
11c50 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61  /..    /* Lock a
11c60 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62  ll btrees used b
11c70 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
11c80 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
11c90 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20  beEnter(p);..   
11ca0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e   /* Check for on
11cb0 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
11cc0 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d   errors */.    m
11cd0 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66  rc = p->rc & 0xf
11ce0 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c  f;.    isSpecial
11cf0 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c  Error = mrc==SQL
11d00 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
11d10 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d30 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49      || mrc==SQLI
11d40 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20  TE_INTERRUPT || 
11d50 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
11d60 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63  ;.    if( isSpec
11d70 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ialError ){.    
11d80 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
11d90 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20  y was read-only 
11da0 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
11db0 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54  de is SQLITE_INT
11dc0 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a  ERRUPT, .      *
11dd0 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73  * no rollback is
11de0 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65   necessary. Othe
11df0 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20  rwise, at least 
11e00 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  a savepoint .   
11e10 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
11e20 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64  n must be rolled
11e30 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65   back to restore
11e40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
11e50 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   a .      ** con
11e60 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
11e70 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
11e80 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61   Even if the sta
11e90 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f  tement is read-o
11ea0 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72  nly, it is impor
11eb0 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a  tant to perform.
11ec0 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65        ** a state
11ed0 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74  ment or transact
11ee0 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  ion rollback ope
11ef0 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
11f00 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f  rror .      ** o
11f10 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 77 72  ccurred while wr
11f20 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
11f30 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61  rnal, sub-journa
11f40 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20  l or database.  
11f50 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70      ** file as p
11f60 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74  art of an effort
11f70 20 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68   to free up cach
11f80 65 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e  e space (see fun
11f90 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70  ction.      ** p
11fa0 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20  agerStress() in 
11fb0 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f  pager.c), the ro
11fc0 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72  llback is requir
11fd0 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20  ed to restore . 
11fe0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65       ** the page
11ff0 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e  r to a consisten
12000 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
12010 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  /.      if( !p->
12020 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21  readOnly || mrc!
12030 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
12040 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
12050 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f   (mrc==SQLITE_NO
12060 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
12070 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75  TE_FULL) && p->u
12080 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29  sesStmtJournal )
12090 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
120a0 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
120b0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
120c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
120d0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
120e0 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c  e forced to roll
120f0 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65   back the active
12100 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65   transaction. Be
12110 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20  fore doing.     
12120 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72       ** so, abor
12130 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74  t any other stat
12140 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64  ements this hand
12150 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  le currently has
12160 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20   active..       
12170 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
12180 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
12190 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
121a0 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
121b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
121c0 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
121d0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  db);.          d
121e0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
121f0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  1;.          p->
12200 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
12210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12220 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
12230 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65  ck for immediate
12240 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f   foreign key vio
12250 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20  lations. */.    
12260 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
12270 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
12280 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
12290 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  (p, 0);.    }.  
122a0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
122b0 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
122c0 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
122d0 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
122e0 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a  ve writer .    *
122f0 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f  * VM, then we do
12300 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74   either a commit
12310 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20   or rollback of 
12320 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
12330 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a  saction. .    **
12340 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  .    ** Note: Th
12350 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75  is block also ru
12360 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65  ns if one of the
12370 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
12380 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20  handled .    ** 
12390 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72  above has occurr
123a0 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed. .    */.    
123b0 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62  if( !sqlite3Vtab
123c0 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20  InSync(db) .    
123d0 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   && db->autoComm
123e0 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  it .     && db->
123f0 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e  nVdbeWrite==(p->
12400 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20  readOnly==0) .  
12410 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
12420 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12430 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
12440 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
12450 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
12460 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
12470 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
12480 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20  Fk(p, 1);.      
12490 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
124a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
124b0 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65   if( NEVER(p->re
124c0 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
124d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
124e0 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  beLeave(p);.    
124f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
12500 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
12510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
12530 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
12540 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  NKEY;.        }e
12550 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20  lse{ .          
12560 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  /* The auto-comm
12570 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
12580 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
12590 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  m was successful
125a0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f   .          ** o
125b0 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49  r hit an 'OR FAI
125c0 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  L' constraint an
125d0 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64  d there are no d
125e0 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a  eferred foreign.
125f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79            ** key
12600 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
12610 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e  hold up the tran
12620 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  saction. This me
12630 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
12640 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
12650 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
12660 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
12670 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  mmit(db, p);.   
12680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
12690 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
126a0 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c  SY && p->readOnl
126b0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  y ){.          s
126c0 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
126d0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
126e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
126f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
12700 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12710 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
12720 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
12730 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
12740 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
12750 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  TE_OK);.        
12760 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
12770 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
12780 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
12790 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
127a0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
127b0 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
127c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
127d0 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
127e0 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20  LITE_DeferFKs;. 
127f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12800 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
12810 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
12820 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
12830 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12840 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
12850 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20   SQLITE_OK);.   
12860 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
12870 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
12880 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
12890 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
128a0 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
128b0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
128c0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
128d0 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
128e0 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
128f0 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
12900 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
12910 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
12920 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
12930 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
12940 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
12950 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
12960 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12970 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12980 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
12990 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
129a0 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
129b0 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
129c0 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
129d0 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
129e0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
129f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
12a00 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
12a10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
12a20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d     /* If eStatem
12a30 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  entOp is non-zer
12a40 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d  o, then a statem
12a50 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
12a60 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
12a70 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
12a80 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c  rolled back. Cal
12a90 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  l sqlite3VdbeClo
12aa0 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f  seStatement() to
12ab0 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49  .    ** do so. I
12ac0 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
12ad0 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
12ae0 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  r, and the curre
12af0 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  nt statement.   
12b00 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69   ** error code i
12b10 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53  s SQLITE_OK or S
12b20 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
12b30 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74  , then promote t
12b40 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
12b50 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f  t statement erro
12b60 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20  r code..    */. 
12b70 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
12b80 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20  tOp ){.      rc 
12b90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  = sqlite3VdbeClo
12ba0 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65  seStatement(p, e
12bb0 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20  StatementOp);.  
12bc0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
12bd0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
12be0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
12bf0 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49  ->rc&0xff)==SQLI
12c00 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b  TE_CONSTRAINT ){
12c10 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
12c20 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
12c30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12c40 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
12c50 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72            p->zEr
12c60 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
12c70 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
12c80 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
12c90 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
12ca0 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
12cb0 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
12cc0 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
12cd0 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
12ce0 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
12cf0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
12d00 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
12d10 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
12d20 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
12d30 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
12d40 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d  TE and no statem
12d50 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ent transaction.
12d60 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
12d70 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64  rolled back, upd
12d80 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
12d90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e   connection chan
12da0 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20  ge-counter. .   
12db0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63   */.    if( p->c
12dc0 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20  hangeCntOn ){.  
12dd0 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65      if( eStateme
12de0 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f  ntOp!=SAVEPOINT_
12df0 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
12e00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
12e10 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
12e20 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
12e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12e40 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
12e50 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
12e60 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
12e70 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
12e80 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
12e90 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
12ea0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
12eb0 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ave(p);.  }..  /
12ec0 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
12ed0 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
12ee0 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
12ef0 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
12f00 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
12f10 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
12f20 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a  >nVdbeActive--;.
12f30 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
12f40 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65  Only ) db->nVdbe
12f50 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28  Write--;.    if(
12f60 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
12f70 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b  db->nVdbeRead--;
12f80 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
12f90 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62  >nVdbeActive>=db
12fa0 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20  ->nVdbeRead );. 
12fb0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
12fc0 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56  VdbeRead>=db->nV
12fd0 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20  dbeWrite );.    
12fe0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
12ff0 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d  eWrite>=0 );.  }
13000 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
13010 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
13020 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
13030 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70  Cnt(db);.  if( p
13040 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
13050 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
13060 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
13070 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
13080 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
13090 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
130a0 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
130b0 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
130c0 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
130d0 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
130e0 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
130f0 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
13100 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
13110 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
13120 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
13130 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
13140 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
13150 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
13160 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
13170 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
13180 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
13190 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
131a0 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  ive>0 || db->aut
131b0 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
131c0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
131d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
131e0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
131f0 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
13200 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a  SQLITE_OK);.}...
13210 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
13220 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
13230 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
13240 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
13250 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
13260 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
13270 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
13280 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
13290 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
132a0 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
132b0 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
132c0 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
132d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
132e0 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72  * Copy the error
132f0 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
13300 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e  message belongin
13310 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61  g to the VDBE pa
13320 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
13330 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
13340 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61   its database ha
13350 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68  ndle (so that th
13360 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72  ey will be .** r
13370 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73  eturned by calls
13380 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63   to sqlite3_errc
13390 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ode() and sqlite
133a0 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a  3_errmsg())..**.
133b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
133c0 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20   does not clear 
133d0 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63  the VDBE error c
133e0 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20  ode or message, 
133f0 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  just.** copies t
13400 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62  hem to the datab
13410 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
13420 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  nt sqlite3VdbeTr
13430 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65  ansferError(Vdbe
13440 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
13450 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
13460 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
13470 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
13480 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63  ){.    u8 malloc
13490 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  Failed = db->mal
134a0 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 73  locFailed;.    s
134b0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
134c0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
134d0 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29  f( db->pErr==0 )
134e0 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69   db->pErr = sqli
134f0 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
13500 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
13510 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
13520 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
13530 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
13540 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
13550 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
13560 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
13570 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
13580 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69  iled = mallocFai
13590 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72  led;.    db->err
135a0 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c  Code = rc;.  }el
135b0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
135c0 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20  rror(db, rc);.  
135d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
135e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
135f0 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a  ENABLE_SQLLOG./*
13600 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45  .** If an SQLITE
13610 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68  _CONFIG_SQLLOG h
13620 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65  ook is registere
13630 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73  d and the VM has
13640 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69   been run, .** i
13650 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  nvoke it..*/.sta
13660 74 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76  tic void vdbeInv
13670 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a  okeSqllog(Vdbe *
13680 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  v){.  if( sqlite
13690 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
136a0 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d  qllog && v->rc==
136b0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e  SQLITE_OK && v->
136c0 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30  zSql && v->pc>=0
136d0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   ){.    char *zE
136e0 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65  xpanded = sqlite
136f0 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76  3VdbeExpandSql(v
13700 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20  , v->zSql);.    
13710 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69  assert( v->db->i
13720 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20  nit.busy==0 );. 
13730 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64     if( zExpanded
13740 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13750 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
13760 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20  qllog(.         
13770 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
13780 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c  nfig.pSqllogArg,
13790 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65   v->db, zExpande
137a0 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20  d, 1.      );.  
137b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
137c0 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64  e(v->db, zExpand
137d0 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ed);.    }.  }.}
137e0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
137f0 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
13800 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
13810 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42  * Clean up a VDB
13820 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
13830 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c  n but do not del
13840 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73  ete the VDBE jus
13850 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20  t yet..** Write 
13860 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
13870 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  es into *pzErrMs
13880 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  g.  Return the r
13890 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  esult code..**.*
138a0 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
138b0 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65  tine is run, the
138c0 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20   VDBE should be 
138d0 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63  ready to be exec
138e0 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a  uted.** again..*
138f0 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20  *.** To look at 
13900 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20  it another way, 
13910 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  this routine res
13920 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
13930 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
13940 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42  machine from VDB
13950 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56  E_MAGIC_RUN or V
13960 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62  DBE_MAGIC_HALT b
13970 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  ack to.** VDBE_M
13980 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e  AGIC_INIT..*/.in
13990 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  t sqlite3VdbeRes
139a0 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  et(Vdbe *p){.  s
139b0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62  qlite3 *db;.  db
139c0 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
139d0 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f  If the VM did no
139e0 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74  t run to complet
139f0 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63  ion or if it enc
13a00 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a  ountered an.  **
13a10 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20   error, then it 
13a20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62  might not have b
13a30 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65  een halted prope
13a40 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20  rly.  So halt.  
13a50 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ** it now..  */.
13a60 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c    sqlite3VdbeHal
13a70 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  t(p);..  /* If t
13a80 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72  he VDBE has be r
13a90 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c  un even partiall
13aa0 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  y, then transfer
13ab0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
13ac0 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d    ** and error m
13ad0 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20  essage from the 
13ae0 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61  VDBE into the ma
13af0 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
13b00 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a  cture.  But.  **
13b10 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73   if the VDBE has
13b20 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74   just been set t
13b30 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f  o run but has no
13b40 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75  t actually execu
13b50 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73  ted any.  ** ins
13b60 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c  tructions yet, l
13b70 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61  eave the main da
13b80 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66  tabase error inf
13b90 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67  ormation unchang
13ba0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
13bb0 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76  ->pc>=0 ){.    v
13bc0 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
13bd0 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
13be0 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
13bf0 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
13c00 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
13c10 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
13c20 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
13c30 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e  if( p->runOnlyOn
13c40 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20  ce ) p->expired 
13c50 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
13c60 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70   p->rc && p->exp
13c70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ired ){.    /* T
13c80 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20  he expired flag 
13c90 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56  was set on the V
13ca0 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66  DBE before the f
13cb0 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  irst call.    **
13cc0 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70   to sqlite3_step
13cd0 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65  (). For consiste
13ce0 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74  ncy (since sqlit
13cf0 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20  e3_step() was.  
13d00 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65    ** called), se
13d10 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65  t the database e
13d20 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73  rror in this cas
13d30 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a  e as well..    *
13d40 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
13d50 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70 2d  orWithMsg(db, p-
13d60 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20  >rc, p->zErrMsg 
13d70 3f 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a  ? "%s" : 0, p->z
13d80 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
13d90 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
13da0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
13db0 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
13dc0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69    }..  /* Reclai
13dd0 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65  m all memory use
13de0 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20  d by the VDBE.  
13df0 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b  */.  Cleanup(p);
13e00 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66  ..  /* Save prof
13e10 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iling informatio
13e20 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45  n from this VDBE
13e30 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65   run..  */.#ifde
13e40 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
13e50 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
13e60 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
13e70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
13e80 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
13e90 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
13ea0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
13eb0 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
13ec0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
13ed0 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
13ee0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
13ef0 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
13f00 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
13f10 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
13f20 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
13f30 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29     if( p->zSql )
13f40 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
13f50 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  , pc = 0;.      
13f60 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
13f70 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 66  -- ");.        f
13f80 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e  or(i=0; (c = p->
13f90 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b  zSql[i])!=0; i++
13fa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
13fb0 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69   pc=='\n' ) fpri
13fc0 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b  ntf(out, "-- ");
13fd0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 63 28  .          putc(
13fe0 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20  c, out);.       
13ff0 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 20     pc = c;.     
14000 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
14010 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 69   pc!='\n' ) fpri
14020 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
14030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
14040 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
14050 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
14060 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20  har zHdr[100];. 
14070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
14080 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
14090 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 75  Hdr), zHdr, "%6u
140a0 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c   %12llu %8llu ",
140b0 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
140c0 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
140d0 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
140e0 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
140f0 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
14100 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
14110 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
14120 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
14130 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
14140 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48  tf(out, "%s", zH
14150 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  dr);.        sql
14160 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
14170 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
14180 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
14190 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
141a0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
141b0 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 69  .  p->iCurrentTi
141c0 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67  me = 0;.  p->mag
141d0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
141e0 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70  INIT;.  return p
141f0 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61  ->rc & db->errMa
14200 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c  sk;.}. ./*.** Cl
14210 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74  ean up and delet
14220 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  e a VDBE after e
14230 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72  xecution.  Retur
14240 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
14250 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73  ch is.** the res
14260 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65  ult code.  Write
14270 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
14280 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a  ge text into *pz
14290 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
142a0 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
142b0 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ze(Vdbe *p){.  i
142c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
142d0 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  K;.  if( p->magi
142e0 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
142f0 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  N || p->magic==V
14300 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29  DBE_MAGIC_HALT )
14310 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
14320 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a  e3VdbeReset(p);.
14330 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20      assert( (rc 
14340 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b  & p->db->errMask
14350 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73  )==rc );.  }.  s
14360 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
14370 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
14380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61  ;.}../*.** If pa
14390 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c  rameter iOp is l
143a0 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
143b0 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64  hen invoke the d
143c0 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a  estructor for.**
143d0 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64   all auxiliary d
143e0 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72  ata pointers cur
143f0 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79  rently cached by
14400 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
14410 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  s.** the first a
14420 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  rgument..**.** O
14430 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 65  r, if iOp is gre
14440 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
14450 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  al to zero, then
14460 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
14470 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b  is.** only invok
14480 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78  ed for those aux
14490 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e  iliary data poin
144a0 74 65 72 73 20 63 72 65 61 74 65 64 20 62 79 20  ters created by 
144b0 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e  the user .** fun
144c0 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79  ction invoked by
144d0 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e   the OP_Function
144e0 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72   opcode at instr
144f0 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a  uction iOp of .*
14500 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20  * VM pVdbe, and 
14510 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a  only then if:.**
14520 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73  .**    * the ass
14530 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e  ociated function
14540 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
14550 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20  e 32nd or later 
14560 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20  (counting.**    
14570 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72    from left to r
14580 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20  ight), or.**.** 
14590 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70     * the corresp
145a0 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72  onding bit in ar
145b0 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63  gument mask is c
145c0 6c 65 61 72 20 28 77 68 65 72 65 20 74 68 65 20  lear (where the 
145d0 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75  first.**      fu
145e0 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
145f0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
14600 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a  bit 0 etc.)..*/.
14610 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
14620 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64  DeleteAuxData(Vd
14630 62 65 20 2a 70 56 64 62 65 2c 20 69 6e 74 20 69  be *pVdbe, int i
14640 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20  Op, int mask){. 
14650 20 41 75 78 44 61 74 61 20 2a 2a 70 70 20 3d 20   AuxData **pp = 
14660 26 70 56 64 62 65 2d 3e 70 41 75 78 44 61 74 61  &pVdbe->pAuxData
14670 3b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29  ;.  while( *pp )
14680 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a 70  {.    AuxData *p
14690 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69  Aux = *pp;.    i
146a0 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20  f( (iOp<0).     
146b0 7c 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69  || (pAux->iOp==i
146c0 4f 70 20 26 26 20 28 70 41 75 78 2d 3e 69 41 72  Op && (pAux->iAr
146d0 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26  g>31 || !(mask &
146e0 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d   MASKBIT32(pAux-
146f0 3e 69 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b  >iArg)))).    ){
14700 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14710 20 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20   pAux->iArg==31 
14720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75  );.      if( pAu
14730 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20  x->xDelete ){.  
14740 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c        pAux->xDel
14750 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b  ete(pAux->pAux);
14760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
14770 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74  pp = pAux->pNext
14780 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
14790 62 46 72 65 65 28 70 56 64 62 65 2d 3e 64 62 2c  bFree(pVdbe->db,
147a0 20 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73   pAux);.    }els
147b0 65 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41  e{.      pp= &pA
147c0 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ux->pNext;.    }
147d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
147e0 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  ee all memory as
147f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
14800 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
14810 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14820 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20  ment,.** except 
14830 66 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c  for object itsel
14840 66 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73  f, which is pres
14850 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  erved..**.** The
14860 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
14870 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
14880 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62  n and sqlite3Vdb
14890 65 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61  eDelete() is tha
148a0 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28  t.** VdbeDelete(
148b0 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74  ) also unlinks t
148c0 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
148d0 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73   list of VMs ass
148e0 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
148f0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
14900 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  nection and free
14910 73 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73  s the object its
14920 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  elf..*/.void sql
14930 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a  ite3VdbeClearObj
14940 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
14950 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62   Vdbe *p){.  Sub
14960 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a  Program *pSub, *
14970 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  pNext;.  int i;.
14980 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d    assert( p->db=
14990 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20  =0 || p->db==db 
149a0 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
149b0 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d  rray(p->aVar, p-
149c0 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73  >nVar);.  releas
149d0 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
149e0 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
149f0 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
14a00 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70  .  for(pSub=p->p
14a10 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70  Program; pSub; p
14a20 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  Sub=pNext){.    
14a30 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e  pNext = pSub->pN
14a40 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65  ext;.    vdbeFre
14a50 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75  eOpArray(db, pSu
14a60 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f  b->aOp, pSub->nO
14a70 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
14a80 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b  bFree(db, pSub);
14a90 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  .  }.  for(i=p->
14aa0 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69  nzVar-1; i>=0; i
14ab0 2d 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  --) sqlite3DbFre
14ac0 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69  e(db, p->azVar[i
14ad0 5d 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70  ]);.  vdbeFreeOp
14ae0 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70  Array(db, p->aOp
14af0 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c  , p->nOp);.  sql
14b00 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
14b10 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73  ->aColName);.  s
14b20 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14b30 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c   p->zSql);.  sql
14b40 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
14b50 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66 64 65 66  ->pFree);.#ifdef
14b60 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
14b70 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
14b80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
14b90 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Scan; i++){.    
14ba0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14bb0 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e  , p->aScan[i].zN
14bc0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
14bd0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14be0 3e 61 53 63 61 6e 29 3b 0a 23 65 6e 64 69 66 0a  >aScan);.#endif.
14bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
14c00 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a  an entire VDBE..
14c10 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
14c20 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a  dbeDelete(Vdbe *
14c30 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
14c40 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  b;..  if( NEVER(
14c50 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  p==0) ) return;.
14c60 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
14c70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14c80 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
14c90 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
14ca0 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63  e3VdbeClearObjec
14cb0 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20  t(db, p);.  if( 
14cc0 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  p->pPrev ){.    
14cd0 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
14ce0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  = p->pNext;.  }e
14cf0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
14d00 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b   db->pVdbe==p );
14d10 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d  .    db->pVdbe =
14d20 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
14d30 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
14d40 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  .    p->pNext->p
14d50 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
14d60 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
14d70 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41  = VDBE_MAGIC_DEA
14d80 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a  D;.  p->db = 0;.
14d90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
14da0 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
14db0 20 54 68 65 20 63 75 72 73 6f 72 20 22 70 22 20   The cursor "p" 
14dc0 68 61 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65  has a pending se
14dd0 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  ek operation tha
14de0 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
14df0 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75  en.** carried ou
14e00 74 2e 20 20 53 65 65 6b 20 74 68 65 20 63 75 72  t.  Seek the cur
14e10 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20  sor now.  If an 
14e20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
14e30 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72  turn.** the appr
14e40 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
14e50 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
14e60 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
14e70 45 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64  E handleDeferred
14e80 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f  Moveto(VdbeCurso
14e90 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73  r *p){.  int res
14ea0 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c  , rc;.#ifdef SQL
14eb0 49 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72  ITE_TEST.  exter
14ec0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
14ed0 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
14ee0 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  if.  assert( p->
14ef0 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29  deferredMoveto )
14f00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
14f10 73 54 61 62 6c 65 20 29 3b 0a 20 20 72 63 20 3d  sTable );.  rc =
14f20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
14f30 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70  etoUnpacked(p->p
14f40 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f  Cursor, 0, p->mo
14f50 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26  vetoTarget, 0, &
14f60 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  res);.  if( rc )
14f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
14f80 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72  ( res!=0 ) retur
14f90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
14fa0 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51  _BKPT;.#ifdef SQ
14fb0 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
14fc0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
14fd0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e  ++;.#endif.  p->
14fe0 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
14ff0 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74   0;.  p->cacheSt
15000 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
15010 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  LE;.  return SQL
15020 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
15030 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d   Something has m
15040 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20  oved cursor "p" 
15050 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d  out of place.  M
15060 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20  aybe the row it 
15070 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74  was.** pointed t
15080 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  o was deleted ou
15090 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e  t from under it.
150a0 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62    Or maybe the b
150b0 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61  tree was.** reba
150c0 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65  lanced.  Whateve
150d0 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79  r the cause, try
150e0 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20   to restore "p" 
150f0 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a  to the place it.
15100 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74  ** is supposed t
15110 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20  o be pointing.  
15120 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64  If the row was d
15130 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
15140 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72  under the.** cur
15150 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72  sor, set the cur
15160 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
15170 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73  a NULL row..*/.s
15180 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
15190 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
151a0 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65  MovedCursor(Vdbe
151b0 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
151c0 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  t isDifferentRow
151d0 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  , rc;.  assert( 
151e0 70 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  p->pCursor!=0 );
151f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
15200 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
15210 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  Moved(p->pCursor
15220 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
15230 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
15240 73 74 6f 72 65 28 70 2d 3e 70 43 75 72 73 6f 72  store(p->pCursor
15250 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f  , &isDifferentRo
15260 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74  w);.  p->cacheSt
15270 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
15280 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66  LE;.  if( isDiff
15290 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75  erentRow ) p->nu
152a0 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74  llRow = 1;.  ret
152b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
152c0 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65   Check to ensure
152d0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
152e0 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74   is valid.  Rest
152f0 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  ore the cursor.*
15300 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52  * if need be.  R
15310 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72  eturn any I/O er
15320 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73  ror from the res
15330 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  tore operation..
15340 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
15350 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  beCursorRestore(
15360 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
15370 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
15380 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
15390 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a  (p->pCursor) ){.
153a0 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
153b0 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b  eMovedCursor(p);
153c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
153d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
153e0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
153f0 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64  cursor p is read
15400 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  y to read or wri
15410 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68  te the row to wh
15420 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61  ich it.** was la
15430 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20  st positioned.  
15440 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
15450 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66  code if an OOM f
15460 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f  ault or I/O erro
15470 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73  r.** prevents us
15480 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e   from positionin
15490 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
154a0 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69  its correct posi
154b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
154c0 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f   MoveTo operatio
154d0 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20  n is pending on 
154e0 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
154f0 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a  , then do that.*
15500 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49  * MoveTo now.  I
15510 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e  f no move is pen
15520 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73  ding, check to s
15530 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61  ee if the row ha
15540 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65  s been.** delete
15550 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
15560 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20   the cursor and 
15570 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20  if it has, mark 
15580 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20  the row as.** a 
15590 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20  NULL row..**.** 
155a0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
155b0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
155c0 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  g to the correct
155d0 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f   row and that ro
155e0 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65  w has.** not bee
155f0 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
15600 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
15610 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72  sor, then this r
15620 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
15630 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
15640 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74  3VdbeCursorMovet
15650 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  o(VdbeCursor *p)
15660 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72  {.  if( p->defer
15670 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20  redMoveto ){.   
15680 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65   return handleDe
15690 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b  ferredMoveto(p);
156a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 43  .  }.  if( p->pC
156b0 75 72 73 6f 72 20 26 26 20 73 71 6c 69 74 65 33  ursor && sqlite3
156c0 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
156d0 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20  ved(p->pCursor) 
156e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61  ){.    return ha
156f0 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
15700 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
15710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15720 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
15730 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
15740 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
15750 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
15760 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15770 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
15780 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
15790 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
157a0 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
157b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
157c0 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
157d0 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
157e0 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
157f0 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
15800 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
15810 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
15820 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
15830 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
15840 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
15850 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
15860 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
15870 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
15880 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
15890 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
158a0 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
158b0 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
158c0 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
158d0 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
158e0 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
158f0 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
15900 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
15910 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
15920 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
15930 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
15940 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
15950 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
15960 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
15970 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
15980 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
15990 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
159a0 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
159b0 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
159c0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
159d0 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
159e0 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
159f0 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79   blob separately
15a00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
15a10 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
15a20 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
15a30 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
15a40 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
15a50 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
15a60 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
15a70 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
15a80 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
15a90 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
15aa0 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
15ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
15ac0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
15ad0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
15ae0 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
15af0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
15b00 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
15b10 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
15b20 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
15b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b40 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
15b50 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
15b60 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
15b70 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
15b80 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
15b90 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
15ba0 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
15bb0 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
15bc0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
15bd0 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bf0 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
15c00 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
15c10 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
15c20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
15c30 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
15c40 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
15c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c60 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
15c70 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
15c80 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
15c90 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
15ca0 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
15cb0 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
15cc0 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
15cd0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
15ce0 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
15cf0 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
15d00 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
15d30 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
15d40 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
15d50 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
15d60 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
15d70 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
15d80 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
15d90 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
15da0 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
15db0 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
15dc0 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
15dd0 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
15de0 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
15df0 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
15e00 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
15e10 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
15e20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
15e30 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
15e40 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
15e50 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
15e60 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
15e70 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
15e80 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
15e90 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  t){.  int flags 
15ea0 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
15eb0 20 75 33 32 20 6e 3b 0a 0a 20 20 69 66 28 20 66   u32 n;..  if( f
15ec0 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
15ed0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
15ee0 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
15ef0 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  EM_Int ){.    /*
15f00 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
15f10 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
15f20 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
15f30 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
15f40 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
15f50 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
15f60 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
15f70 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
15f80 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20   u64 u;.    if( 
15f90 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d  i<0 ){.      u =
15fa0 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ~i;.    }else{.
15fb0 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20        u = i;.   
15fc0 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32   }.    if( u<=12
15fd0 37 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  7 ){.      retur
15fe0 6e 20 28 28 69 26 31 29 3d 3d 69 20 26 26 20 66  n ((i&1)==i && f
15ff0 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 29 20 3f  ile_format>=4) ?
16000 20 38 2b 28 75 33 32 29 75 20 3a 20 31 3b 0a 20   8+(u32)u : 1;. 
16010 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d     }.    if( u<=
16020 33 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32  32767 ) return 2
16030 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38  ;.    if( u<=838
16040 38 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b  8607 ) return 3;
16050 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37  .    if( u<=2147
16060 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20  483647 ) return 
16070 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41  4;.    if( u<=MA
16080 58 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e  X_6BYTE ) return
16090 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   5;.    return 6
160a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
160b0 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
160c0 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
160d0 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
160e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
160f0 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53   || flags&(MEM_S
16100 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
16110 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
16120 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75  n>=0 );.  n = (u
16130 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66  32)pMem->n;.  if
16140 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
16150 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
16160 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
16170 7d 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  }.  return ((n*2
16180 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
16190 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
161a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
161b0 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
161c0 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  e data correspon
161d0 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  ding to the supp
161e0 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65  lied serial-type
161f0 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
16200 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
16210 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  n(u32 serial_typ
16220 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e){.  if( serial
16230 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
16240 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f   return (serial_
16250 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65  type-12)/2;.  }e
16260 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
16270 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d  const u8 aSize[]
16280 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c   = { 0, 1, 2, 3,
16290 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20   4, 6, 8, 8, 0, 
162a0 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72  0, 0, 0 };.    r
162b0 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69  eturn aSize[seri
162c0 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
162d0 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
162e0 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74   on an architect
162f0 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65  ure with mixed-e
16300 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a  ndian floating .
16310 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41  ** points (ex: A
16320 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74  RM7) then swap t
16330 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73  he lower 4 bytes
16340 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70   with the .** up
16350 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65  per 4 bytes.  Re
16360 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
16370 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20  .**.** For most 
16380 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74  architectures, t
16390 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
163a0 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20  **.** (later):  
163b0 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
163c0 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69  o me that the mi
163d0 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c  xed-endian probl
163e0 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73  em.** on ARM7 is
163f0 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47   an issue with G
16400 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65  CC, not with the
16410 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20   ARM7 chip.  It 
16420 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61  seems.** that ea
16430 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  rly versions of 
16440 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74  GCC stored the t
16450 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34  wo words of a 64
16460 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e  -bit.** float in
16470 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72   the wrong order
16480 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f  .  And that erro
16490 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61  r has been propa
164a0 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69  gated.** ever si
164b0 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20  nce.  The blame 
164c0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
164d0 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f  ly with GCC, tho
164e0 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68  ugh..** GCC migh
164f0 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79  t have just copy
16500 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ing the problem 
16510 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d  from a prior com
16520 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61  piler..** I am a
16530 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65  lso told that ne
16540 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
16550 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  GCC that follow 
16560 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41  a different.** A
16570 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20  BI get the byte 
16580 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a  order right..**.
16590 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73  ** Developers us
165a0 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e  ing SQLite on an
165b0 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d   ARM7 should com
165c0 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65  pile and run the
165d0 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ir.** applicatio
165e0 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  n using -DSQLITE
165f0 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73  _DEBUG=1 at leas
16600 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45  t once.  With DE
16610 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  BUG.** enabled, 
16620 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c  some asserts bel
16630 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74  ow will ensure t
16640 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  hat the byte ord
16650 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e  er of.** floatin
16660 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69  g point values i
16670 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a  s correct..**.**
16680 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46   (2007-08-30)  F
16690 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61  rank van Vugt ha
166a0 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70  s studied this p
166b0 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a  roblem closely.*
166c0 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68  * and has send h
166d0 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74  is findings to t
166e0 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f  he SQLite develo
166f0 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20  pers.  Frank.** 
16700 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65  writes that some
16710 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f   Linux kernels o
16720 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ffer floating po
16730 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20  int hardware.** 
16740 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75  emulation that u
16750 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20  ses only 32-bit 
16760 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61  mantissas instea
16770 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20  d of a full .** 
16780 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69  48-bits as requi
16790 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20  red by the IEEE 
167a0 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73  standard.  (This
167b0 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49   is the.** CONFI
167c0 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70  G_FPE_FASTFPE op
167d0 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20  tion.)  On such 
167e0 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e  systems, floatin
167f0 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20  g point.** byte 
16800 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73  swapping becomes
16810 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65   very complicate
16820 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f  d.  To avoid pro
16830 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65  blems,.** the ne
16840 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61  cessary byte swa
16850 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64  pping is carried
16860 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d   out using a 64-
16870 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72  bit integer.** r
16880 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d  ather than a 64-
16890 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e  bit float.  Fran
168a0 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61  k assures us tha
168b0 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a  t the code here.
168c0 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d  ** works for him
168d0 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c  .  We, the devel
168e0 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77  opers, have no w
168f0 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e  ay to independen
16900 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68  tly.** verify th
16910 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65  is, but Frank se
16920 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74  ems to know what
16930 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61   he is talking a
16940 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72  bout.** so we tr
16950 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64  ust him..*/.#ifd
16960 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  ef SQLITE_MIXED_
16970 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
16980 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c  AT.static u64 fl
16990 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b  oatSwap(u64 in){
169a0 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75  .  union {.    u
169b0 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b  64 r;.    u32 i[
169c0 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32  2];.  } u;.  u32
169d0 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b   t;..  u.r = in;
169e0 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20  .  t = u.i[0];. 
169f0 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d   u.i[0] = u.i[1]
16a00 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a  ;.  u.i[1] = t;.
16a10 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a    return u.r;.}.
16a20 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
16a30 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
16a40 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28    X = floatSwap(
16a50 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
16a60 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
16a70 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66  nFloat(X).#endif
16a80 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
16a90 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  e serialized dat
16aa0 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76  a blob for the v
16ab0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
16ac0 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66  Mem into .** buf
16ad0 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
16ae0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
16af0 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75  has allocated su
16b00 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a  fficient space..
16b10 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
16b20 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
16b30 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75  itten..**.** nBu
16b40 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20  f is the amount 
16b50 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e  of space left in
16b60 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c   buf[].  The cal
16b70 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
16b80 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61  le.** for alloca
16b90 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63  ting enough spac
16ba0 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f  e to buf[] to ho
16bb0 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ld the entire fi
16bc0 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a  eld, exclusive.*
16bd0 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75  * of the pMem->u
16be0 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72  .nZero bytes for
16bf0 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75   a MEM_Zero valu
16c00 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
16c10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
16c20 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69  tes actually wri
16c30 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  tten into buf[].
16c40 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
16c50 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
16c60 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
16c70 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
16c80 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
16c90 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73   only.** if thos
16ca0 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72  e bytes were zer
16cb0 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f  oed in buf[]..*/
16cc0 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
16cd0 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62  eSerialPut(u8 *b
16ce0 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75  uf, Mem *pMem, u
16cf0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
16d00 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f  .  u32 len;..  /
16d10 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
16d20 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
16d30 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65  al_type<=7 && se
16d40 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20  rial_type>0 ){. 
16d50 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33     u64 v;.    u3
16d60 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  2 i;.    if( ser
16d70 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
16d80 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
16d90 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(v)==sizeof(p
16da0 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20  Mem->u.r) );.   
16db0 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70     memcpy(&v, &p
16dc0 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66  Mem->u.r, sizeof
16dd0 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70  (v));.      swap
16de0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
16df0 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (v);.    }else{.
16e00 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e        v = pMem->
16e10 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  u.i;.    }.    l
16e20 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33  en = i = sqlite3
16e30 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
16e40 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
16e50 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
16e60 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  );.    do{.     
16e70 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29   buf[--i] = (u8)
16e80 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20  (v&0xFF);.      
16e90 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68  v >>= 8;.    }wh
16ea0 69 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65  ile( i );.    re
16eb0 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
16ec0 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
16ed0 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  ob */.  if( seri
16ee0 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
16ef0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
16f00 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61  >n + ((pMem->fla
16f10 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70  gs & MEM_Zero)?p
16f20 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a  Mem->u.nZero:0).
16f30 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
16f40 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65  (int)sqlite3Vdbe
16f50 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
16f60 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
16f70 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
16f80 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c  .    memcpy(buf,
16f90 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
16fa0 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
16fb0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f    }..  /* NULL o
16fc0 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72  r constants 0 or
16fd0 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30   1 */.  return 0
16fe0 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78  ;.}../* Input "x
16ff0 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20  " is a sequence 
17000 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  of unsigned char
17010 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72  acters that repr
17020 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65  esent a.** big-e
17030 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  ndian integer.  
17040 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76  Return the equiv
17050 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74  alent native int
17060 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  eger.*/.#define 
17070 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  ONE_BYTE_INT(x) 
17080 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a     ((i8)(x)[0]).
17090 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45  #define TWO_BYTE
170a0 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a  _INT(x)    (256*
170b0 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29  (i8)((x)[0])|(x)
170c0 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52  [1]).#define THR
170d0 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  EE_BYTE_INT(x)  
170e0 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b  (65536*(i8)((x)[
170f0 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c  0])|((x)[1]<<8)|
17100 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[2]).#define 
17110 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78  FOUR_BYTE_UINT(x
17120 29 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d  )  (((u32)(x)[0]
17130 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  <<24)|((x)[1]<<1
17140 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
17150 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[3]).#define F
17160 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  OUR_BYTE_INT(x) 
17170 28 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28  (16777216*(i8)((
17180 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c  x)[0])|((x)[1]<<
17190 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c  16)|((x)[2]<<8)|
171a0 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44  (x)[3])../*.** D
171b0 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64  eserialize the d
171c0 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64  ata blob pointed
171d0 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65   to by buf as se
171e0 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c  rial type serial
171f0 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f  _type.** and sto
17200 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
17210 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74   pMem.  Return t
17220 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
17230 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  es read..**.** T
17240 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
17250 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74  implemented as t
17260 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74  wo separate rout
17270 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d  ines for perform
17280 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77  ance..** The few
17290 20 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75   cases that requ
172a0 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  ire local variab
172b0 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f  les are broken o
172c0 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61  ut into a separa
172d0 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f  te.** routine so
172e0 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61   that in most ca
172f0 73 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64  ses the overhead
17300 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73   of moving the s
17310 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  tack pointer.** 
17320 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a  is avoided..*/ .
17330 73 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54  static u32 SQLIT
17340 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61  E_NOINLINE seria
17350 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
17360 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
17370 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
17380 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
17390 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
173a0 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
173b0 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
173c0 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
173d0 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
173e0 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
173f0 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
17400 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
17410 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
17420 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f  .  u64 x = FOUR_
17430 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a  BYTE_UINT(buf);.
17440 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42    u32 y = FOUR_B
17450 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b  YTE_UINT(buf+4);
17460 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b  .  x = (x<<32) +
17470 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c   y;.  if( serial
17480 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20  _type==6 ){.    
17490 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
174a0 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56 61  R-29851-52272 Va
174b0 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
174c0 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a  ian 64-bit.    *
174d0 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
174e0 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
174f0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
17500 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65  i64*)&x;.    pMe
17510 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
17520 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  nt;.    testcase
17530 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
17540 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
17550 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17560 35 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75  57343-49114 Valu
17570 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
17580 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20  n IEEE 754-2008 
17590 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c  64-bit.    ** fl
175a0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d  oating point num
175b0 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66  ber. */.#if !def
175c0 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
175d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
175e0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
175f0 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69  INT).    /* Veri
17600 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73  fy that integers
17610 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f   and floating po
17620 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74  int values use t
17630 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62  he same.    ** b
17640 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20  yte order.  Or, 
17650 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d  that if SQLITE_M
17660 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
17670 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a  T_FLOAT is.    *
17680 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
17690 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
176a0 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
176b0 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
176c0 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20   ** endian..    
176d0 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
176e0 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75  nst u64 t1 = ((u
176f0 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c  64)0x3ff00000)<<
17700 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  32;.    static c
17710 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d  onst double r1 =
17720 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32   1.0;.    u64 t2
17730 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d   = t1;.    swapM
17740 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
17750 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t2);.    assert(
17760 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a   sizeof(r1)==siz
17770 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d  eof(t2) && memcm
17780 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65  p(&r1, &t2, size
17790 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65  of(r1))==0 );.#e
177a0 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
177b0 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26   sizeof(x)==8 &&
177c0 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e   sizeof(pMem->u.
177d0 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61  r)==8 );.    swa
177e0 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
177f0 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  t(x);.    memcpy
17800 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c  (&pMem->u.r, &x,
17810 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
17820 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73   pMem->flags = s
17830 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d  qlite3IsNaN(pMem
17840 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c  ->u.r) ? MEM_Nul
17850 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20  l : MEM_Real;.  
17860 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a  }.  return 8;.}.
17870 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
17880 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
17890 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
178a0 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
178b0 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
178c0 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
178d0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
178e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
178f0 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
17900 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
17910 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
17920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
17930 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
17940 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
17950 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73  /.){.  switch( s
17960 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
17970 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20    case 10:   /* 
17980 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
17990 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
179a0 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73  ase 11:   /* Res
179b0 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
179c0 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
179d0 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a   0: {  /* Null *
179e0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
179f0 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d  NCE-OF: R-24078-
17a00 30 39 33 37 35 20 56 61 6c 75 65 20 69 73 20 61  09375 Value is a
17a10 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20   NULL. */.      
17a20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
17a30 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72  M_Null;.      br
17a40 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
17a50 61 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f  ase 1: {.      /
17a60 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
17a70 2d 34 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c  -44885-25196 Val
17a80 75 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74  ue is an 8-bit t
17a90 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20  wos-complement. 
17aa0 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e       ** integer.
17ab0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
17ac0 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49  u.i = ONE_BYTE_I
17ad0 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
17ae0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
17af0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
17b00 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
17b10 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
17b20 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
17b30 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
17b40 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
17b50 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
17b60 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37  IDENCE-OF: R-497
17b70 39 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69  94-35026 Value i
17b80 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31  s a big-endian 1
17b90 36 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  6-bit.      ** t
17ba0 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
17bb0 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
17bc0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f   pMem->u.i = TWO
17bd0 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
17be0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
17bf0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
17c00 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
17c10 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
17c20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
17c30 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
17c40 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
17c50 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
17c60 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
17c70 3a 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20  : R-37839-54301 
17c80 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
17c90 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20  ndian 24-bit.   
17ca0 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
17cb0 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
17cc0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
17cd0 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49  i = THREE_BYTE_I
17ce0 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
17cf0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
17d00 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
17d10 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
17d20 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
17d30 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 3;.    }.    c
17d40 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
17d50 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
17d60 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
17d70 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38  IDENCE-OF: R-018
17d80 34 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69  49-26079 Value i
17d90 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33  s a big-endian 3
17da0 32 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  2-bit.      ** t
17db0 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
17dc0 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
17dd0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55   pMem->u.i = FOU
17de0 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  R_BYTE_INT(buf);
17df0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
17e00 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
17e10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
17e20 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
17e30 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20     return 4;.   
17e40 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
17e50 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
17e60 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
17e70 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
17e80 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34  F: R-50385-09674
17e90 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
17ea0 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20  endian 48-bit.  
17eb0 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
17ec0 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
17ed0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
17ee0 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55  .i = FOUR_BYTE_U
17ef0 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28  INT(buf+2) + (((
17f00 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
17f10 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
17f20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
17f30 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
17f40 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
17f50 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
17f60 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d   return 6;.    }
17f70 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f  .    case 6:   /
17f80 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
17f90 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
17fa0 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45  ase 7: { /* IEEE
17fb0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
17fc0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73  */.      /* Thes
17fd0 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69  e use local vari
17fe0 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65  ables, so do the
17ff0 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20  m in a separate 
18000 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
18010 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67   to avoid having
18020 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61   to move the fra
18030 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  me pointer in th
18040 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
18050 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65  .      return se
18060 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69  rialGet(buf,seri
18070 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20  al_type,pMem);. 
18080 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
18090 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30      /* Integer 0
180a0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20   */.    case 9: 
180b0 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20  {  /* Integer 1 
180c0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
180d0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36  ENCE-OF: R-12976
180e0 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69 73 20  -22893 Value is 
180f0 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a  the integer 0. *
18100 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
18110 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d  NCE-OF: R-18143-
18120 31 32 31 32 31 20 56 61 6c 75 65 20 69 73 20 74  12121 Value is t
18130 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f  he integer 1. */
18140 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
18150 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38   = serial_type-8
18160 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
18170 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
18180 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
18190 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
181a0 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
181b0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30  DENCE-OF: R-1460
181c0 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69 73  6-31564 Value is
181d0 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20   a BLOB that is 
181e0 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69  (N-12)/2 bytes i
181f0 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74  n.      ** lengt
18200 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  h..      ** EVID
18210 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31  ENCE-OF: R-28401
18220 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69 73 20  -00140 Value is 
18230 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  a string in the 
18240 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e  text encoding an
18250 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33  d.      ** (N-13
18260 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e  )/2 bytes in len
18270 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74  gth. */.      st
18280 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61  atic const u16 a
18290 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42  Flag[] = { MEM_B
182a0 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d  lob|MEM_Ephem, M
182b0 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d  EM_Str|MEM_Ephem
182c0 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   };.      pMem->
182d0 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
182e0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
182f0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
18300 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
18310 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73  >flags = aFlag[s
18320 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20  erial_type&1];. 
18330 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d       return pMem
18340 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ->n;.    }.  }. 
18350 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a   return 0;.}./*.
18360 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18370 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
18380 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ate sufficient s
18390 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61  pace for an Unpa
183a0 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
183b0 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e  ructure large en
183c0 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20  ough to be used 
183d0 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65  with sqlite3Vdbe
183e0 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69  RecordUnpack() i
183f0 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  f.** the first a
18400 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
18410 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20  nter to KeyInfo 
18420 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e  structure pKeyIn
18430 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70  fo..**.** The sp
18440 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c  ace is either al
18450 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71  located using sq
18460 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
18470 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69  () or from withi
18480 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e  n.** the unalign
18490 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ed buffer passed
184a0 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20   via the second 
184b0 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65  and third argume
184c0 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a  nts (presumably.
184d0 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e  ** stack space).
184e0 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20   If the former, 
184f0 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20  then *ppFree is 
18500 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  set to a pointer
18510 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
18520 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
18530 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
18540 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  r using sqlite3D
18550 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20  bFree(). Or, if 
18560 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  the .** allocati
18570 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68  on comes from th
18580 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65  e pSpace/szSpace
18590 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65   buffer, *ppFree
185a0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
185b0 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ** before return
185c0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
185d0 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
185e0 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
185f0 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64  ned..*/.Unpacked
18600 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56  Record *sqlite3V
18610 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
18620 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66  Record(.  KeyInf
18630 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
18640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
18650 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
18660 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72  record */.  char
18670 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20   *pSpace,       
18680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
18690 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61  naligned space a
186a0 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  vailable */.  in
186b0 74 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20  t szSpace,      
186c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
186d0 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b   Size of pSpace[
186e0 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  ] in bytes */.  
186f0 63 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20  char **ppFree   
18700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18710 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73  /* OUT: Caller s
18720 68 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20  hould free this 
18730 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  pointer */.){.  
18740 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
18750 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
18760 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f  /* Unpacked reco
18770 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  rd to return */.
18780 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20    int nOff;     
18790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187a0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70    /* Increment p
187b0 53 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f  Space by nOff to
187c0 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69   align it */.  i
187d0 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
187e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
187f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
18800 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a  s required for *
18810 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61  p */..  /* We wa
18820 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20  nt to shift the 
18830 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75  pointer pSpace u
18840 70 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69  p such that it i
18850 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  s 8-byte aligned
18860 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20  ..  ** Thus, we 
18870 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74  need to calculat
18880 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c  e a value, nOff,
18890 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37   between 0 and 7
188a0 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a  , to shift .  **
188b0 20 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61   it by.  If pSpa
188c0 63 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d  ce is already 8-
188d0 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f  byte aligned, nO
188e0 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72  ff should be zer
188f0 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d  o..  */.  nOff =
18900 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54   (8 - (SQLITE_PT
18910 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29  R_TO_INT(pSpace)
18920 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42   & 7)) & 7;.  nB
18930 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
18940 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
18950 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65  rd)) + sizeof(Me
18960 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  m)*(pKeyInfo->nF
18970 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e  ield+1);.  if( n
18980 42 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66  Byte>szSpace+nOf
18990 66 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e  f ){.    p = (Un
189a0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73  packedRecord *)s
189b0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
189c0 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  w(pKeyInfo->db, 
189d0 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46  nByte);.    *ppF
189e0 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b  ree = (char *)p;
189f0 0a 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65  .    if( !p ) re
18a00 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
18a10 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b  .    p = (Unpack
18a20 65 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63  edRecord*)&pSpac
18a30 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70  e[nOff];.    *pp
18a40 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Free = 0;.  }.. 
18a50 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a   p->aMem = (Mem*
18a60 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
18a70 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
18a80 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
18a90 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
18aa0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
18ab0 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  );.  p->pKeyInfo
18ac0 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
18ad0 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49  ->nField = pKeyI
18ae0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b  nfo->nField + 1;
18af0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
18b00 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
18b10 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69  nKey-byte encodi
18b20 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69  ng of a record i
18b30 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61  n pKey[], popula
18b40 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63  te the .** Unpac
18b50 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74  kedRecord struct
18b60 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  ure indicated by
18b70 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
18b80 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a  ment with the.**
18b90 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
18ba0 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e   decoded record.
18bb0 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
18bc0 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
18bd0 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  k(.  KeyInfo *pK
18be0 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49  eyInfo,     /* I
18bf0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
18c00 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d   the record form
18c10 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  at */.  int nKey
18c20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
18c30 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69  * Size of the bi
18c40 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
18c50 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
18c60 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  y,      /* The b
18c70 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
18c80 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
18c90 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75   *p      /* Popu
18ca0 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74  late this struct
18cb0 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ure before retur
18cc0 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ning. */.){.  co
18cd0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
18ce0 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74  r *aKey = (const
18cf0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
18d00 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20  )pKey;.  int d; 
18d10 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20  .  u32 idx;     
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d30 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
18d40 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66  aKey[] to read f
18d50 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20  rom */.  u16 u; 
18d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d70 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
18d80 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
18d90 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  r */.  u32 szHdr
18da0 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  ;.  Mem *pMem = 
18db0 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64  p->aMem;..  p->d
18dc0 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20  efault_rc = 0;. 
18dd0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
18de0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d  YTE_ALIGNMENT(pM
18df0 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67  em) );.  idx = g
18e00 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
18e10 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73   szHdr);.  d = s
18e20 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20  zHdr;.  u = 0;. 
18e30 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64   while( idx<szHd
18e40 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a  r && d<=nKey ){.
18e50 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
18e60 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d  ype;..    idx +=
18e70 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
18e80 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f  ey[idx], serial_
18e90 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  type);.    pMem-
18ea0 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  >enc = pKeyInfo-
18eb0 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  >enc;.    pMem->
18ec0 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
18ed0 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e  b;.    /* pMem->
18ee0 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71  flags = 0; // sq
18ef0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
18f00 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68  et() will set th
18f10 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  is for us */.   
18f20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20   pMem->szMalloc 
18f30 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a  = 0;.    pMem->z
18f40 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73   = 0;.    d += s
18f50 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18f60 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65  Get(&aKey[d], se
18f70 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29  rial_type, pMem)
18f80 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20  ;.    pMem++;.  
18f90 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e    if( (++u)>=p->
18fa0 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a  nField ) break;.
18fb0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c    }.  assert( u<
18fc0 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  =pKeyInfo->nFiel
18fd0 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46  d + 1 );.  p->nF
18fe0 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66  ield = u;.}..#if
18ff0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
19000 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
19010 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69  n compares two i
19020 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65  ndex or table re
19030 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65  cord keys in the
19040 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20   same way.** as 
19050 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
19060 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72  ecordCompare() r
19070 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56  outine. Unlike V
19080 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
19090 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  (),.** this func
190a0 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65  tion deserialize
190b0 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76  s and compares v
190c0 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a  alues using the.
190d0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
190e0 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71  rialGet() and sq
190f0 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
19100 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20  ) functions. It 
19110 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73  is used.** in as
19120 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
19130 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
19140 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63   the optimized c
19150 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65  ode in.** sqlite
19160 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
19170 72 65 28 29 20 72 65 74 75 72 6e 73 20 72 65 73  re() returns res
19180 75 6c 74 73 20 77 69 74 68 20 74 68 65 73 65 20  ults with these 
19190 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a  two primitives..
191a0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  **.** Return tru
191b0 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  e if the result 
191c0 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  of comparison is
191d0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64   equivalent to d
191e0 65 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a  esiredResult..**
191f0 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
19200 20 74 68 65 72 65 20 69 73 20 61 20 64 69 73 61   there is a disa
19210 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  greement..*/.sta
19220 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f  tic int vdbeReco
19230 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a  rdCompareDebug(.
19240 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
19250 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
19260 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
19270 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52   const UnpackedR
19280 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f  ecord *pPKey2, /
19290 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20  * Right key */. 
192a0 20 69 6e 74 20 64 65 73 69 72 65 64 52 65 73 75   int desiredResu
192b0 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  lt             /
192c0 2a 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72  * Correct answer
192d0 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b   */.){.  u32 d1;
192e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
192f0 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
19300 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
19310 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
19320 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f  idx1;          /
19330 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
19340 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61  ey[] of next hea
19350 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  der element */. 
19360 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20   u32 szHdr1;    
19370 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19380 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72   bytes in header
19390 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   */.  int i = 0;
193a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
193b0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
193c0 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63  char *aKey1 = (c
193d0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
193e0 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65  ar *)pKey1;.  Ke
193f0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
19400 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20  .  Mem mem1;..  
19410 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
19420 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69  2->pKeyInfo;.  i
19430 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d  f( pKeyInfo->db=
19440 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
19450 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
19460 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d  Info->enc;.  mem
19470 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
19480 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66  >db;.  /* mem1.f
19490 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69  lags = 0;  // Wi
194a0 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ll be initialize
194b0 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
194c0 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20  SerialGet() */. 
194d0 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e   VVA_ONLY( mem1.
194e0 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20  szMalloc = 0; ) 
194f0 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62  /* Only needed b
19500 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  y assert() state
19510 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ments */..  /* C
19520 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d  ompilers may com
19530 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e  plain that mem1.
19540 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c  u.i is potential
19550 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ly uninitialized
19560 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ..  ** We could 
19570 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61  initialize it, a
19580 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f  s shown here, to
19590 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63   silence those c
195a0 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20  omplaints..  ** 
195b0 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d  But in fact, mem
195c0 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72  1.u.i will never
195d0 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65   actually be use
195e0 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c  d uninitialized,
195f0 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a   and doing .  **
19600 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79   the unnecessary
19610 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
19620 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65  has a measurable
19630 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72   negative perfor
19640 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63  mance.  ** impac
19650 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f  t, since this ro
19660 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20  utine is a very 
19670 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e  high runner.  An
19680 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a  d so, we choose.
19690 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74    ** to ignore t
196a0 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  he compiler warn
196b0 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74  ings and leave t
196c0 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69  his variable uni
196d0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
196e0 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20  .  /*  mem1.u.i 
196f0 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65  = 0;  // not nee
19700 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c  ded, here to sil
19710 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61  ence compiler wa
19720 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64  rning */.  .  id
19730 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
19740 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
19750 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
19760 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
19770 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49  fo->nField+pKeyI
19780 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50  nfo->nXField>=pP
19790 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20  Key2->nField || 
197a0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
197b0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
197c0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
197d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
197e0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20  yInfo->nField>0 
197f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
19800 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52  1<=szHdr1 || COR
19810 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b  RUPT_DB );.  do{
19820 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
19830 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52  type1;..    /* R
19840 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74  ead the serial t
19850 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78  ypes for the nex
19860 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63  t element in eac
19870 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64  h key. */.    id
19880 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  x1 += getVarint3
19890 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73  2( aKey1+idx1, s
198a0 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a  erial_type1 );..
198b0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
198c0 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  at there is enou
198d0 67 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d  gh key space rem
198e0 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a  aining to avoid.
198f0 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20      ** a buffer 
19900 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22  overread.  The "
19910 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
19920 32 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  2" subexpression
19930 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77   will.    ** alw
19940 61 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74  ays be greater t
19950 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
19960 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65  the amount of re
19970 71 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65  quired key space
19980 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61  ..    ** Use tha
19990 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20  t approximation 
199a0 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72  to avoid the mor
199b0 65 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c  e expensive call
199c0 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
199d0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
199e0 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d  Len() in the com
199f0 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  mon case..    */
19a00 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65 72 69  .    if( d1+seri
19a10 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29  al_type1+2>(u32)
19a20 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31  nKey1.     && d1
19a30 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  +sqlite3VdbeSeri
19a40 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
19a50 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65  _type1)>(u32)nKe
19a60 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  y1 .    ){.     
19a70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
19a80 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
19a90 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63  e values to be c
19aa0 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ompared..    */.
19ab0 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65      d1 += sqlite
19ac0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
19ad0 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
19ae0 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b  l_type1, &mem1);
19af0 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
19b00 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a  comparison.    *
19b10 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
19b20 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65  e3MemCompare(&me
19b30 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65  m1, &pPKey2->aMe
19b40 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  m[i], pKeyInfo->
19b50 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69  aColl[i]);.    i
19b60 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
19b70 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
19b80 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f  zMalloc==0 );  /
19b90 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65  * See comment be
19ba0 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  low */.      if(
19bb0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
19bc0 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20  Order[i] ){.    
19bd0 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f      rc = -rc;  /
19be0 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73  * Invert the res
19bf0 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72  ult for DESC sor
19c00 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20  t order. */.    
19c10 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64    }.      goto d
19c20 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a  ebugCompareEnd;.
19c30 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20      }.    i++;. 
19c40 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a   }while( idx1<sz
19c50 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32  Hdr1 && i<pPKey2
19c60 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f  ->nField );..  /
19c70 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  * No memory allo
19c80 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75  cation is ever u
19c90 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72  sed on mem1.  Pr
19ca0 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20  ove this using. 
19cb0 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
19cc0 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20  g assert().  If 
19cd0 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69  the assert() fai
19ce0 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73  ls, it indicates
19cf0 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c   a.  ** memory l
19d00 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74  eak and a need t
19d10 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  o call sqlite3Vd
19d20 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
19d30 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  m1)..  */.  asse
19d40 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
19d50 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
19d60 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
19d70 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b  hat one of the k
19d80 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
19d90 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
19da0 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
19db0 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
19dc0 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72  ere equal. Retur
19dd0 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63  n the default_rc
19de0 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f  .  ** value.  */
19df0 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e  .  rc = pPKey2->
19e00 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62  default_rc;..deb
19e10 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20  ugCompareEnd:.  
19e20 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
19e30 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20  t==0 && rc==0 ) 
19e40 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
19e50 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20  desiredResult<0 
19e60 26 26 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e  && rc<0 ) return
19e70 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65   1;.  if( desire
19e80 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e  dResult>0 && rc>
19e90 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
19ea0 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
19eb0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
19ec0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d   pKeyInfo->db->m
19ed0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
19ee0 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
19ef0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   0;.}.#endif..#i
19f00 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
19f10 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
19f20 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
19f30 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29  (a.k.a. columns)
19f40 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67   in the record g
19f50 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c  iven by.** pKey,
19f60 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69 66  nKey.  The verif
19f70 79 20 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e  y that this coun
19f80 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  t is less than o
19f90 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a  r equal to the.*
19fa0 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79  * limit given by
19fb0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
19fc0 64 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  d + pKeyInfo->nX
19fd0 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Field..**.** If 
19fe0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
19ff0 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64  is not satisfied
1a000 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1a010 74 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a  the high-speed.*
1a020 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  * vdbeRecordComp
1a030 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62  areInt() and vdb
1a040 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
1a050 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20  ring() routines 
1a060 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b  will.** not work
1a070 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20   correctly.  If 
1a080 74 68 69 73 20 61 73 73 65 72 74 28 29 20 65 76  this assert() ev
1a090 65 72 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f  er fires, it pro
1a0a0 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74  bably means.** t
1a0b0 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e  hat the KeyInfo.
1a0c0 6e 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66  nField or KeyInf
1a0d0 6f 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75 65 73  o.nXField values
1a0e0 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a   were computed.*
1a0f0 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  * incorrectly..*
1a100 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
1a110 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
1a120 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a  ntWithinLimits(.
1a130 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73    int nKey, cons
1a140 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1a150 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f  /* The record to
1a160 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f   verify */ .  co
1a170 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  nst KeyInfo *pKe
1a180 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43  yInfo       /* C
1a190 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74 68  ompare size with
1a1a0 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f   this KeyInfo */
1a1b0 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64  .){.  int nField
1a1c0 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64   = 0;.  u32 szHd
1a1d0 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20  r;.  u32 idx;.  
1a1e0 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63  u32 notUsed;.  c
1a1f0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1a200 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
1a210 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  t unsigned char*
1a220 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f  )pKey;..  if( CO
1a230 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
1a240 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61  n;.  idx = getVa
1a250 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48  rint32(aKey, szH
1a260 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  dr);.  assert( n
1a270 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  Key>=0 );.  asse
1a280 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29  rt( szHdr<=(u32)
1a290 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28  nKey );.  while(
1a2a0 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20   idx<szHdr ){.  
1a2b0 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
1a2c0 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e  nt32(aKey+idx, n
1a2d0 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69  otUsed);.    nFi
1a2e0 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73  eld++;.  }.  ass
1a2f0 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70  ert( nField <= p
1a300 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1a310 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1a320 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  d );.}.#else.# d
1a330 65 66 69 6e 65 20 76 64 62 65 41 73 73 65 72 74  efine vdbeAssert
1a340 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
1a350 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65  Limits(A,B,C).#e
1a360 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68  ndif../*.** Both
1a370 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65   *pMem1 and *pMe
1a380 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e  m2 contain strin
1a390 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72  g values. Compar
1a3a0 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  e the two values
1a3b0 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f  .** using the co
1a3c0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1a3d0 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c   pColl. As usual
1a3e0 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74  , return a negat
1a3f0 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  ive , zero.** or
1a400 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
1a410 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73  if *pMem1 is les
1a420 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1a430 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1a440 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73   .** *pMem2, res
1a450 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c  pectively. Simil
1a460 61 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20  ar in spirit to 
1a470 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d  "rc = (*pMem1) -
1a480 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a   (*pMem2);"..*/.
1a490 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
1a4a0 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
1a4b0 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  .  const Mem *pM
1a4c0 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  em1,.  const Mem
1a4d0 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74   *pMem2,.  const
1a4e0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c   CollSeq *pColl,
1a4f0 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20 20 20  .  u8 *prcErr   
1a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a510 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20     /* If an OOM 
1a520 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53  occurs, set to S
1a530 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29  QLITE_NOMEM */.)
1a540 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65  {.  if( pMem1->e
1a550 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29  nc==pColl->enc )
1a560 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72  {.    /* The str
1a570 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79  ings are already
1a580 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
1a590 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20  encoding.  Call 
1a5a0 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70  the.     ** comp
1a5b0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
1a5c0 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20  directly */.    
1a5d0 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43  return pColl->xC
1a5e0 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
1a5f0 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e  pMem1->n,pMem1->
1a600 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32  z,pMem2->n,pMem2
1a610 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->z);.  }else{. 
1a620 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63     int rc;.    c
1a630 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a  onst void *v1, *
1a640 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20  v2;.    int n1, 
1a650 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a  n2;.    Mem c1;.
1a660 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20      Mem c2;.    
1a670 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1a680 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64  it(&c1, pMem1->d
1a690 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  b, MEM_Null);.  
1a6a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1a6b0 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d  Init(&c2, pMem1-
1a6c0 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
1a6d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1a6e0 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63  emShallowCopy(&c
1a6f0 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70  1, pMem1, MEM_Ep
1a700 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  hem);.    sqlite
1a710 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
1a720 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20  opy(&c2, pMem2, 
1a730 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
1a740 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  v1 = sqlite3Valu
1a750 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76  eText((sqlite3_v
1a760 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c  alue*)&c1, pColl
1a770 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d  ->enc);.    n1 =
1a780 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e   v1==0 ? 0 : c1.
1a790 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69  n;.    v2 = sqli
1a7a0 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
1a7b0 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32  lite3_value*)&c2
1a7c0 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
1a7d0 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20     n2 = v2==0 ? 
1a7e0 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63  0 : c2.n;.    rc
1a7f0 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
1a800 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c  Coll->pUser, n1,
1a810 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20   v1, n2, v2);.  
1a820 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1a830 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20  Release(&c1);.  
1a840 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1a850 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20  Release(&c2);.  
1a860 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20    if( (v1==0 || 
1a870 76 32 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72  v2==0) && prcErr
1a880 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c   ) *prcErr = SQL
1a890 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72  ITE_NOMEM;.    r
1a8a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a  eturn rc;.  }.}.
1a8b0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1a8c0 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72  wo blobs.  Retur
1a8d0 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  n negative, zero
1a8e0 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
1a8f0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73   the first.** is
1a900 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1a910 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
1a920 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64   than the second
1a930 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
1a940 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69  ** If one blob i
1a950 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
1a960 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68  e other, then th
1a970 65 20 73 68 6f 72 74 65 72 20 69 73 20 74 68 65  e shorter is the
1a980 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   lessor..*/.stat
1a990 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
1a9a0 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c  NE int sqlite3Bl
1a9b0 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  obCompare(const 
1a9c0 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20  Mem *pB1, const 
1a9d0 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74  Mem *pB2){.  int
1a9e0 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d   c = memcmp(pB1-
1a9f0 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d  >z, pB2->z, pB1-
1aa00 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d  >n>pB2->n ? pB2-
1aa10 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20  >n : pB1->n);.  
1aa20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63  if( c ) return c
1aa30 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e  ;.  return pB1->
1aa40 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 0a  n - pB2->n;.}...
1aa50 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
1aa60 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e  e values contain
1aa70 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65  ed by the two me
1aa80 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75  mory cells, retu
1aa90 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76  rning.** negativ
1aaa0 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74  e, zero or posit
1aab0 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20  ive if pMem1 is 
1aac0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1aad0 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a   to, or greater.
1aae0 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53  ** than pMem2. S
1aaf0 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20  orting order is 
1ab00 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f  NULL's first, fo
1ab10 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72  llowed by number
1ab20 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61  s (integers.** a
1ab30 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64  nd reals) sorted
1ab40 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f   numerically, fo
1ab50 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f  llowed by text o
1ab60 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f  rdered by the co
1ab70 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
1ab80 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69  nce pColl and fi
1ab90 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64  nally blob's ord
1aba0 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29  ered by memcmp()
1abb0 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
1abc0 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73   values are cons
1abd0 69 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20  idered equal by 
1abe0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
1abf0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d  /.int sqlite3Mem
1ac00 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65  Compare(const Me
1ac10 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20  m *pMem1, const 
1ac20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73  Mem *pMem2, cons
1ac30 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  t CollSeq *pColl
1ac40 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b  ){.  int f1, f2;
1ac50 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f  .  int combined_
1ac60 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70  flags;..  f1 = p
1ac70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66  Mem1->flags;.  f
1ac80 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73  2 = pMem2->flags
1ac90 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  ;.  combined_fla
1aca0 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73  gs = f1|f2;.  as
1acb0 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f  sert( (combined_
1acc0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
1acd0 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a  et)==0 );. .  /*
1ace0 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
1acf0 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73   NULL, it is les
1ad00 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72  s than the other
1ad10 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73  . If both values
1ad20 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20  .  ** are NULL, 
1ad30 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20  return 0..  */. 
1ad40 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1ad50 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
1ad60 20 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d      return (f2&M
1ad70 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d  EM_Null) - (f1&M
1ad80 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20  EM_Null);.  }.. 
1ad90 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
1ada0 20 69 73 20 61 20 6e 75 6d 62 65 72 20 61 6e 64   is a number and
1adb0 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f   the other is no
1adc0 74 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 69 73  t, the number is
1add0 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62   less..  ** If b
1ade0 6f 74 68 20 61 72 65 20 6e 75 6d 62 65 72 73 2c  oth are numbers,
1adf0 20 63 6f 6d 70 61 72 65 20 61 73 20 72 65 61 6c   compare as real
1ae00 73 20 69 66 20 6f 6e 65 20 69 73 20 61 20 72 65  s if one is a re
1ae10 61 6c 2c 20 6f 72 20 61 73 20 69 6e 74 65 67 65  al, or as intege
1ae20 72 73 0a 20 20 2a 2a 20 69 66 20 62 6f 74 68 20  rs.  ** if both 
1ae30 76 61 6c 75 65 73 20 61 72 65 20 69 6e 74 65 67  values are integ
1ae40 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ers..  */.  if( 
1ae50 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28  combined_flags&(
1ae60 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
1ae70 29 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  ) ){.    double 
1ae80 72 31 2c 20 72 32 3b 0a 20 20 20 20 69 66 28 20  r1, r2;.    if( 
1ae90 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49  (f1 & f2 & MEM_I
1aea0 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
1aeb0 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c  if( pMem1->u.i <
1aec0 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65   pMem2->u.i ) re
1aed0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69  turn -1;.      i
1aee0 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20  f( pMem1->u.i > 
1aef0 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
1af00 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 72 65 74  urn 1;.      ret
1af10 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1af20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61   if( (f1&MEM_Rea
1af30 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  l)!=0 ){.      r
1af40 31 20 3d 20 70 4d 65 6d 31 2d 3e 75 2e 72 3b 0a  1 = pMem1->u.r;.
1af50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66      }else if( (f
1af60 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  1&MEM_Int)!=0 ){
1af70 0a 20 20 20 20 20 20 72 31 20 3d 20 28 64 6f 75  .      r1 = (dou
1af80 62 6c 65 29 70 4d 65 6d 31 2d 3e 75 2e 69 3b 0a  ble)pMem1->u.i;.
1af90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1afa0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1afb0 0a 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d  .    if( (f2&MEM
1afc0 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
1afd0 20 20 20 72 32 20 3d 20 70 4d 65 6d 32 2d 3e 75     r2 = pMem2->u
1afe0 2e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  .r;.    }else if
1aff0 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d  ( (f2&MEM_Int)!=
1b000 30 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20  0 ){.      r2 = 
1b010 28 64 6f 75 62 6c 65 29 70 4d 65 6d 32 2d 3e 75  (double)pMem2->u
1b020 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  .i;.    }else{. 
1b030 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1b040 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 31      }.    if( r1
1b050 3c 72 32 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  <r2 ) return -1;
1b060 0a 20 20 20 20 69 66 28 20 72 31 3e 72 32 20 29  .    if( r1>r2 )
1b070 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72   return 1;.    r
1b080 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
1b090 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
1b0a0 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20  is a string and 
1b0b0 74 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62  the other is a b
1b0c0 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20  lob, the string 
1b0d0 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66  is less..  ** If
1b0e0 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67   both are string
1b0f0 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67  s, compare using
1b100 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66   the collating f
1b110 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  unctions..  */. 
1b120 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1b130 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  ags&MEM_Str ){. 
1b140 20 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d     if( (f1 & MEM
1b150 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _Str)==0 ){.    
1b160 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1b170 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20  }.    if( (f2 & 
1b180 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20  MEM_Str)==0 ){. 
1b190 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1b1a0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
1b1b0 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  t( pMem1->enc==p
1b1c0 4d 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20  Mem2->enc );.   
1b1d0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e   assert( pMem1->
1b1e0 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc==SQLITE_UTF8
1b1f0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
1b200 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
1b210 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70  ITE_UTF16LE || p
1b220 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
1b230 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20  E_UTF16BE );..  
1b240 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
1b250 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74  on sequence must
1b260 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74   be defined at t
1b270 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20  his point, even 
1b280 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73  if.    ** the us
1b290 65 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63  er deletes the c
1b2a0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1b2b0 65 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65  e after the vdbe
1b2c0 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20   program is.    
1b2d0 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69  ** compiled (thi
1b2e0 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73  s was not always
1b2f0 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20   the case)..    
1b300 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
1b310 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e  pColl || pColl->
1b320 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28  xCmp );..    if(
1b330 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
1b340 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61  return vdbeCompa
1b350 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d  reMemString(pMem
1b360 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c  1, pMem2, pColl,
1b370 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f   0);.    }.    /
1b380 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  * If a NULL poin
1b390 74 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61  ter was passed a
1b3a0 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75  s the collate fu
1b3b0 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72  nction, fall thr
1b3c0 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ough.    ** to t
1b3d0 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64  he blob case and
1b3e0 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20   use memcmp().  
1b3f0 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f  */.  }. .  /* Bo
1b400 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  th values must b
1b410 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72  e blobs.  Compar
1b420 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29  e using memcmp()
1b430 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  .  */.  return s
1b440 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72  qlite3BlobCompar
1b450 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b  e(pMem1, pMem2);
1b460 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .}.../*.** The f
1b470 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
1b480 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
1b490 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61  ction is a seria
1b4a0 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63  l-type that.** c
1b4b0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
1b4c0 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76   integer - all v
1b4d0 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20  alues between 1 
1b4e0 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20  and 9 inclusive 
1b4f0 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68  .** except 7. Th
1b500 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20  e second points 
1b510 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
1b520 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65  aining an intege
1b530 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61  r value.** seria
1b540 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20  lized according 
1b550 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20  to serial_type. 
1b560 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
1b570 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e  serializes.** an
1b580 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61  d returns the va
1b590 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
1b5a0 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63  64 vdbeRecordDec
1b5b0 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61  odeInt(u32 seria
1b5c0 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38  l_type, const u8
1b5d0 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79   *aKey){.  u32 y
1b5e0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
1b5f0 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61  UPT_DB || (seria
1b600 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72  l_type>=1 && ser
1b610 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73  ial_type<=9 && s
1b620 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29  erial_type!=7) )
1b630 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  ;.  switch( seri
1b640 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
1b650 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20  ase 0:.    case 
1b660 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  1:.      testcas
1b670 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1b680 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1b690 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  ONE_BYTE_INT(aKe
1b6a0 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a  y);.    case 2:.
1b6b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b6c0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1b6d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f        return TWO
1b6e0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1b6f0 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20  .    case 3:.   
1b700 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1b710 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1b720 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f     return THREE_
1b730 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1b740 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20      case 4: {.  
1b750 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1b760 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1b770 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54      y = FOUR_BYT
1b780 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1b790 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29      return (i64)
1b7a0 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d  *(int*)&y;.    }
1b7b0 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20  .    case 5: {. 
1b7c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1b7d0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1b7e0 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52       return FOUR
1b7f0 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1b800 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
1b810 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
1b820 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20  (aKey);.    }.  
1b830 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20    case 6: {.    
1b840 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
1b850 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1b860 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1b870 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1b880 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
1b890 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ) | FOUR_BYTE_UI
1b8a0 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20  NT(aKey+4);.    
1b8b0 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28    return (i64)*(
1b8c0 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20  i64*)&x;.    }. 
1b8d0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65   }..  return (se
1b8e0 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a  rial_type - 8);.
1b8f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1b900 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
1b910 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f  the two table ro
1b920 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f  ws or index reco
1b930 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  rds.** specified
1b940 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   by {nKey1, pKey
1b950 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20  1} and pPKey2.  
1b960 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67  It returns a neg
1b970 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  ative, zero.** o
1b980 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  r positive integ
1b990 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65  er if key1 is le
1b9a0 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1b9b0 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72  o or .** greater
1b9c0 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65   than key2.  The
1b9d0 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
1b9e0 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c  key must be a bl
1b9f0 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79  ob.** created by
1ba00 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
1ba10 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65  rd opcode of the
1ba20 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65   VDBE.  The pPKe
1ba30 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62  y2.** key must b
1ba40 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73  e a parsed key s
1ba50 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20  uch as obtained 
1ba60 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56  from.** sqlite3V
1ba70 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a  dbeParseRecord..
1ba80 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
1ba90 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  t bSkip is non-z
1baa0 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
1bab0 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
1bac0 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  er has already.*
1bad0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  * determined tha
1bae0 74 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  t the first fiel
1baf0 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61  ds of the keys a
1bb00 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20  re equal..**.** 
1bb10 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
1bb20 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
1bb30 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
1bb40 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20  mber of fields. 
1bb50 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64  If all .** field
1bb60 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
1bb70 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65   both keys are e
1bb80 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79  qual, then pPKey
1bb90 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73  2->default_rc is
1bba0 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a   .** returned..*
1bbb0 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65  *.** If database
1bbc0 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
1bbd0 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70  iscovered, set p
1bbe0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74  PKey2->errCode t
1bbf0 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  o .** SQLITE_COR
1bc00 52 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20  RUPT and return 
1bc10 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  0. If an OOM err
1bc20 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1bc30 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65  d, .** pPKey2->e
1bc40 72 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f  rrCode is set to
1bc50 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e   SQLITE_NOMEM an
1bc60 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  d, if it is not 
1bc70 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c  NULL, the.** mal
1bc80 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20  loc-failed flag 
1bc90 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20  set on database 
1bca0 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e  handle (pPKey2->
1bcb0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a  pKeyInfo->db)..*
1bcc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
1bcd0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
1bce0 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b  thSkip(.  int nK
1bcf0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1bd00 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66  *pKey1,   /* Lef
1bd10 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
1bd20 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1bd30 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69  2,         /* Ri
1bd40 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ght key */.  int
1bd50 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20   bSkip          
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd70 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68  If true, skip th
1bd80 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f  e first field */
1bd90 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20  .){.  u32 d1;   
1bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdb0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1bdc0 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
1bdd0 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
1bde0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be00 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1be10 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20  f next field to 
1be20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32  compare */.  u32
1be30 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
1be40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1be50 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68  Size of record h
1be60 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a  eader in bytes *
1be70 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
1be80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be90 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
1bea0 20 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68   first type in h
1beb0 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  eader */.  int r
1bec0 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
1bed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1bee0 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  turn value */.  
1bef0 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65  Mem *pRhs = pPKe
1bf00 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20  y2->aMem;       
1bf10 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66  /* Next field of
1bf20 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61   pPKey2 to compa
1bf30 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  re */.  KeyInfo 
1bf40 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65  *pKeyInfo = pPKe
1bf50 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
1bf60 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1bf70 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
1bf80 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1bf90 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d  r *)pKey1;.  Mem
1bfa0 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20   mem1;..  /* If 
1bfb0 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74  bSkip is true, t
1bfc0 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hen the caller h
1bfd0 61 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72  as already deter
1bfe0 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66  mined that the f
1bff0 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c  irst.  ** two el
1c000 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65  ements in the ke
1c010 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69  ys are equal. Fi
1c020 78 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  x the various st
1c030 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f  ack variables so
1c040 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20  .  ** that this 
1c050 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63  routine begins c
1c060 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20  omparing at the 
1c070 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f  second field. */
1c080 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a  .  if( bSkip ){.
1c090 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20      u32 s1;.    
1c0a0 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61  idx1 = 1 + getVa
1c0b0 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d  rint32(&aKey1[1]
1c0c0 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72  , s1);.    szHdr
1c0d0 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20  1 = aKey1[0];.  
1c0e0 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20    d1 = szHdr1 + 
1c0f0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1c100 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20  lTypeLen(s1);.  
1c110 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68    i = 1;.    pRh
1c120 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s++;.  }else{.  
1c130 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
1c140 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
1c150 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a  r1);.    d1 = sz
1c160 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31  Hdr1;.    if( d1
1c170 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  >(unsigned)nKey1
1c180 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79   ){ .      pPKey
1c190 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1c1a0 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1c1b0 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
1c1c0 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70  rn 0;  /* Corrup
1c1d0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  tion */.    }.  
1c1e0 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20    i = 0;.  }..  
1c1f0 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73  VVA_ONLY( mem1.s
1c200 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
1c210 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
1c220 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1c230 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ents */.  assert
1c240 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1c250 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79  fo->nField+pPKey
1c260 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46  2->pKeyInfo->nXF
1c270 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46  ield>=pPKey2->nF
1c280 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20  ield .       || 
1c290 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1c2a0 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
1c2b0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1c2c0 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rder!=0 );.  ass
1c2d0 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1c2e0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20  yInfo->nField>0 
1c2f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
1c300 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52  1<=szHdr1 || COR
1c310 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b  RUPT_DB );.  do{
1c320 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
1c330 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48  type;..    /* RH
1c340 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  S is an integer 
1c350 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d  */.    if( pRhs-
1c360 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
1c370 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c   ){.      serial
1c380 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1c390 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  x1];.      testc
1c3a0 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1c3b0 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1c3c0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
1c3d0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  2 ){.        rc 
1c3e0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1c3f0 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1c400 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1c410 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1c420 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1c430 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
1c440 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20     double rhs = 
1c450 28 64 6f 75 62 6c 65 29 70 52 68 73 2d 3e 75 2e  (double)pRhs->u.
1c460 69 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  i;.        sqlit
1c470 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1c480 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
1c490 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b  al_type, &mem1);
1c4a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d  .        if( mem
1c4b0 31 2e 75 2e 72 3c 72 68 73 20 29 7b 0a 20 20 20  1.u.r<rhs ){.   
1c4c0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1c4d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1c4e0 28 20 6d 65 6d 31 2e 75 2e 72 3e 72 68 73 20 29  ( mem1.u.r>rhs )
1c4f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1c500 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1c510 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c520 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64      i64 lhs = vd
1c530 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e  beRecordDecodeIn
1c540 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  t(serial_type, &
1c550 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20  aKey1[d1]);.    
1c560 20 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52      i64 rhs = pR
1c570 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20  hs->u.i;.       
1c580 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a   if( lhs<rhs ){.
1c590 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
1c5a0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1c5b0 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a   if( lhs>rhs ){.
1c5c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b            rc = +
1c5d0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1c5e0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1c5f0 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a  /* RHS is real *
1c600 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1c610 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1c620 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  _Real ){.      s
1c630 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
1c640 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
1c650 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1c660 3d 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =12 ){.        r
1c670 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1c680 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1c690 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
1c6a0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1c6b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c6c0 64 6f 75 62 6c 65 20 72 68 73 20 3d 20 70 52 68  double rhs = pRh
1c6d0 73 2d 3e 75 2e 72 3b 0a 20 20 20 20 20 20 20 20  s->u.r;.        
1c6e0 64 6f 75 62 6c 65 20 6c 68 73 3b 0a 20 20 20 20  double lhs;.    
1c6f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
1c700 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1c710 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1c720 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20  , &mem1);.      
1c730 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1c740 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1c750 20 20 6c 68 73 20 3d 20 6d 65 6d 31 2e 75 2e 72    lhs = mem1.u.r
1c760 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1c770 0a 20 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d  .          lhs =
1c780 20 28 64 6f 75 62 6c 65 29 6d 65 6d 31 2e 75 2e   (double)mem1.u.
1c790 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  i;.        }.   
1c7a0 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73       if( lhs<rhs
1c7b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1c7c0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1c7d0 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73  else if( lhs>rhs
1c7e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1c7f0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1c800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1c810 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20      /* RHS is a 
1c820 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c  string */.    el
1c830 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1c840 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
1c850 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
1c860 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
1c870 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1c880 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
1c890 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
1c8a0 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1c8b0 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
1c8c0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1c8d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
1c8e0 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1c8f0 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1c900 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1c910 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
1c920 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  1.n = (serial_ty
1c930 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20  pe - 12) / 2;.  
1c940 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c950 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e  (d1+mem1.n)==(un
1c960 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1c970 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1c980 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d  ( (d1+mem1.n+1)=
1c990 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1c9a0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1c9b0 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75  (d1+mem1.n) > (u
1c9c0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1c9d0 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
1c9e0 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1c9f0 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1ca00 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1ca10 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1ca20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1ca30 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1ca40 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79    }else if( pKey
1ca50 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  Info->aColl[i] )
1ca60 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  {.          mem1
1ca70 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
1ca80 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  >enc;.          
1ca90 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
1caa0 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  fo->db;.        
1cab0 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d    mem1.flags = M
1cac0 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20  EM_Str;.        
1cad0 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72    mem1.z = (char
1cae0 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20  *)&aKey1[d1];.  
1caf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
1cb00 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1cb10 67 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g(.             
1cb20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b   &mem1, pRhs, pK
1cb30 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1cb40 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  , &pPKey2->errCo
1cb50 64 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  de.          );.
1cb60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1cb70 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
1cb80 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20  p = MIN(mem1.n, 
1cb90 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
1cba0 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
1cbb0 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
1cbc0 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
1cbd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
1cbe0 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20  ) rc = mem1.n - 
1cbf0 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20  pRhs->n; .      
1cc00 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1cc10 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1cc20 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65   a blob */.    e
1cc30 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
1cc40 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
1cc50 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  {.      getVarin
1cc60 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
1cc70 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1cc80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1cc90 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1cca0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1ccb0 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28  ial_type<12 || (
1ccc0 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1ccd0 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1cce0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1ccf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1cd00 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
1cd10 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
1cd20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1cd30 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e  ( (d1+nStr)==(un
1cd40 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1cd50 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1cd60 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28  ( (d1+nStr+1)==(
1cd70 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1cd80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64  ;.        if( (d
1cd90 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67  1+nStr) > (unsig
1cda0 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
1cdb0 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
1cdc0 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1cdd0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1cde0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1cdf0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1ce00 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1ce10 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1ce20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1ce30 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53  nt nCmp = MIN(nS
1ce40 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  tr, pRhs->n);.  
1ce50 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
1ce60 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
1ce70 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
1ce80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1ce90 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20  ==0 ) rc = nStr 
1cea0 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20  - pRhs->n;.     
1ceb0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1cec0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1ced0 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c  s null */.    el
1cee0 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c  se{.      serial
1cef0 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1cf00 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x1];.      rc = 
1cf10 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29  (serial_type!=0)
1cf20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1cf30 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1cf40 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
1cf50 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
1cf60 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
1cf70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1cf80 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
1cf90 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1cfa0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1cfb0 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20  y2, rc) );.     
1cfc0 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
1cfd0 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
1cfe0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
1cff0 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
1d000 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
1d010 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b    i++;.    pRhs+
1d020 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  +;.    d1 += sql
1d030 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1d040 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
1d050 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20  e);.    idx1 += 
1d060 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e  sqlite3VarintLen
1d070 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
1d080 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75   }while( idx1<(u
1d090 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26  nsigned)szHdr1 &
1d0a0 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
1d0b0 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67  ld && d1<=(unsig
1d0c0 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20  ned)nKey1 );..  
1d0d0 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
1d0e0 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
1d0f0 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
1d100 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
1d110 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
1d120 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
1d130 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
1d140 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
1d150 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
1d160 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
1d170 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
1d180 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1d190 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  em1).  */.  asse
1d1a0 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1d1b0 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
1d1c0 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
1d1d0 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20  hat one or both 
1d1e0 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
1d1f0 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
1d200 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
1d210 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
1d220 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
1d230 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  l. Return the de
1d240 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61  fault_rc.  ** va
1d250 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  lue.  */.  asser
1d260 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20  t( CORRUPT_DB . 
1d270 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63        || vdbeRec
1d280 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1d290 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1d2a0 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65  Key2, pPKey2->de
1d2b0 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20  fault_rc) .     
1d2c0 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64    || pKeyInfo->d
1d2d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
1d2e0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50    );.  return pP
1d2f0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1d300 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1d310 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1d320 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1d330 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1d340 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  ,   /* Left key 
1d350 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1d360 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
1d370 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
1d380 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  y */.){.  return
1d390 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1d3a0 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
1d3b0 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
1d3c0 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a  pPKey2, 0);.}...
1d3d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1d3e0 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ion is an optimi
1d3f0 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  zed version of s
1d400 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1d410 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68  Compare() .** th
1d420 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74  at (a) the first
1d430 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32   field of pPKey2
1d440 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   is an integer, 
1d450 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20  and (b) the .** 
1d460 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
1d470 61 72 69 6e 74 20 61 74 20 74 68 65 20 73 74 61  arint at the sta
1d480 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
1d490 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
1d4a0 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e  ngle.** byte (i.
1d4b0 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  e. is less than 
1d4c0 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  128)..**.** To a
1d4d0 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62  void concerns ab
1d4e0 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65 72 72  out buffer overr
1d4f0 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69  eads, this routi
1d500 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a  ne is only used.
1d510 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68  ** on schemas wh
1d520 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ere the maximum 
1d530 76 61 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a  valid header siz
1d540 65 20 69 73 20 36 33 20 62 79 74 65 73 20 6f 72  e is 63 bytes or
1d550 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   less..*/.static
1d560 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
1d570 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74  ompareInt(.  int
1d580 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1d590 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
1d5a0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1d5b0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1d5c0 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
1d5d0 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63  ht key */.){.  c
1d5e0 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20  onst u8 *aKey = 
1d5f0 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  &((const u8*)pKe
1d600 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29  y1)[*(const u8*)
1d610 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20  pKey1 & 0x3F];. 
1d620 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65   int serial_type
1d630 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70   = ((const u8*)p
1d640 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20  Key1)[1];.  int 
1d650 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20  res;.  u32 y;.  
1d660 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76 20 3d  u64 x;.  i64 v =
1d670 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1d680 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b  .u.i;.  i64 lhs;
1d690 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ..  vdbeAssertFi
1d6a0 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1d6b0 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
1d6c0 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
1d6d0 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
1d6e0 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30  (*(u8*)pKey1)<=0
1d6f0 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  x3F || CORRUPT_D
1d700 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  B );.  switch( s
1d710 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
1d720 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31    case 1: { /* 1
1d730 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1d740 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
1d750 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  s = ONE_BYTE_INT
1d760 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1d770 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1d780 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d790 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
1d7a0 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
1d7b0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1d7c0 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59      lhs = TWO_BY
1d7d0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1d7e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1d7f0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1d800 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1d810 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
1d820 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1d830 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1d840 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61  THREE_BYTE_INT(a
1d850 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1d860 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1d870 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d880 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
1d890 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
1d8a0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1d8b0 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    y = FOUR_BYTE_
1d8c0 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1d8d0 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69    lhs = (i64)*(i
1d8e0 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65  nt*)&y;.      te
1d8f0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1d900 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d910 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
1d920 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
1d930 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1d940 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42      lhs = FOUR_B
1d950 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29  YTE_UINT(aKey+2)
1d960 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
1d970 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  )*TWO_BYTE_INT(a
1d980 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1d990 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1d9a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d9b0 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20  }.    case 6: { 
1d9c0 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
1d9d0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1d9e0 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    x = FOUR_BYTE_
1d9f0 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1da00 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
1da10 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1da20 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68  Key+4);.      lh
1da30 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  s = *(i64*)&x;. 
1da40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1da50 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1da60 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1da70 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68  ase 8: .      lh
1da80 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  s = 0;.      bre
1da90 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a  ak;.    case 9:.
1daa0 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20        lhs = 1;. 
1dab0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
1dac0 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f   /* This case co
1dad0 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77  uld be removed w
1dae0 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
1daf0 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72  the results of r
1db00 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  unning.    ** th
1db10 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69  is code. Includi
1db20 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63  ng it causes gcc
1db30 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66   to generate a f
1db40 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20  aster switch .  
1db50 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28    ** statement (
1db60 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20  since the range 
1db70 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74  of switch target
1db80 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20  s now starts at 
1db90 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20  zero and.    ** 
1dba0 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62  is contiguous) b
1dbb0 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  ut does not caus
1dbc0 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20  e any duplicate 
1dbd0 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72  code to be gener
1dbe0 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20  ated.    ** (as 
1dbf0 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e  gcc is clever en
1dc00 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20  ough to combine 
1dc10 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73  the two like cas
1dc20 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20  es). Other .    
1dc30 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67  ** compilers mig
1dc40 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20  ht be similar.  
1dc50 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20  */ .    case 0: 
1dc60 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65  case 7:.      re
1dc70 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1dc80 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b  RecordCompare(nK
1dc90 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1dca0 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  y2);..    defaul
1dcb0 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
1dcc0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1dcd0 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20  dCompare(nKey1, 
1dce0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a  pKey1, pPKey2);.
1dcf0 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68 73    }..  if( v>lhs
1dd00 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
1dd10 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73  Key2->r1;.  }els
1dd20 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20  e if( v<lhs ){. 
1dd30 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1dd40 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >r2;.  }else if(
1dd50 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e   pPKey2->nField>
1dd60 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  1 ){.    /* The 
1dd70 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
1dd80 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65  the two keys are
1dd90 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20   equal. Compare 
1dda0 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20  the trailing .  
1ddb0 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f    ** fields.  */
1ddc0 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74  .    res = sqlit
1ddd0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1dde0 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
1ddf0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1de00 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
1de10 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
1de20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77  fields of the tw
1de30 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  o keys are equal
1de40 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
1de50 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a  o trailing.    *
1de60 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e  * fields. Return
1de70 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1de80 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  _rc in this case
1de90 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70  . */.    res = p
1dea0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1deb0 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  c;.  }..  assert
1dec0 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
1ded0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1dee0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
1def0 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  es) );.  return 
1df00 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  res;.}../*.** Th
1df10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1df20 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73  n optimized vers
1df30 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
1df40 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1df50 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74  ) .** that (a) t
1df60 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f  he first field o
1df70 66 20 70 50 4b 65 79 32 20 69 73 20 61 20 73 74  f pPKey2 is a st
1df80 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74  ring, that (b) t
1df90 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a  he first field.*
1dfa0 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61  * uses the colla
1dfb0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49  tion sequence BI
1dfc0 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74 68 61  NARY and (c) tha
1dfd0 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65  t the size-of-he
1dfe0 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20  ader varint .** 
1dff0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1e000 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69  (pKey1/nKey1) fi
1e010 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62  ts in a single b
1e020 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  yte..*/.static i
1e030 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1e040 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e  pareString(.  in
1e050 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1e060 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
1e070 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1e080 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1e090 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69  ey2        /* Ri
1e0a0 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
1e0b0 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20  const u8 *aKey1 
1e0c0 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  = (const u8*)pKe
1e0d0 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c  y1;.  int serial
1e0e0 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73  _type;.  int res
1e0f0 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46  ;..  vdbeAssertF
1e100 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
1e110 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65  imits(nKey1, pKe
1e120 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  y1, pPKey2->pKey
1e130 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69  Info);.  getVari
1e140 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20  nt32(&aKey1[1], 
1e150 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1e160 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1e170 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  12 ){.    res = 
1e180 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20  pPKey2->r1;     
1e190 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   /* (pKey1/nKey1
1e1a0 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72  ) is a number or
1e1b0 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c   a null */.  }el
1e1c0 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f  se if( !(serial_
1e1d0 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20  type & 0x01) ){ 
1e1e0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
1e1f0 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28  2->r2;      /* (
1e200 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20  pKey1/nKey1) is 
1e210 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73  a blob */.  }els
1e220 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b  e{.    int nCmp;
1e230 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20  .    int nStr;. 
1e240 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61     int szHdr = a
1e250 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53  Key1[0];..    nS
1e260 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  tr = (serial_typ
1e270 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69  e-12) / 2;.    i
1e280 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72  f( (szHdr + nStr
1e290 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ) > nKey1 ){.   
1e2a0 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1e2b0 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1e2c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1e2d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1e2e0 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1e2f0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70  /.    }.    nCmp
1e300 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e   = MIN( pPKey2->
1e310 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20  aMem[0].n, nStr 
1e320 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d  );.    res = mem
1e330 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72  cmp(&aKey1[szHdr
1e340 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  ], pPKey2->aMem[
1e350 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20  0].z, nCmp);..  
1e360 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
1e370 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72        res = nStr
1e380 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b   - pPKey2->aMem[
1e390 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  0].n;.      if( 
1e3a0 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
1e3b0 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46    if( pPKey2->nF
1e3c0 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20  ield>1 ){.      
1e3d0 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
1e3e0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1e3f0 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31  reWithSkip(nKey1
1e400 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1e410 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   1);.        }el
1e420 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
1e430 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  s = pPKey2->defa
1e440 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20  ult_rc;.        
1e450 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
1e460 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20  ( res>0 ){.     
1e470 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1e480 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >r2;.      }else
1e490 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
1e4a0 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20  pPKey2->r1;.    
1e4b0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
1e4c0 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20  ( res>0 ){.     
1e4d0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1e4e0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
1e4f0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1e500 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ->r1;.    }.  }.
1e510 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52  .  assert( vdbeR
1e520 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1e530 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
1e540 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20  pPKey2, res).   
1e550 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
1e560 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65  B.       || pPKe
1e570 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  y2->pKeyInfo->db
1e580 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20  ->mallocFailed. 
1e590 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73   );.  return res
1e5a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1e5b0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
1e5c0 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
1e5d0 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d  ordCompare() com
1e5e0 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e  patible function
1e5f0 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72  .** suitable for
1e600 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61   comparing seria
1e610 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f  lized records to
1e620 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65   the unpacked re
1e630 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61  cord passed.** a
1e640 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
1e650 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f  ent..*/.RecordCo
1e660 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56 64 62  mpare sqlite3Vdb
1e670 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70  eFindCompare(Unp
1e680 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b  ackedRecord *p){
1e690 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f  .  /* varintReco
1e6a0 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61  rdCompareInt() a
1e6b0 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  nd varintRecordC
1e6c0 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 62  ompareString() b
1e6d0 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20  oth assume.  ** 
1e6e0 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66  that the size-of
1e6f0 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 74  -header varint t
1e700 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68  hat occurs at th
1e710 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20  e start of each 
1e720 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73  record.  ** fits
1e730 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74   in a single byt
1e740 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f  e (i.e. is 127 o
1e750 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52  r less). varintR
1e760 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
1e770 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75  ).  ** also assu
1e780 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73  mes that it is s
1e790 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20  afe to overread 
1e7a0 61 20 62 75 66 66 65 72 20 62 79 20 61 74 20 6c  a buffer by at l
1e7b0 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d  east the .  ** m
1e7c0 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20  aximum possible 
1e7d0 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a  legal header siz
1e7e0 65 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20  e plus 8 bytes. 
1e7f0 42 65 63 61 75 73 65 20 74 68 65 72 65 20 69 73  Because there is
1e800 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64  .  ** guaranteed
1e810 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20   to be at least 
1e820 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29  74 (but not 136)
1e830 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e   bytes of paddin
1e840 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68  g following each
1e850 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73  .  ** buffer pas
1e860 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63  sed to varintRec
1e870 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
1e880 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f  this makes it co
1e890 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a  nvenient to.  **
1e8a0 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20   limit the size 
1e8b0 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 74 6f  of the header to
1e8c0 20 36 34 20 62 79 74 65 73 20 69 6e 20 63 61 73   64 bytes in cas
1e8d0 65 73 20 77 68 65 72 65 20 74 68 65 20 66 69 72  es where the fir
1e8e0 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73  st field.  ** is
1e8f0 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a   an integer..  *
1e900 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65  *.  ** The easie
1e910 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63  st way to enforc
1e920 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20  e this limit is 
1e930 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79  to consider only
1e940 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20   records with.  
1e950 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20  ** 13 fields or 
1e960 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66 69 72  less. If the fir
1e970 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69  st field is an i
1e980 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69  nteger, the maxi
1e990 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68  mum legal.  ** h
1e9a0 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 28 31  eader size is (1
1e9b0 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74  2*5 + 1 + 1) byt
1e9c0 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  es.  */.  if( (p
1e9d0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ->pKeyInfo->nFie
1e9e0 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  ld + p->pKeyInfo
1e9f0 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20 29  ->nXField)<=13 )
1ea00 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  {.    int flags 
1ea10 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61  = p->aMem[0].fla
1ea20 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  gs;.    if( p->p
1ea30 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1ea40 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  der[0] ){.      
1ea50 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20  p->r1 = 1;.     
1ea60 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20   p->r2 = -1;.   
1ea70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
1ea80 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  >r1 = -1;.      
1ea90 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d  p->r2 = 1;.    }
1eaa0 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
1eab0 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20  & MEM_Int) ){.  
1eac0 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52      return vdbeR
1ead0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b  ecordCompareInt;
1eae0 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1eaf0 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
1eb00 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  _Real );.    tes
1eb10 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
1eb20 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74  EM_Null );.    t
1eb30 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
1eb40 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20   MEM_Blob );.   
1eb50 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d   if( (flags & (M
1eb60 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c  EM_Real|MEM_Null
1eb70 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26  |MEM_Blob))==0 &
1eb80 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  & p->pKeyInfo->a
1eb90 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  Coll[0]==0 ){.  
1eba0 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
1ebb0 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20  s & MEM_Str );. 
1ebc0 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
1ebd0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
1ebe0 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ing;.    }.  }..
1ebf0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1ec00 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1ec10 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72  e;.}../*.** pCur
1ec20 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e   points at an in
1ec30 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65  dex entry create
1ec40 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d  d using the OP_M
1ec50 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
1ec60 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f  ..** Read the ro
1ec70 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69  wid (the last fi
1ec80 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72  eld in the recor
1ec90 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  d) and store it 
1eca0 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65  in *rowid..** Re
1ecb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
1ecc0 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
1ecd0 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ks, or an error 
1ece0 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
1ecf0 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74  **.** pCur might
1ed00 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
1ed10 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72  text obtained fr
1ed20 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  om a corrupt dat
1ed30 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53  abase file..** S
1ed40 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61  o the content ca
1ed50 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
1ed60 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65    Do appropriate
1ed70 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63   checks on the c
1ed80 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  ontent..*/.int s
1ed90 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
1eda0 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  id(sqlite3 *db, 
1edb0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1edc0 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69  i64 *rowid){.  i
1edd0 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
1ede0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
1edf0 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
1ee00 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
1ee10 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
1ee20 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
1ee30 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
1ee40 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32  e rowid */.  u32
1ee50 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f   lenRowid;     /
1ee60 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f  * Size of the ro
1ee70 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20  wid */.  Mem m, 
1ee80 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  v;..  /* Get the
1ee90 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
1eea0 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20  ex entry.  Only 
1eeb0 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20  indices entries 
1eec0 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61  of less.  ** tha
1eed0 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f  n 2GiB are suppo
1eee0 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61  rt - anything la
1eef0 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61  rge must be data
1ef00 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1ef10 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70  .  ** Any corrup
1ef20 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
1ef30 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65   in sqlite3Btree
1ef40 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
1ef50 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20  though, so.  ** 
1ef60 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61  this code can sa
1ef70 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74  fely assume that
1ef80 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d   nCellKey is 32-
1ef90 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73  bits  .  */.  as
1efa0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1efb0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
1efc0 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f  pCur) );.  VVA_O
1efd0 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65  NLY(rc =) sqlite
1efe0 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43  3BtreeKeySize(pC
1eff0 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  ur, &nCellKey);.
1f000 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1f010 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f  LITE_OK );     /
1f020 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73  * pCur is always
1f030 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a   valid so KeySiz
1f040 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  e cannot fail */
1f050 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c  .  assert( (nCel
1f060 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41  lKey & SQLITE_MA
1f070 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65  X_U32)==(u64)nCe
1f080 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52  llKey );..  /* R
1f090 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c  ead in the compl
1f0a0 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ete content of t
1f0b0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a  he index entry *
1f0c0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  /.  sqlite3VdbeM
1f0d0 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30  emInit(&m, db, 0
1f0e0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1f0f0 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
1f100 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29  e(pCur, 0, (u32)
1f110 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
1f120 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1f130 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1f140 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ..  /* The index
1f150 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69   entry must begi
1f160 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20  n with a header 
1f170 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29  size */.  (void)
1f180 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  getVarint32((u8*
1f190 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20  )m.z, szHdr);.  
1f1a0 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
1f1b0 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
1f1c0 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a  ( szHdr==m.n );.
1f1d0 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73    if( unlikely(s
1f1e0 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73  zHdr<3 || (int)s
1f1f0 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20  zHdr>m.n) ){.   
1f200 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
1f210 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
1f220 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66  .  /* The last f
1f230 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65  ield of the inde
1f240 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69  x should be an i
1f250 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57  nteger - the ROW
1f260 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20  ID..  ** Verify 
1f270 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e  that the last en
1f280 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e  try really is an
1f290 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28   integer. */.  (
1f2a0 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
1f2b0 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72  ((u8*)&m.z[szHdr
1f2c0 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b  -1], typeRowid);
1f2d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1f2e0 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74  eRowid==1 );.  t
1f2f0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1f300 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63  id==2 );.  testc
1f310 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1f320 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
1f330 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b   typeRowid==4 );
1f340 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
1f350 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74  eRowid==5 );.  t
1f360 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
1f370 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63  id==6 );.  testc
1f380 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
1f390 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  8 );.  testcase(
1f3a0 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b   typeRowid==9 );
1f3b0 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
1f3c0 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74  typeRowid<1 || t
1f3d0 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79  ypeRowid>9 || ty
1f3e0 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20  peRowid==7) ){. 
1f3f0 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
1f400 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
1f410 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73  }.  lenRowid = s
1f420 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1f430 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
1f440 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d);.  testcase( 
1f450 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b  (u32)m.n==szHdr+
1f460 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66  lenRowid );.  if
1f470 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29  ( unlikely((u32)
1f480 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  m.n<szHdr+lenRow
1f490 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  id) ){.    goto 
1f4a0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
1f4b0 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
1f4c0 46 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65  Fetch the intege
1f4d0 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  r off the end of
1f4e0 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72   the index recor
1f4f0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  d */.  sqlite3Vd
1f500 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a  beSerialGet((u8*
1f510 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  )&m.z[m.n-lenRow
1f520 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
1f530 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
1f540 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33  v.u.i;.  sqlite3
1f550 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1f560 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
1f570 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
1f580 6d 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62  mp here if datab
1f590 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
1f5a0 73 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72  s detected after
1f5b0 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a   m has been.  **
1f5c0 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65   allocated.  Fre
1f5d0 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61  e the m object a
1f5e0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
1f5f0 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78  _CORRUPT. */.idx
1f600 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
1f610 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d  n:.  testcase( m
1f620 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a  .szMalloc!=0 );.
1f630 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1f640 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
1f650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1f660 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a  RUPT_BKPT;.}../*
1f670 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
1f680 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78  key of the index
1f690 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
1f6a0 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e  or pC is pointin
1f6b0 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20  g to against.** 
1f6c0 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69  the key string i
1f6d0 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72  n pUnpacked.  Wr
1f6e0 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61  ite into *pRes a
1f6f0 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20   number.** that 
1f700 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  is negative, zer
1f710 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
1f720 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61  f pC is less tha
1f730 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20  n, equal to,.** 
1f740 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1f750 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75  pUnpacked.  Retu
1f760 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
1f770 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
1f780 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68  Unpacked is eith
1f790 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f  er created witho
1f7a0 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73  ut a rowid or is
1f7b0 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68   truncated so th
1f7c0 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74  at it.** omits t
1f7d0 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
1f7e0 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  end.  The rowid 
1f7f0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1f800 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
1f810 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77   is ignored as w
1f820 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69  ell.  Hence, thi
1f830 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63  s routine only c
1f840 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66  ompares the pref
1f850 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20  ixes .** of the 
1f860 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68  keys prior to th
1f870 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e  e final rowid, n
1f880 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  ot the entire ke
1f890 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1f8a0 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
1f8b0 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  re(.  sqlite3 *d
1f8c0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1f8d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1f8e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
1f8f0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
1f900 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
1f910 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1f920 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
1f930 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  inst */.  Unpack
1f940 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63  edRecord *pUnpac
1f950 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e  ked,       /* Un
1f960 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f  packed version o
1f970 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  f key */.  int *
1f980 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  res             
1f990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1f9a0 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  rite the compari
1f9b0 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20  son result here 
1f9c0 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  */.){.  i64 nCel
1f9d0 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
1f9e0 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rc;.  BtCursor *
1f9f0 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73  pCur = pC->pCurs
1fa00 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20  or;.  Mem m;..  
1fa10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1fa20 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
1fa30 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41  d(pCur) );.  VVA
1fa40 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69  _ONLY(rc =) sqli
1fa50 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
1fa60 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
1fa70 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
1fa80 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
1fa90 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79  /* pCur is alway
1faa0 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69  s valid so KeySi
1fab0 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  ze cannot fail *
1fac0 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20  /.  /* nCellKey 
1fad0 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62  will always be b
1fae0 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66  etween 0 and 0xf
1faf0 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20  fffffff because 
1fb00 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
1fb10 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43  that btreeParseC
1fb20 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c  ellPtr() and sql
1fb30 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
1fb40 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
1fb50 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c  d */.  if( nCell
1fb60 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b  Key<=0 || nCellK
1fb70 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b  ey>0x7fffffff ){
1fb80 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20  .    *res = 0;. 
1fb90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fba0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1fbb0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1fbc0 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
1fbd0 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
1fbe0 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
1fbf0 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ee(pC->pCursor, 
1fc00 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
1fc10 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
1fc20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
1fc30 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20   rc;.  }.  *res 
1fc40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
1fc50 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20  ordCompare(m.n, 
1fc60 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b  m.z, pUnpacked);
1fc70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
1fc80 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
1fc90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1fca0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1fcb0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
1fcc0 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74   value to be ret
1fcd0 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75  urned by subsequ
1fce0 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ent calls to.** 
1fcf0 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
1fd00 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  ) on the databas
1fd10 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a  e handle 'db'. .
1fd20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1fd30 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71  dbeSetChanges(sq
1fd40 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
1fd50 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72  Change){.  asser
1fd60 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1fd70 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
1fd80 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67   );.  db->nChang
1fd90 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64  e = nChange;.  d
1fda0 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20  b->nTotalChange 
1fdb0 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  += nChange;.}../
1fdc0 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20  *.** Set a flag 
1fdd0 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75  in the vdbe to u
1fde0 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
1fdf0 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74   counter when it
1fe00 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a   is finalised.**
1fe10 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f   or reset..*/.vo
1fe20 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
1fe30 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20  untChanges(Vdbe 
1fe40 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65  *v){.  v->change
1fe50 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  CntOn = 1;.}../*
1fe60 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70  .** Mark every p
1fe70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
1fe80 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
1fe90 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  h a database con
1fea0 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78  nection.** as ex
1feb0 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  pired..**.** An 
1fec0 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e  expired statemen
1fed0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63  t means that rec
1fee0 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68  ompilation of th
1fef0 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a  e statement is.*
1ff00 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74  * recommend.  St
1ff10 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20  atements expire 
1ff20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70  when things happ
1ff30 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65  en that make the
1ff40 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f  ir.** programs o
1ff50 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69  bsolete.  Removi
1ff60 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ng user-defined 
1ff70 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c  functions or col
1ff80 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
1ff90 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67  ces, or changing
1ffa0 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   an authorizatio
1ffb0 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74  n function are t
1ffc0 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74  he types of.** t
1ffd0 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20  hings that make 
1ffe0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
1fff0 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f  nts obsolete..*/
20000 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
20010 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
20020 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  ments(sqlite3 *d
20030 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
20040 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64   for(p = db->pVd
20050 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  be; p; p=p->pNex
20060 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72  t){.    p->expir
20070 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
20080 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
20090 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
200a0 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
200b0 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73  e..*/.sqlite3 *s
200c0 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62  qlite3VdbeDb(Vdb
200d0 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *v){.  return 
200e0 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  v->db;.}../*.** 
200f0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
20100 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76   to an sqlite3_v
20110 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63  alue structure c
20120 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
20130 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72  lue bound.** par
20140 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56  ameter iVar of V
20150 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20  M v. Except, if 
20160 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20  the value is an 
20170 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e  SQL NULL, return
20180 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20   .** 0 instead. 
20190 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c  Unless it is NUL
201a0 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74  L, apply affinit
201b0 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68  y aff (one of th
201c0 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a  e SQLITE_AFF_*.*
201d0 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20  * constants) to 
201e0 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65  the value before
201f0 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a   returning it..*
20200 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
20210 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20  d value must be 
20220 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
20230 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ler using sqlite
20240 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f  3ValueFree()..*/
20250 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  .sqlite3_value *
20260 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f  sqlite3VdbeGetBo
20270 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76  undValue(Vdbe *v
20280 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61  , int iVar, u8 a
20290 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ff){.  assert( i
202a0 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76  Var>0 );.  if( v
202b0 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65   ){.    Mem *pMe
202c0 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61  m = &v->aVar[iVa
202d0 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d  r-1];.    if( 0=
202e0 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  =(pMem->flags & 
202f0 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20  MEM_Null) ){.   
20300 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
20310 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *pRet = sqlite3
20320 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b  ValueNew(v->db);
20330 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20  .      if( pRet 
20340 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20350 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d  e3VdbeMemCopy((M
20360 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29  em *)pRet, pMem)
20370 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20380 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e  3ValueApplyAffin
20390 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53  ity(pRet, aff, S
203a0 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
203b0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
203c0 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20  n pRet;.    }.  
203d0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
203e0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65  ./*.** Configure
203f0 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56   SQL variable iV
20400 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69  ar so that bindi
20410 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74  ng a new value t
20420 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20  o it signals.** 
20430 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74  to sqlite3_reopt
20440 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d  imize() that re-
20450 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74  preparing the st
20460 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75  atement may resu
20470 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65  lt.** in a bette
20480 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f  r query plan..*/
20490 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
204a0 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65  eSetVarmask(Vdbe
204b0 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a   *v, int iVar){.
204c0 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30    assert( iVar>0
204d0 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33   );.  if( iVar>3
204e0 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d  2 ){.    v->expm
204f0 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66  ask = 0xffffffff
20500 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76  ;.  }else{.    v
20510 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75  ->expmask |= ((u
20520 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29  32)1 << (iVar-1)
20530 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
20540 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
20550 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
20560 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20   Transfer error 
20570 6d 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f  message text fro
20580 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61  m an sqlite3_vta
20590 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20  b.zErrMsg (text 
205a0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d  stored.** in mem
205b0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
205c0 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
205d0 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45  ) into a Vdbe.zE
205e0 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72  rrMsg (text stor
205f0 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20  ed.** in memory 
20600 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
20610 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a  lite3DbMalloc)..
20620 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
20630 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28  tabImportErrmsg(
20640 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  Vdbe *p, sqlite3
20650 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20  _vtab *pVtab){. 
20660 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20670 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->db;.  sqlite3D
20680 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
20690 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
206a0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Msg = sqlite3DbS
206b0 74 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d  trDup(db, pVtab-
206c0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  >zErrMsg);.  sql
206d0 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d  ite3_free(pVtab-
206e0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74  >zErrMsg);.  pVt
206f0 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ab->zErrMsg = 0;
20700 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
20710 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
20720 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66  TABLE */..#ifdef
20730 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
20740 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f  REUPDATE_HOOK../
20750 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
20760 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
20770 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65  ot NULL, release
20780 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73   any allocations
20790 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20   associated .** 
207a0 77 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20  with the memory 
207b0 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e  cells in the p->
207c0 61 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c  aMem[] array. Al
207d0 73 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70 61  so free the Unpa
207e0 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
207f0 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20  ructure itself, 
20800 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  using sqlite3DbF
20810 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ree()..**.** Thi
20820 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
20830 65 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63  ed to free Unpac
20840 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74  kedRecord struct
20850 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ures allocated b
20860 79 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70  y.** the vdbeUnp
20870 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63  ackRecord() func
20880 74 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64  tion found in vd
20890 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74  beapi.c..*/.stat
208a0 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
208b0 55 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33  Unpacked(sqlite3
208c0 20 2a 64 62 2c 20 55 6e 70 61 63 6b 65 64 52 65   *db, UnpackedRe
208d0 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20  cord *p){.  if( 
208e0 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p ){.    int i;.
208f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
20900 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a  ->nField; i++){.
20910 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20        Mem *pMem 
20920 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20  = &p->aMem[i];. 
20930 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a       if( pMem->z
20940 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
20950 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
20960 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mem);.    }.    
20970 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
20980 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
20990 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72  ** Invoke the pr
209a0 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49  e-update hook. I
209b0 66 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44  f this is an UPD
209c0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72  ATE or DELETE pr
209d0 65 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a  e-update call,.*
209e0 2a 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61  * then cursor pa
209f0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
20a00 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  nd argument shou
20a10 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ld point to the 
20a20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20  row about.** to 
20a30 62 65 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c  be update or del
20a40 65 74 65 64 2e 20 49 66 20 74 68 65 20 61 70 70  eted. If the app
20a50 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73  lication calls s
20a60 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
20a70 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72  _old(),.** the r
20a80 65 71 75 69 72 65 64 20 76 61 6c 75 65 20 77 69  equired value wi
20a90 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ll be read from 
20aa0 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73  the row the curs
20ab0 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f  or points to..*/
20ac0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
20ad0 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a  ePreUpdateHook(.
20ae0 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
20af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b00 20 20 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70    /* Vdbe pre-up
20b10 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76  date hook is inv
20b20 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62  oked by */.  Vdb
20b30 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20  eCursor *pCsr,  
20b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b50 43 75 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f  Cursor to grab o
20b60 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d  ld.* values from
20b70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
20b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b90 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
20ba0 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
20bb0 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f  r DELETE */.  co
20bc0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
20bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20be0 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a   Database name *
20bf0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
20c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c10 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20      /* Modified 
20c20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69  table */.  i64 i
20c30 4b 65 79 31 2c 20 20 20 20 20 20 20 20 20 20 20  Key1,           
20c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
20c50 69 74 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20  itial key value 
20c60 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20  */.  int iReg   
20c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c80 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
20c90 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72   for new.* recor
20ca0 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
20cb0 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20  3 *db = v->db;. 
20cc0 20 69 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72   i64 iKey2;.  Pr
20cd0 65 55 70 64 61 74 65 20 70 72 65 75 70 64 61 74  eUpdate preupdat
20ce0 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
20cf0 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e  *zTbl = pTab->zN
20d00 61 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ame;.  static co
20d10 6e 73 74 20 75 38 20 66 61 6b 65 53 6f 72 74 4f  nst u8 fakeSortO
20d20 72 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  rder = 0;..  ass
20d30 65 72 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64  ert( db->pPreUpd
20d40 61 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  ate==0 );.  mems
20d50 65 74 28 26 70 72 65 75 70 64 61 74 65 2c 20 30  et(&preupdate, 0
20d60 2c 20 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61  , sizeof(PreUpda
20d70 74 65 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  te));.  if( op==
20d80 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b  SQLITE_UPDATE ){
20d90 0a 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e  .    iKey2 = v->
20da0 61 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a  aMem[iReg].u.i;.
20db0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4b 65    }else{.    iKe
20dc0 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 7d 0a  y2 = iKey1;.  }.
20dd0 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
20de0 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e  >nField==pTab->n
20df0 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  Col .       || (
20e00 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54  pCsr->nField==pT
20e10 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70  ab->nCol+1 && op
20e20 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  ==SQLITE_DELETE 
20e30 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29  && iReg==-1).  )
20e40 3b 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e 76  ;..  preupdate.v
20e50 20 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61 74   = v;.  preupdat
20e60 65 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a 20  e.pCsr = pCsr;. 
20e70 20 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d 20   preupdate.op = 
20e80 6f 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  op;.  preupdate.
20e90 69 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b 0a  iNewReg = iReg;.
20ea0 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69    preupdate.keyi
20eb0 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70  nfo.db = db;.  p
20ec0 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
20ed0 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  .enc = ENC(db);.
20ee0 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69    preupdate.keyi
20ef0 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 54 61  nfo.nField = pTa
20f00 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70  b->nCol;.  preup
20f10 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f  date.keyinfo.aSo
20f20 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
20f30 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20  fakeSortOrder;. 
20f40 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 31   preupdate.iKey1
20f50 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72 65 75   = iKey1;.  preu
20f60 70 64 61 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b  pdate.iKey2 = iK
20f70 65 79 32 3b 0a 20 20 70 72 65 75 70 64 61 74 65  ey2;.  preupdate
20f80 2e 69 50 4b 65 79 20 3d 20 70 54 61 62 2d 3e 69  .iPKey = pTab->i
20f90 50 4b 65 79 3b 0a 0a 20 20 64 62 2d 3e 70 50 72  PKey;..  db->pPr
20fa0 65 55 70 64 61 74 65 20 3d 20 26 70 72 65 75 70  eUpdate = &preup
20fb0 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65  date;.  db->xPre
20fc0 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64  UpdateCallback(d
20fd0 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67  b->pPreUpdateArg
20fe0 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a  , db, op, zDb, z
20ff0 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79  Tbl, iKey1, iKey
21000 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70  2);.  db->pPreUp
21010 64 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  date = 0;.  sqli
21020 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72  te3DbFree(db, pr
21030 65 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29  eupdate.aRecord)
21040 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61  ;.  vdbeFreeUnpa
21050 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61  cked(db, preupda
21060 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  te.pUnpacked);. 
21070 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65   vdbeFreeUnpacke
21080 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  d(db, preupdate.
21090 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20  pNewUnpacked);. 
210a0 20 69 66 28 20 70 72 65 75 70 64 61 74 65 2e 61   if( preupdate.a
210b0 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  New ){.    int i
210c0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
210d0 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69  <pCsr->nField; i
210e0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
210f0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
21100 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  (&preupdate.aNew
21110 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
21120 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
21130 2c 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  , preupdate.aNew
21140 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
21150 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
21160 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20  _PREUPDATE_HOOK 
21170 2a 2f 0a                                         */.